fork ou duplication de script php

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : fork ou duplication de script php

par delcedo galaxialord » 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.

par titerm » 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...

par delcedo galaxialord » 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é }

par Invité » 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).

par Invité » 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 ?

par delcedo galaxialord » 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)

par titerm » 24 févr. 2006, 11:56

J'utilise cette commande pour lancer un parser xgml en arrière plan et c'est mon fichier php qui traite la sortie du parser....

Si cela ne marche pas, c'est certainement que tu as une contrainte que tu n'as pas mentionné

par delcedo galaxialord » 23 févr. 2006, 17:11

Non en fait ca ne marche pas...

Vous avez parlé de "compiler", comment s'y prend-on sous debian ? Sachant que j'ai juste fait, à la base, un "apt-get install php5", idem pour mysql et phpmyadmin, j'ai rajouté ensuite "gd" (via la même commande) et le cli aussi.

Merci beaucoup !

par delcedo galaxialord » 18 févr. 2006, 11:41

merci à tous ! et plus particulièrement à titerm :)

proc_open() fait exactement ce que je veux, il n'interrompt pas l'exécution de mon script et lance l'autre. Impecable :)

A bientot :)

par titerm » 16 févr. 2006, 16:01

tu devrais regarder du coté de proc_open(), je pense que cela pourrait répondre a tes besoins...

par rami » 15 févr. 2006, 22:05

Issu de la doc PHP
Installation

Le support du contrôle des processus n'est pas activé par défaut en PHP. Vous devez compiler la version CLI ou CGI de PHP avec l'option de configuration --enable-pcntl pour activer le support de cette extension.

par fab » 15 févr. 2006, 18:02

regarde ce que tu as dans le ./configure du phpinfo()

par delcedo galaxialord » 15 févr. 2006, 17:59

Euh :o j'ai juste fait apt-get install php5cli et j'ai restart le serveur.

par fab » 15 févr. 2006, 17:50

c'est par default ça il me semble

par rami » 15 févr. 2006, 17:48

tu as bien compilé la version CLI avec --enable-pcntl ?