使用php将URL变量传递给exec()

时间:2010-07-26 21:22:45

标签: php linux ubuntu exec

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

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

我不关心输出,如果它可以在后台执行,那就太棒了。该服务器是一个Ubuntu发行版btw。

这甚至可能吗?如果是这样,那么任何帮助和例子都会受到更多的赞赏。

4 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

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

然后在example.php中执行以下操作:

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

答案 1 :(得分:0)

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

根据脚本的作用,您可以调用lynx来调用附加了get数据的实际页面,并为运行它所需的apikey生成一个哈希值。不确定这是否是一个选项,但它是另一种方式来做你想要的。

希望有所帮助!

答案 2 :(得分: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);

答案 3 :(得分:0)

在@Andrew Waugh评论之前我完全忘记了这个问题(我收到了一封电子邮件提醒)。

无论如何,这个问题源于对使用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;
    }
}