我正在为我的用户创建一个函数,他们可以上传大型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()。
答案 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"