2010-07-26 157 views
1

我有一台专用的服务器,用于处理大量数据。我现在拥有它的方式,我可以打开一个像example.php?ex_pid=123这样的进程ID的脚本,然后放手。它下载一小部分数据,对其进行处理,然后将其上传到数据库中,然后重新开始。将URL变量传递给exec()with php

理想情况下,我想直接调用example.php?ex_pid=123,而不是将变量传递给example.php,如exec('./example.php'.' '.EscapeShellArg($variable));,以防止它在全局范围内运行。

我不在乎输出,如果它可以在后台执行,这将是辉煌的。该服务器是一个Ubuntu分布btw。

这甚至可能吗?如果是这样,任何帮助和例子将更多的赞赏。

回答

0

与此相关的主要问题是?ex_pid是通常与包含文件或通过浏览器访问文件相关的GET数据。如果您包含文件或从Web浏览器访问文件,这将是微不足道的,但将其作为CLI运行它,您的唯一选择是将其作为参数传递,不幸的是。你可以将它作为ex_pid = 123传递,只是解析这些数据,但它仍然需要作为参数传递,但这样做可以使用parse_str()来解析它。

根据脚本的作用,可以调用lynx调用带有附加get数据的实际页面,并生成运行所需的api所需的散列值。不知道这是否是一种选择,但它是另一种方式来实现它的方式。

希望有帮助!

1

你可以这样做:

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

然后在使用example.php做这样的事情:

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

这是一个非常糟糕的方式来做到这一点。首先,它是escapeshellarg()而不是'addslashes()'。 – Christian 2011-04-11 09:42:32

0

我有这个一个真正的问题,不能得到它的工作运行类似example.php?variable = 1的东西。

但是我可以使用exec命令获得一个单独的文件,最后没有?variable = 1。

我决定做的是根据我想发送的变量动态更改模板文件的内容。这个文件被称为template.php,并包含所有通常以$ _GET运行的代码。而不是使用$ _GET,将变量的值设置在顶部。这行代码然后被搜索并替换为您选择的任何值。

然后我保存了这个新文件并运行它。

在以下示例中,我需要更改SQL查询 - 模板文件的行$ sql =“ENTER SQL CODE HERE”;.我还需要更改顶部变量的值。 template.php中的行是$ myvar = 999999;下面的代码将template.php中的这些行更改为新值。

//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

在这么多层面上,这是错误的,我甚至无法开始争论...... – Christian 2011-04-11 09:43:25

0

我已经完全忘记了这个问题,直到@Andrew沃对它发表了评论(我收到一封电子邮件提醒)。

无论如何,这个问题源于对使用CLI时$ argv数组如何传递给脚本的误解。您可以根据需要使用尽可能多的参数。我现在的做法是这样的:

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; 
    } 
}