Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Redirections PHP en CLI

19 réponses
Avatar
Jean Francois Ortolo
Bonjour
Voilà, j'ai un site web, pour lequel je voudrais faire des mises à
jour automatiques de mes statistiques, donc un traitement automatique
avec des scripts PHP lancés à partir de scripts Shell lancés
automatiquement à partir de cron.

C'est possible avec mon hébergeur ( OVH ) et mon hébergement (
240Plan ), mais dans ce cas il n'est possible de lancer un script PHP
qu'en mode CLI, c'est-à-dire avec la ligne de commande suivante:

php mon_script.php

Ce mode CLI fait, que les instructions header de redirections type:
header("Location:deuxieme_script.php"); dans le script lancé
, seront ignorées, et donc je ne sais pas par quoi remplacer ces
instructions.

Ma première question est donc: Qu'est-ce que je met à la place des
instructions header de redirection ?

Ma deuxième question est:
1- Lors du lancement d'un script PHP dans un script Shell, avec une
commande telle que:
php mon_script.php
comment spécifier des paramètres de manière à ce qu'ils soient
interprétables comme des requêtes GET ?

2- Même chose, comment spécifier des paramètres interprétables comme
des requêtes GET, à un script redirigé à partir d'un autre script PHP
lancé de la manière précédente ?

Merci beaucoup beaucoup de vos réponses.

Jean Francois Ortolo

--
Visitez mon Site entièrement gratuit
donnant des Statistiques et des Historiques Graphiques
sur les Courses de Chevaux:
http://www.ortolojf-courses.com

10 réponses

1 2
Avatar
Pozzo
Jean Francois Ortolo wrote:
Bonjour
Voilà, j'ai un site web, pour lequel je voudrais faire des mises à
jour automatiques de mes statistiques, donc un traitement automatique
avec des scripts PHP lancés à partir de scripts Shell lancés
automatiquement à partir de cron.


Je ne suis pas sûr que PHP soit le langage le plus adapté dans ce
contexte... voyez plutot Perl à mon avis

--
Pozzo - Qui adore PHP pourtant

Avatar
John Gallet
Bonjour,

Ce mode CLI fait, que les instructions header de redirections type:
header("Location:deuxieme_script.php"); dans le script lancé
, seront ignorées, et donc je ne sais pas par quoi remplacer ces
instructions.


Depuis le temps qu'on vous répète qu'il ne faut pas porc-grammer comme
ça...

Ma première question est donc: Qu'est-ce que je met à la place des
instructions header de redirection ?
Lisez la FAQ, ou les archives de ce forum.


1- Lors du lancement d'un script PHP dans un script Shell, avec une
commande telle que:
php mon_script.php
comment spécifier des paramètres de manière à ce qu'ils soient
interprétables comme des requêtes GET ?


Je ne l'ai pas testé mais ça devrait fonctionner : enrobez en appelant
php mon_wrapper.php
et dans mon_wrapper.php:
<?php
$_REQUEST['nom_var1']=valeur1;
$_REQUEST['nom_var2']=valeur2;
etc...
?>

Sinon, je vu qu'il s'agit seulement d'appeler des scripts, j'utiliserais
non pas perl comme suggéré, mais tout simplement wget. En revanche,
attention dans ce cas au set_time_limit qui s'appliquera.

2- Même chose, comment spécifier des paramètres interprétables comme
des requêtes GET, à un script redirigé à partir d'un autre script PHP
lancé de la manière précédente ?
Je n'ai pas compris qui redirigait quoi ?


a++
JG

Avatar
Jean Francois Ortolo
Bonjour Monsieur
Voir mes réponses et questions en commentaire ci-dessous.

Bien à vous.

Jean Francois Ortolo

John Gallet wrote:
Bonjour,


Ce mode CLI fait, que les instructions header de redirections type:
header("Location:deuxieme_script.php"); dans le script lancé
, seront ignorées, et donc je ne sais pas par quoi remplacer ces
instructions.



Depuis le temps qu'on vous répète qu'il ne faut pas porc-grammer comme
ça...



J'avoue que pour mes scripts PHP en mode normal CGI, j'ai toujours
entendu dire, que la seule façon de pouvoir faire entrer l'exécution de
chaque script dans le temps maximum d'exécution, était de passer d'un
script PHP à l'autre, en faisant ces redirections avec des instructions
header(" ");


Ma première question est donc: Qu'est-ce que je met à la place des
instructions header de redirection ?


Lisez la FAQ, ou les archives de ce forum.




Bon, il va falloir que je supprime, puis recrée ce newsgroup dans ma
liste.

1- Lors du lancement d'un script PHP dans un script Shell, avec une
commande telle que:
php mon_script.php
comment spécifier des paramètres de manière à ce qu'ils soient
interprétables comme des requêtes GET ?



Je ne l'ai pas testé mais ça devrait fonctionner : enrobez en appelant
php mon_wrapper.php
et dans mon_wrapper.php:
<?php
$_REQUEST['nom_var1']=valeur1;
$_REQUEST['nom_var2']=valeur2;
etc...
?>



Bon, ok.
Je vois bien que le wrapper mon_wrapper.php, devra être appelé à
partir de la ligne de commande, avec la commande suivante:
/usr/local/bin/php mon_wrapper.php valeur1 valeur2

...Et dans le wrapper, ces valeurs devront être interprétées à partir
des valeurs des variables $argc et $argv[] , elles-mêmes lues
probablement, à partir des variables $_GLOBAL['argc'] , et $_GLOBAL['argv']

Ce que je ne comprend pas dans votre wrapper, c'est comment il
appelle le script PHP désiré, de façon à ce que les valeurs soient
interprétables par ce script final, comme des variables $_GET

Après tout, faire dans le wrapper:
$_REQUEST['nom_var1'] = $valeur1;
$_REQUEST['nom_var2'] = $valeur2;

Celà n'affecte la variable $_REQUEST que dans l'environnement du
wrapper mon_wrapper.php , pas dans celui du script PHP appelé ensuite ?

Sinon, pourriez-vous me le dire ?


Sinon, je vu qu'il s'agit seulement d'appeler des scripts, j'utiliserais
non pas perl comme suggéré, mais tout simplement wget. En revanche,
attention dans ce cas au set_time_limit qui s'appliquera.



J'ai lu dans le PHP Manual, que le temps d'exécution maximum en mode
CLI, n'était pas limité.


2- Même chose, comment spécifier des paramètres interprétables comme
des requêtes GET, à un script redirigé à partir d'un autre script PHP
lancé de la manière précédente ?


Je n'ai pas compris qui redirigait quoi ?



Un premier script PHP a été lancé en mode CLI, c'est-à-dire à partir
de la ligne de commande:
/usr/local/bin/php premier_script.php

Ce premier script premier_script.php doit lancer un deuxième script,
donc le premier script est redirigé vers le deuxième script, qui est
lancé par dessus le premier script.

Si possible, le premier script devrait pouvoir s'arrêter juste après
avoir lancé le deuxième script, mais ce n'est pas une obligation
théoriquement, car le temps d'exécution maximum en mode CLI, n'est pas
limité.

Le problème est que le premier script a calculé des paramètres qu'il
doit transmettre au deuxième script, de manière à ce que ces paramètres
soient interprétables par le second script PHP, comme des paramètres _GET

Vous me dites qu'il est possible de spécifier ces paramètres en mode
_GET, en faisant, dans le premier script:
$_REQUEST['nom_value1'] = $valeur1;
$_REQUEST['nom_value2'] = $valeur2;

de façon à ce que ces variables soient visibles dasn le deuxième
script comme des variables dont les valeurs sont dans:
$_GET['nom_value1'] , $_GET['nom_value2']

Merci beaucoup de me dire si cette méthode fonctionne effectivement,
c'est-à-dire si l'environnement des variables $_REQUEST[' '] est bien
transmis du premier script appelant au deuxième script appelé.

Merci beaucoup de vos réponses.

Jean Francois Ortolo

--
Visitez mon Site entièrement gratuit
donnant des Statistiques et des Historiques Graphiques
sur les Courses de Chevaux:
http://www.ortolojf-courses.com


Avatar
Jean Francois Ortolo
Pozzo wrote:

Je ne suis pas sûr que PHP soit le langage le plus adapté dans ce
contexte... voyez plutot Perl à mon avis



Bonjour
Tout ce que je demande, c'est comment lancer un second script PHP à
partir d'un premier script PHP, avec ses paramètres. Cà doit pas être
sorcier, tout de même.

Je ne vais pas refaire ma quinzaine de scripts PHP, chacun avec en
moyenne 2000 lignes de code, simplement pour m'éviter de faire ces
redirections, qui sont certainement possibles par ailleurs.

Bien à vous.

Jean Francois Ortolo

--
Visitez mon Site entièrement gratuit
donnant des Statistiques et des Historiques Graphiques
sur les Courses de Chevaux:
http://www.ortolojf-courses.com

Avatar
John Gallet
Re,

J'avoue que pour mes scripts PHP en mode normal CGI, j'ai toujours
entendu dire, que la seule façon de pouvoir faire entrer l'exécution de
chaque script dans le temps maximum d'exécution, était de passer d'un
script PHP à l'autre, en faisant ces redirections avec des instructions
header(" ");


Le time out classique est 30 secondes. Sous unix, c'est 30 secondes de
temps CPU. Les temps d'attente ne sont donc pas comptés. Donc sauf des
requêtes vraiment très gourmandes, il n'y a pas de raisons, dans une
navigation classique d'internaute, de faire ce genre de choses, sauf à
contourner un time out de navigateur (2 minutes de mémoire poru al
plupart des cas... l'internaute va vraiment s'emmer...er).

Ensuite, si le but est, parce que c'est incontournable, de contourner
ledit time_limit, il y a deux grands types de solutions :

- si on a la main sur php.ini, désactiver le safe_mode et utiliser
set_time_limit() en début du script de plus haut niveau.
- sinon on peut en effet relancer artificiellement un script depuis un
autre avec header location.


Lisez la FAQ, ou les archives de ce forum.
Bon, il va falloir que je supprime, puis recrée ce newsgroup dans ma

liste.
Meuh non, pas la peine :

http://groups.google.com/groups?as_ugroup=fr.comp.lang.php

Je vois bien que le wrapper mon_wrapper.php, devra être appelé à
partir de la ligne de commande, avec la commande suivante:
/usr/local/bin/php mon_wrapper.php valeur1 valeur2


Oui.

Celà n'affecte la variable $_REQUEST que dans l'environnement du
wrapper mon_wrapper.php , pas dans celui du script PHP appelé ensuite ?
Sinon, pourriez-vous me le dire ?


Oui bien sûr j'ai tout simplement oublié la ligne 'kivabien' :
require('mon_script.php'); et immédiatement dans mon_script.php, les
valeurs affectées à $_REQUEST[] dans mon_wrapper.php seront visibles.
Attention néanmoins à un détail : si vous avez utilisé $_GET dans
mon_script.php, affectez plutôt ce tableau que $_REQUEST, je ne garantis
pas que dans ce cas assez tordu ces deux tableaux soient vraiment des
pointeurs l'un vers l'autre, on est clairement dans une bidouille.

Sinon, je vu qu'il s'agit seulement d'appeler des scripts, j'utiliserais
non pas perl comme suggéré, mais tout simplement wget. En revanche,
attention dans ce cas au set_time_limit qui s'appliquera.
J'ai lu dans le PHP Manual, que le temps d'exécution maximum en mode

CLI, n'était pas limité.


Tout à fait, et c'est bien ce que je soulignais : si vous utilisez wget,
c'est comme appeler la page depuis un navigateur donc wget est soumis au
time_limit. Donc ce conseil que je donne n'est pas nécessairement
applicable dans votre cas précis.

Le problème est que le premier script a calculé des paramètres qu'il
doit transmettre au deuxième script, de manière à ce que ces paramètres
soient interprétables par le second script PHP, comme des paramètres _GET
Merci beaucoup de me dire si cette méthode fonctionne effectivement,
c'est-à-dire si l'environnement des variables $_REQUEST[' '] est bien
transmis du premier script appelant au deuxième script appelé.


Si vous utilisez header location, je doute fort que php CLI exécute le
script vers lequel il est redirigé. A vérifier, je n'ai jamais essayé.
Si vous utilisez un wget-like, peut-être.

Si vous remplacez votre header location toto.php par
include('toto.php'); exit(); alors vous ne vous poserez la question de
savoir s'il est nécessaire de l'appeler en ligne de commande que s'il
est arrêté en time out.

HTH

JG


Avatar
Sebastian Lauwers
Jean Francois Ortolo wrote:
Pozzo wrote:


Je ne suis pas sûr que PHP soit le langage le plus adapté dans ce
contexte... voyez plutot Perl à mon avis



Il est vrai que le perl aurait été une bonne décision, mais il me semble
que le code est déjà fait, refaire le tout serait donc un travail de
titan. (Bon non, pas de titan, mais vous comprenez...)




Bonjour


Bonjour à vous,

Tout ce que je demande, c'est comment lancer un second script PHP à
partir d'un premier script PHP, avec ses paramètres. Cà doit pas être
sorcier, tout de même.


non en effet, la fonction system() devrait vous aider:

http://fr.php.net/manual/fr/function.system.php


Je ne vais pas refaire ma quinzaine de scripts PHP, chacun avec en
moyenne 2000 lignes de code, simplement pour m'éviter de faire ces
redirections, qui sont certainement possibles par ailleurs.


Il me semblait donc correctement.


Bien à vous.


En espérant que cela vous aide,


Jean Francois Ortolo



Amicalement,
Sebastian


--
The most likely way for the world to be destroyed,
most experts agree, is by accident.
That's where we come in; we're computer professionals.
We cause accidents.
--Nathaniel Borenstein


Avatar
ED
Jean Francois Ortolo wrote:
J'avoue que pour mes scripts PHP en mode normal CGI, j'ai toujours
entendu dire, que la seule façon de pouvoir faire entrer l'exécution de
chaque script dans le temps maximum d'exécution, était de passer d'un
script PHP à l'autre,


Donc si j'ai bien compris tu essayes de contourner les restrictions que
te met volontairement ton hébergeurs pour que tu ne consommes pas trop
de ressources ?
Es tu sûr que ça ne rentre pas dans ce que l'hébergeur pourrait
qualifier d'abus ?

Ceci dit en général le temps d'exécution n'est pas limité par défaut sur
le mode CLI. Tu n'as probablement même pas besoin de tout ça. Si tu en
as besoin c'est que l'hébergeur a volontairement mis la limite. Ce n'est
probablement pas pour te voir utiliser des artifices et la contourner.

en faisant ces redirections avec des instructions header(" ");


Sauf qu'il faut un minimum comprendre comment ça marche. Header() c'est
pour envoyer une entête HTTP au navigateur. Quand tu envoies l'entête
"Location" PHP le remarque tout seul et renvoie au navigateur un code de
retour 302. Ce code de retour est connu par le navigateur, le navigateur
sait qu'il est redirigé temporairement vers la page dont l'adresse est
dans l'entête "Location".

Maintenant dans le modèle CLI, le cron se contente d'exécuter PHP et de
logguer tout ce qui est affiché, sans l'interpréter. Que veux tu qu'il
se passe ? Il n'y a aucun navigateur pour faire une nouvelle requête
vers la nouvelle page, il n'y a même pas de protocole HTTP pour envoyer
des entêtes.

Ma première question est donc: Qu'est-ce que je met à la place des
instructions header de redirection ?




Rien ?
Autres solutions :
- tu demandes à ton hébergeur de t'allouer plus de temps dans les
scripts CLI
- tu gères mieux ton script pour descendre sous les 30s
- tu fais plusieurs entrées dans ton cron pour lancer plusieurs scripts
(ou plusieurs fois le même) et obtenir un comportement similaire à ce
que tu avais dans les redirections (sauf qu'elles seront programmées à
l'avance). Ceci dit je doute que ton hébergeur voit ça d'un bon oeil
s'il a refusé de t'allouer plus de temps et que la limitation est
volontaire de sa part.

Bon, il va falloir que je supprime, puis recrée ce newsgroup dans ma
liste.


??

1- Lors du lancement d'un script PHP dans un script Shell, avec une
commande telle que:
php mon_script.php
comment spécifier des paramètres de manière à ce qu'ils soient
interprétables comme des requêtes GET ?




Pourquoi votre script CLI va t'il chercher des paramètres HTTP ? C'est
là qu'est le problème fondamental (et pas sur comment les envoyer).

Celà n'affecte la variable $_REQUEST que dans l'environnement du
wrapper mon_wrapper.php , pas dans celui du script PHP appelé ensuite ?


Non, ça affecte la variable globale $_REQUEST. Lors d'un include() ou
require() les variables d'espace global sont héritées.



Si possible, le premier script devrait pouvoir s'arrêter juste après
avoir lancé le deuxième script, mais ce n'est pas une obligation
théoriquement, car le temps d'exécution maximum en mode CLI, n'est pas
limité.


Si c'est le cas, pourquoi lancer une deuxième exécution et ne pas faire
un bête include() ?

--
Eric Daspet



Avatar
Jean Francois Ortolo
Bonsoir Monsieur
Mon problème est résolu avec la commande suivante:

/usr/bin/wget -r -l 0 -Q 0 -T 0 --delete-after
mon_script.php?param1=$param1&param2=$param2

Les paramètres à ce wget, sont respectivement pour permettre les
accès récursifs sans limite, et sans limite de temps de chargement.

La paramètre --delete-after est pour supprimer les fichiers
téléchargés dans le répertoire correspondant au domaine cible.

Cà marche très bien, l'ensemble de mes statistiques ce soir a été mis
à jour en un tout petit peu plus de 30 secondes, résultat parfait sans
aucune modification de mes scripts PHP.

Problème résolu.

Il ne me reste plus qu'à générer au lieu d'une page HTML, un script
PHP gérant la variable $_SERVER['HTTP_REFERER'] pour authentification.

Merci beaucoup à vous pour votre aide.

Bien à vous.

Jean Francois Ortolo

--
Visitez mon Site entièrement gratuit
donnant des Statistiques et des Historiques Graphiques
sur les Courses de Chevaux:
http://www.ortolojf-courses.com
Avatar
Jean Francois Ortolo
Bonjour Monsieur

John Gallet wrote:
Re,

Je vois bien que le wrapper mon_wrapper.php, devra être appelé à
partir de la ligne de commande, avec la commande suivante:
/usr/local/bin/php mon_wrapper.php valeur1 valeur2



Oui.


Celà n'affecte la variable $_REQUEST que dans l'environnement du
wrapper mon_wrapper.php , pas dans celui du script PHP appelé ensuite ?
Sinon, pourriez-vous me le dire ?



Oui bien sûr j'ai tout simplement oublié la ligne 'kivabien' :
require('mon_script.php'); et immédiatement dans mon_script.php, les
valeurs affectées à $_REQUEST[] dans mon_wrapper.php seront visibles.
Attention néanmoins à un détail : si vous avez utilisé $_GET dans
mon_script.php, affectez plutôt ce tableau que $_REQUEST, je ne garantis
pas que dans ce cas assez tordu ces deux tableaux soient vraiment des
pointeurs l'un vers l'autre, on est clairement dans une bidouille.




Génial
Seulement deux choses:
1- Est-ce que l'instruction require("mon_script.php"); peut être
appelée après qu'il y ait eu d'autres instructions PHP avant ?

2- L'instruction
require("mon_script.php?param1=$param1&param2=$param2"); est-elle valide
, c'est-à-dire avec ce type de passage de paramètres, et entre
guillemets " " au lieu de entre quotes ' ' , pour lequel les valeurs
$param1 et $param2 ne seraient pas substituées ?

Celà pourrait être une alternative au fait d'affecter des valeurs aux
variables d'environnement $_GET['param1'] et $_GET['param2'] avant le
require ?

Merci beaucoup beaucoup de vos réponses.

Bien à vous.

Jean Francois Ortolo

--
Visitez mon Site entièrement gratuit
donnant des Statistiques et des Historiques Graphiques
sur les Courses de Chevaux:
http://www.ortolojf-courses.com


Avatar
Jean Francois Ortolo
John Gallet wrote:

Tout à fait, et c'est bien ce que je soulignais : si vous utilisez wget,
c'est comme appeler la page depuis un navigateur donc wget est soumis au
time_limit. Donc ce conseil que je donne n'est pas nécessairement
applicable dans votre cas précis.



Ok
Donc, appeler un script PHP depuis la ligne de commande d'un script
Shell de cette manière:

wget mon_script.php?param1=$param1&param2=$param2

Celà devrait être possible, et celà devrait lancer le script
mon_script.php en mode CGI, puisque la commande wget est l'équivalent
d'un navigateur ?

De cette façon, il n'y aurait rien besoin de changer dans mes script
PHP, simplement au lieu de les lancer en mode CLI, je les lance en mode
CGI, pas de problèmes à ce moment-là ?

Merci beaucoup pour votre réponse.

Bien à vous.

Jean Francois Ortolo

--
Visitez mon Site entièrement gratuit
donnant des Statistiques et des Historiques Graphiques
sur les Courses de Chevaux:
http://www.ortolojf-courses.com

1 2