Fork avec exec en 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 avec exec en php

par Ripat » 19 juin 2006, 12:22

Bravo.

Attention cependant à l'exécution, en cli, d'un script PHP. Les modules qui ne sont pas compilés en dur mais chargés dynamiquement risquent de ne pas passer. C'est la raison de l'erreur que tu as postée plus haut.

Solution: voir man php option -c (pour charger un php.ini)

par Maxinfos » 19 juin 2006, 11:45

C'est bon !!!!!
J'ai enfin réussi !!!!

Tout était dans l'exec :

il me fallait : exec("/usr/bin/php monfichier.php > /dev/zero &");

j'avais des messages d'erreurs qui s'affichaient quand j'exécutais mon fichier.php sous le shell ... j'avais vu qu'il fallait un "> /dev/null" pour palier à ce problème ... mais ça ne fonctionnait pas ... j'ai fait par hasard un "man dev null" sur le shell, qui m'a sorti une autre possibilité : "> /dev/zero". J'ai bien évidemment rajouté un & à la fin pour le mettre en background et magie !!!!!!

Merci Ripat pour tes informations supplémentaires ... j'ai pas encore réussit à utiliser les sockets, mais bon, exec lui est actif, autant en profiter !!!!
Je peux donc afficher une page.php qui fait un exec sur une page2.php contenant un sleep(1000); et donc ma page.php est entièrement affichée sans avoir besoin d'attendre que le sleep se finisse !!!!


PROBLEME RESOLU


:pouce:

par Ripat » 19 juin 2006, 11:09

Le script que tu as donné plus haut fonctionne sans problème chez moi sur un serveur linux et apache 2.0.

Essaye peut-être sans le User-Agent.

Les fonctions exec() sont-elles disponibles sur le serveur qui sera en production? Quel OS sur celui-ci.

par Maxinfos » 19 juin 2006, 10:58

Bon, je n'y arrive vraiment pas ](*,)

Mes fichiers sur le serveur sont placés dans :
/var/www/vhosts/mon_nom_de_domaine/httpdocs/exec

Le dossier où est installé php est :
/usr/bin/php

:?: :?: :?: :?: :?:

par Maxinfos » 19 juin 2006, 09:59

En effet :
ERREUR APACHE :
[Mon Jun 19 09:56:20 2006] [error] [client 127.0.0.1] request failed: erroneous characters after protocol string: GET /____FORK/testfork.php HTTP /1.1

ACCESS.log
127.0.0.1 - - [19/Jun/2006:09:56:20 +0200] "GET /____FORK/0.php HTTP/1.1" 200 79
127.0.0.1 - - [19/Jun/2006:09:56:20 +0200] "GET /____FORK/testfork.php HTTP /1.1" 400 402

J'essaye de voir ce que je peux faire ...

par Ripat » 19 juin 2006, 09:44

Vérifie les chemins de fichiers. Tout part du document_root.
$fichier='testfork.php';
Va voir dans ton access.log apache si le GET de testfork.php a été reçu et quelle a été la réponse du serveur.

par Maxinfos » 19 juin 2006, 09:32

Décidément, j'ai vraiment du mal à "forker" ce fichier php ...

En localhost, sur easyphp :

0.php qui lance le fichier testfork.php
<?php

  $fichier='testfork.php';
  $host = 'localhost';

  // ouverture des sockets (un par tâche à exécuter)

    echo "Script <b>$fichier</b> tourne en tâche de fond<br />";
    $fp = fsockopen($host, 80, $errno, $errstr, 10);
    $header  = "GET $fichier HTTP /1.1\r\n";
    $header .= "User-Agent: monScriptPHP\r\n";
    $header .= "Connection: Close\r\n\r\n";
    fputs($fp, $header);
    fclose($fp);

?> 

testfork.php

<?php
// script enfant (p. exple: script_1.php) = = = = = = = =

  ignore_user_abort(true);
  fopen("titi.txt", "x");
?>
Si j'execute mon fichier 0.php, j'ai le echo sur la page mais aucun fichier titi.txt créé.
Si j'execute testfork.php, mon fichier titi.txt est créé.

Emplacement des 2 fichiers : F:\Program Files\EasyPHP1-8\www\____FORK

Si qqun voit le problème ...

par Ripat » 19 juin 2006, 08:58

Dans ce cas, une petite recherche avec "tâche de fond" ou "background" comme mot clé sur notre forum t'aurait révélé ceci:
http://www.phpfrance.com/forums/voir_re ... .php#90972

:wink:

par Maxinfos » 19 juin 2006, 08:55

OUI, c'est exactement ça !!!!!!!!!

par Ripat » 19 juin 2006, 08:50

Si j'ai bien tout suivi, tu cherches simplement à faire tourner un script en arrière-plan pour qu'un utilisateur ne doive pas attendre la fin d'un traitement pour continuer à naviguer.

C'est bien ça?

par Maxinfos » 19 juin 2006, 08:39

Hum ... en fait, mon fork ne fait pas un vraiment fork ...

Pour preuve, si je met un sleep(10) dans le fichier forké, ben je suis obligé d'attendre les 10 secondes pour continuer à executer ma page principale.
Dans ma ligne de commande, j'ai essayé de rajouter un "&" pour lancer en tant que processus, mais ça n'a rien fait ...

Je suis retourné sous unix, pour essayer la commande, et pareil, le fichier n'est pas lancé en tant que processus, il s'execute et se termine au bout de 10 seconde sans rendre la main .. j'ai essayé avec d'autres programmes comme vi, et là ça fonctionne ... peut être à cause des erreurs qui s'affichent à l'execution du fichier php, mais qui n'affectent cependant pas son execution ....



Cannot find module (IP-MIB): At line 0 in (none)
Cannot find module (IF-MIB): At line 0 in (none)
Cannot find module (TCP-MIB): At line 0 in (none)
Cannot find module (UDP-MIB): At line 0 in (none)
Cannot find module (HOST-RESOURCES-MIB): At line 0 in (none)
Cannot find module (SNMPv2-MIB): At line 0 in (none)
Cannot find module (SNMPv2-SMI): At line 0 in (none)
Cannot find module (NOTIFICATION-LOG-MIB): At line 0 in (none)
Cannot find module (UCD-SNMP-MIB): At line 0 in (none)
Cannot find module (UCD-DEMO-MIB): At line 0 in (none)
Cannot find module (SNMP-TARGET-MIB): At line 0 in (none)
Cannot find module (NET-SNMP-AGENT-MIB): At line 0 in (none)
Cannot find module (HOST-RESOURCES-TYPES): At line 0 in (none)
Cannot find module (LM-SENSORS-MIB): At line 0 in (none)
Cannot find module (UCD-DISKIO-MIB): At line 0 in (none)
Cannot find module (IPV6-ICMP-MIB): At line 0 in (none)
Cannot find module (IPV6-MIB): At line 0 in (none)
Cannot find module (IPV6-TCP-MIB): At line 0 in (none)
Cannot find module (IPV6-UDP-MIB): At line 0 in (none)
Cannot find module (SNMP-VIEW-BASED-ACM-MIB): At line 0 in (none)
Cannot find module (SNMP-COMMUNITY-MIB): At line 0 in (none)
Cannot find module (NET-SNMP-EXTEND-MIB): At line 0 in (none)
Cannot find module (UCD-DLMOD-MIB): At line 0 in (none)
Cannot find module (SNMP-FRAMEWORK-MIB): At line 0 in (none)
Cannot find module (SNMP-MPD-MIB): At line 0 in (none)
Cannot find module (SNMP-USER-BASED-SM-MIB): At line 0 in (none)
Cannot find module (SNMP-NOTIFICATION-MIB): At line 0 in (none)
Cannot find module (SNMPv2-TM): At line 0 in (none)


Que puis je faire ? :idea:

par Maxinfos » 17 juin 2006, 15:53

C'est ce que je voulais faire ... mais impossible ... c'est du au fait que j'étais Invité quand j'ai posté le message ... à mon avis, on peut mettre résolu seulement quand on est identifié et qu'on est celui qui a posté le sujet !!!!

par delcedo galaxialord » 17 juin 2006, 15:47

;) pense à mettre résolu sur ton sujet :) (en haut à gauche du titre du topic)

par Maxinfos » 17 juin 2006, 15:23

Mon admin vient de mettre le safe_mod à OFF ...

Je viens de tester mon script ... et ça fonctionne !!!!!

Merci beaucoup delcedo galaxialord, c'est toi qui a trouvé la solution à mon problème.

Pensé aussi à Ultiny qui n'a pas tord, même si mon problème n'était pas là ...

A+

PS : pour trouver le répertoire où est installé php sous unix, placez vous à la racine, puis faites un "which php".

par delcedo galaxialord » 17 juin 2006, 10:50

Salut !

Non en fait, ton fichier est toujours exécuté sur le serveur unix. L'utilisation de ton navigateur (role du client) permet juste de demander au serveur Unix d'exécuter la page et ce dernier redirige les informations à ton navigateur, donc peu importe quel logiciel tu utilises ou quel système d'exploitation tu as, ce qui compte c'est les caractéristiques du serveur.

Je pense donc que le problème vient bien de safe_mod qui doit être à "on", faut attendre la réponse de ton admin ;)