OVH Cloud OVH Cloud

execution d'un script php a distance

3 réponses
Avatar
Nicolas ROBERT
Bonjour,

mon objectif est le suivant : Je veux executer un script php hébergé sur un
site distant (contenant un environnement d'execution php avec apache)
depuis un script php local. Bon jusque là, tout va bien, sauf que je ne peux
pas appeler une URL en HTTP( genre un header ou un getURL en javascript...)
car mon script tourne sous php CLI( c'est peut être une mauvaise raison soit
dit en passant :-) ).

Je fais donc un truc du genre : fopen(http://monsite/toto.php, "r");
j'ai fait le test avec un fichier de test : le fichier toto.php fait un
simple echo.

je récupère une erreur time out:
Warning: fopen(http://monsite/toto.php): failed to open stream: Connection
timed out in /var/path/monscriptLOCAL.php on line <la ligne du fopen>

dans la mesure ou toto.php fait juste un echo, le temp d'execution ne
devrait pas poser de pb. Je ne sais pas trop quoi faire.
Il me semblait que le fopen permettait d'executer...
J'ai regardé dans la documentation php le chapitre sur CURL. Me
conseilleriez-vous de passer par là ?
Je cherche le moyen le plus simple possible, sachant que je n'ai pas
forcément besoin d'avoir un retour sur l'execution de toto.php, cela peut se
faire de manière asynchrone.

J'ai vu des posts sur des forums ou l'on conseillait d'utiliser include,
mais je ne suis pas sûr non plus de la pertinence d'une telle solution.

Cordialement.
nicolas ROBERT.

3 réponses

Avatar
John GALLET
Bonjour,

depuis un script php local. Bon jusque là, tout va bien, sauf que je ne peux
pas appeler une URL en HTTP( genre un header ou un getURL en javascript...)
car mon script tourne sous php CLI( c'est peut être une mauvaise raison soit
dit en passant :-) ).
Lequel tourne en CLI ? Le local ou le distant à appeler ? Si c'est le

local, http://fr2.php.net/manual/en/ref.curl.php si c'est le disant, ça
n'a tout simplement pas de sens, à moins qu'il ne soit à l'écoute sur
une socket (et donc ça reste, en PHP, du bricolage).

Je fais donc un truc du genre : fopen(http://monsite/toto.php, "r");


1) http://fr2.php.net/manual/en/ref.filesystem.php#ini.allow-url-fopen
2) que donne, depuis la machine locale en shell, la commande : telnet
http://monsite/ 80
(dit autrement est-ce que les machines se voient sur le réseau)

Il me semblait que le fopen permettait d'executer...
Y'a plus simple...


J'ai regardé dans la documentation php le chapitre sur CURL. Me
conseilleriez-vous de passer par là ?
Oui.


J'ai vu des posts sur des forums ou l'on conseillait d'utiliser include,
mais je ne suis pas sûr non plus de la pertinence d'une telle solution.


C'est la faille de sécurité spécifique PHP numéro un qui reste dans les
scripts un peu partout, mais dans ton cas le mécanisme est approprié si
tu as confiance/si tu maitrîses le contenu du script distant, attention
néanmoins, si http://monsite/toto.php renvoie du code php valide, il
sera exécuté sur la machine locale (principe même de la faille).

a++;
JG

Avatar
Laurent
Bonjour,



salut


Je fais donc un truc du genre : fopen(http://monsite/toto.php, "r");
j'ai fait le test avec un fichier de test : le fichier toto.php fait un
simple echo.


tu devrais plutôt essayer fopen("http://monsite/toto.php","r");
De rajouter des guillemets, quoi.
Et je rajoute que même si ton fichier fait un simple echo, le fait de
faire un fopen() n'affichera rien, cela ne fait qu'ouvrir une connexion
vers le fichier, après il faut le traiter.


je récupère une erreur time out:
Warning: fopen(http://monsite/toto.php): failed to open stream: Connection
timed out in /var/path/monscriptLOCAL.php on line <la ligne du fopen>

dans la mesure ou toto.php fait juste un echo, le temp d'execution ne
devrait pas poser de pb. Je ne sais pas trop quoi faire.


Ce n'est pas un problème de temps d'exécution ou autre problème lié au
fichier en lui-même à priori, mais bien un problème de connexion. Ce
peut être donc un problème lié à la sécurité de ton serveur, tu peux par
exemple regarder du côté de allow_url_fopen dans ton php.ini : s'il est
à false, tu ne peux pas accéder à un fichier distant...

Il me semblait que le fopen permettait d'executer...
J'ai regardé dans la documentation php le chapitre sur CURL. Me
conseilleriez-vous de passer par là ?


ca revient au même d'une part et ca n'a rien à voir d'autre part :) CURL
est une librairie permettant d'"émuler" une navigation internet, par
exemple passer des variables en post comme si tu avais cliqué sur le
bouton d'un formulaire, et bien d'autres choses.

Je cherche le moyen le plus simple possible, sachant que je n'ai pas
forcément besoin d'avoir un retour sur l'execution de toto.php, cela peut se
faire de manière asynchrone.


pour moi le moyen est le bon


J'ai vu des posts sur des forums ou l'on conseillait d'utiliser include,
mais je ne suis pas sûr non plus de la pertinence d'une telle solution.


Ca ne changera rien... Si le fopen() ne fonctionne pas, le include() ne
fonctionnera pas mieux. Par contre si le but est de faire un simple
echo, le include() sera plus simple que de faire un fopen() et ce qui va
derrière... Mais tu n'en n'es pas encore là :)

Avatar
Jean-Francois Ortolo
Nicolas ROBERT wrote:
Bonjour,

mon objectif est le suivant : Je veux executer un script php hébergé sur un
site distant (contenant un environnement d'execution php avec apache)
depuis un script php local. Bon jusque là, tout va bien, sauf que je ne peux
pas appeler une URL en HTTP( genre un header ou un getURL en javascript...)
car mon script tourne sous php CLI( c'est peut être une mauvaise raison soit
dit en passant :-) ).

<...>


J'ai regardé dans la documentation php le chapitre sur CURL. Me
conseilleriez-vous de passer par là ?


Effectivement

CURL est la réponse à ton problème, que je me suis moi-même posé, et
que j'ai résolu, en pouvant même simuler le downloading d'un fichier
*.csv , que le script PHP que j'appelais par l'intermédiaire de mon
script, donnait à sauvegarder à l'utilisateur ( quand celui-ci
déclenchait le script PHP directement, au lieu de passer par mon script. )

Je recevais le contenu de ce fichier par HTTP donc, directement dans
le contenu de la variable chaîne rendue par la fonction: curl_exec($ch);

Il suffit pour simuler une connexion HTTP, de fixer le bon
paramétrage dans la fonction ( curl_setopt($ch, ...) je crois, plus
sûr... ), après avoir lancé $ch=curl_init(); , puis de lancer
curl_exec($ch); puis curl_close($ch);

...Avec traitement d'erreur ad hoc, bien sûr, comme tout programmeur
qui se respecte.

En fait, avec un bon paramétrage tu peux simuler, que ce soit une
connexion HTTP, ou une connexion FTP, ou je ne sais quoi encore...

Le PHP Manual est ton ami.

Bien à toi.

Jean Francois Ortolo

--
Mon site donne des Statistiques
et des Historiques Graphiques gratuits
sur les Courses de Chevaux du PMU.
http://www.ortolojf-courses.com