2010-07-26 6 views
1

J'ai un serveur dédié que j'utilise pour croquer beaucoup de données. La façon dont je l'ai maintenant, je peux ouvrir un script avec un ID de processus comme example.php?ex_pid=123 et laissez-le aller. Il télécharge une petite partie des données, les traite, puis les télécharge dans une base de données puis recommence.passer des variables d'URL à exec() avec php

Idéalement, je voudrais appeler directement example.php?ex_pid=123 et non en passant une variable à example.php comme exec('./example.php'.' '.EscapeShellArg($variable)); pour l'empêcher d'agir globalement.

Je ne me soucie pas de la sortie, si elle pouvait s'exécuter en arrière-plan, ce serait génial. Le serveur est une distribution Ubuntu btw.

Est-ce encore possible? Si oui, toute aide et exemples seraient plus appréciés.

Répondre

0

Le problème principal avec cela est que? Ex_pid est une donnée GET qui est généralement associée à l'inclusion du fichier ou à son accès via un navigateur. Si vous incluez le fichier ou y accédez à partir d'un navigateur Web, ce serait trivial, mais en l'exécutant comme CLI, votre seule option serait de le passer en argument, malheureusement. Vous pouvez le passer comme ex_pid = 123 et juste analyser ces données, mais il devrait toujours être passé en argument, mais en faisant cela, vous pouvez utiliser parse_str() pour l'analyser. En fonction de ce que fait le script, vous pouvez appeler lynx pour appeler la page réelle avec les données get attachées et générer un hachage pour un démarrage requis pour le faire fonctionner. Je ne sais pas si c'est une option, mais c'est une autre façon de le faire comme vous voulez.

Espérons que ça aide!

1

Vous pouvez faire quelque chose comme:

exec("./example.php '".addslashes(serialize($_GET))."'); 

Et puis à example.php faire quelque chose comme ceci:

count($_GET) == 0 && $_GET = unserialize(stripslashes($_SERVER['argv'][1])) 
+1

C'est une manière terriblement hacky de le faire. D'une part, c'est 'escapeshellarg()' pas 'addslashes()'. – Christian

0

J'ai eu un vrai problème avec cela et ne pouvais pas le faire fonctionner exécuter quelque chose comme exemple.php? variable = 1.

Je pourrais cependant obtenir un fichier individuel à exécuter en utilisant la commande exec, sans le? Variable = 1 à la fin.

Ce que j'ai décidé de faire était de changer dynamiquement le contenu d'un fichier modèle, en fonction des variables que je voulais envoyer. Ce fichier s'appelle template.php et contient tout le code que vous exécuterez normalement en $ _GET. Au lieu d'utiliser $ _GET, définissez la valeur de la variable directement en haut. Cette ligne de code est ensuite recherchée et remplacée par n'importe quelle valeur que vous choisissez. J'ai ensuite enregistré ce nouveau fichier et l'ai exécuté à la place.

Dans l'exemple suivant, je devais modifier une requête SQL - le fichier modèle a la ligne $ sql = "ENTRER CODE SQL ICI" ;. J'avais aussi besoin de changer la valeur d'une variable a en haut. La ligne dans template.php est $ myvar = 999999; Le code ci-dessous modifie ces lignes dans template.php aux nouvelles valeurs.

//Get the base file to modify - template.php 
$contents=file_get_contents("template.php"); 
$sql="SELECT * FROM mytable WHERE foo='".$bar."'"; 

$contents=str_replace("ENTER SQL CODE HERE",$sql,$contents); 
//Another search 
$contents=str_replace("999999",$bar,$contents); 

$filename="run_standalone_code".$bar.".php"; 

//If the file doesnt't exist, create it 
if(!file_exists($filename)){ 
file_put_contents($filename, $contents); 
} 

//Now run this file 
$cmd="/usr/local/bin/php ".$filename." >/dev/null &"; 
exec($cmd); 
+2

C'est tellement faux sur tant de niveaux que je ne peux même pas commencer à discuter à ce sujet ... – Christian

0

Je l'avais complètement oublié cette question jusqu'à ce que Waugh a commenté @ Andrew (et j'ai reçu un rappel par courrier électronique).

Quoi qu'il en soit, cette question provient d'un malentendu sur la façon dont le tableau $ argv est communiqué au script lors de l'utilisation de CLI. Vous pouvez utiliser à peu près autant d'arguments que nécessaire.La façon dont j'accomplis cela maintenant est comme:

if (isset($argv)) { 
    switch ($argv[1]) { 
     case "a_distinguishing_name_goes_here": 
      $pid = $argv[2]; 
      sample_function($pid); 
      break; 
     case "another_name_goes_here": 
      do_something_else($argv[2]); 
      break; 
    } 
} 
Questions connexes