PHP在传递变量的同时执行外部脚本而无需等待

时间:2011-07-16 22:03:51

标签: php shell

我正在为我的用户创建一个函数,他们可以上传大型XML文件以与我的数据库同步。

当用户将文件上传到upload.php时,我想开始使用process.php在后​​台处理数据,最好是从shell命令处理,并将用户重定向到status.php,它显示了同步的过程。

我需要在执行时将一些变量传递给process.php脚本,或者至少一个带有用户ID的变量,并将其他变量放入文本文件中,(可能更喜欢这样,所以我不需要将大量数据放入exec()命令。)或用户ID和一堆$_POST变量。

我想到的一个解决方案正在执行这样的PHP脚本:

exec("php -f ./process.php > /dev/null 2>/dev/null &"); 

这允许我从http访问中锁定process.php,这很好,因为它是一个获取脚本的进程。我在这里唯一需要的是以某种方式传递变量,但我不知道该怎么做。

所以我的主要问题是:

如何在上述解决方案中传递变量?

或者你们中有谁有更好的解决方案吗?可能是我无法通过exec()的地方?请记住,我不希望用户等待脚本执行,我需要传递至少一个变量。

更新:为了将来参考,请记住在通过exec()或类似函数传递参数时使用escapeshellarg()

4 个答案:

答案 0 :(得分:4)

你测试使用它

exec("php -f ./process.php var1 var2 > /dev/null 2>/dev/null &"); 

如果你想获得这些变量,可以使用全局变量$ argv访问值。如果您打印此var show same:

print_r($argv);


Array
(
    [0] => process.php
    [1] => var1
    [2] => var2
)

答案 1 :(得分:2)

您可以传递以下参数。

// call process.php
exec("php -f ./process.php foo=bar bar=foo > /dev/null 2>/dev/null &"); 

// process.php
if ($argc > 0) {
    for ($i=1;$i < $argc;$i++) {
        parse_str($argv[$i],$tmp);
        $_REQUEST = array_merge($_REQUEST, $tmp);
    }
}

var_dump($_REQUEST);

答案 2 :(得分:1)

我真的不了解你的目标,但是将参数传递给PHP脚本的工作方式类似于任何其他shell脚本。请参阅:http://www.php.net/manual/en/features.commandline.usage.php(示例#2)

“当用户上传文件[...]时,我想开始在后台处理数据” - 你can't access an upload before it is finished,在PHP中使用CGI。

答案 3 :(得分:1)

这是我的解决方案。

优点是您可以将此脚本用于命令行使用以及常规Web使用。如果您从cmd调用它,则$argv变量已设置,因此parse_str()部分将提取变量并将它们放入$ _GET数组中。如果您从网络上调用它,则$argv未设置,因此值来自网址。

// executingScript.php
// You have to make percent escaping yourself
exec("php -f ./executedScript.php foo=bar%20foo bar=foo%20bar > /dev/null 2>/dev/null &");

// executedScript.php
// The if-statement avoids crashing when calling the script from the web
if (isset($argv)) {
    parse_str(implode('&', array_slice($argv, 1)), $_GET);
}

这将使您能够像往常一样访问变量:

echo $_GET["foo"] // outputs "bar foo"
echo $_GET["bar"] // outputs "foo bar"