fork ou duplication de script php

Eléphant du PHP | 153 Messages

24 févr. 2006, 23:17

Voici très exactement mon code :
<?php
require "pkg.php";
if(isset($_GET['robot']))
{
	while(!file_exists("stop_relance.txt")){
		$bd->lock(); // pour garantir l'exclusion mutuelle et éviter d'avoir une infinité de processus sur le serveur
		if($site = $bd->exec("SELECT * FROM site WHERE etat < 3 ORDER BY etat DESC LIMIT 0,1"))
		{
			$bd->unlock();
			lance_moteur();
			sleep(5); // permet au sous processus de poser le verrou
		}
		else
		{
			echo "<b>Plus de site trouvé</b>";
			exit(0); // sinon peu probable (plus de site à indexer trouvé dans la base)
		}
	}
}
else
{
	$bd->lock();
	$site = $bd->exec("SELECT * FROM site WHERE etat < 3 ORDER BY etat DESC LIMIT 0,1");
	$site = $site[1];
	if($site)
		$ls = new LecteurSite($bd,$site['url'],$site['etat']);
	$bd->unlock();
}

function lance_moteur()
{
	$descriptorspec = array(
	   0 => array("pipe", "r"),  // // stdin est un pipe où le processus va lire
	   1 => array("pipe", "w"),  // stdout est un pipe où le processus va écrire
	   2 => array("file", "erreur_relance.txt", "w") // stderr est un fichier
	);
	$cwd = './';
	$env = NULL;

	$process = proc_open('php relance.php', $descriptorspec, $pipes, $cwd, $env);
}

?>
Le problème à l'air de venir de la fonction lance_moteur(), sinon je ne crois pas avoir de problème avec mes autres fonctions.

$bd est une instance d'une classe maison, gérant mysql, et sinon le but de tout le site est de proposé un service de recherche d'images (comme google mais en incluant les avis des utilisateurs) (un petit coup de pub lol)
http://gl2.delcedo.com/ Galaxialord 2 !

Invité
Invité n'ayant pas de compte PHPfrance

25 févr. 2006, 00:05

Il n'y a aucune trace de communication entre pere et fils la dedans ...
Quel est le code de relance.php ?

Invité
Invité n'ayant pas de compte PHPfrance

25 févr. 2006, 00:32

oups ! un oubli de ma part ! le code que j'ai présenté est le code du fichier relance.php

donc lorsque relance.php est appelé, on se trouve dans la partie du else { }

(et au lancement du script on est dans le premier if(){ } car robot a une valeur quelconque).

Eléphant du PHP | 153 Messages

25 févr. 2006, 00:32

oups ! un oubli de ma part ! le code que j'ai présenté est le code du fichier relance.php

donc lorsque relance.php est appelé, on se trouve dans la partie du else { }

(et au lancement du script on est dans le premier if(){ } car robot a une valeur quelconque).

{edit : bug de phpbb ! il a fait un doublon, supprimez le post invité }

Mammouth du PHP | 505 Messages

25 févr. 2006, 01:50

C'est pas très propre tout ca...
Deja faudrais que lance moteur retourne $process

Ensuite faudrais faire un proc_close() dans le pere
Le pere devrait avoir acces a $pipes afin de pouvoir lire 1 & 2 le cas échéant... Savoir ce que dit le fils est peut etre interessant non ?
Fermer les descripteurs dont tu n'as pas besoin dans le pere et le fils...

Eléphant du PHP | 153 Messages

25 févr. 2006, 12:09

Salut, merci de m'aider :)

normalement je n'ai pas besoin de fermer le processus (le processus fils est sensé cracher tout seul (buffer trop gros))

sinon
function lance_moteur()
{
    $descriptorspec = array(
       0 => array("pipe", "r"),  // // stdin est un pipe où le processus va lire
       1 => array("pipe", "w"),  // stdout est un pipe où le processus va écrire
       2 => array("file", "erreur_relance.txt", "w") // stderr est un fichier
    );
    $cwd = './';
    $env = NULL;

    $process = proc_open('php relance.php', $descriptorspec, $pipes, $cwd, $env);
} 
est essentiellement un copier coller de l'exemple de la doc.

Le père n'a pas besoin de lire les sorties du fils et n'a pas besoin d'envoyer des messages au fils. Il doit uniquement lancer le processus fils qui se débrouille tout seul.
http://gl2.delcedo.com/ Galaxialord 2 !