我正在“分叉”php代码,启动脚本以在后台运行,允许浏览器应用程序继续而无需等待响应。
我希望能够将参数传递给这样的脚本。
假设我有一个数组我希望可以访问相关脚本,我怎么能把它传递过来?
$test = array(1,2,3);
//for windows i do the following which works well enough
pclose(popen("start php /path/to/script.php ","r"));
或者某些Linux发行版:
exec('php -f /path/to/script.php >/dev/null 2>&1 &');
首先,是否可以将我的数组传递给该脚本?如果它可以使脚本可以访问它,我怎么能访问该脚本中传递的变量?
(坐在这里很困惑,考虑通过值/参考传递变量....)
谢谢!
答案 0 :(得分:2)
Nicolas Brown几乎是对的。但是,我认为那将是你正在寻找的解决方案的第二部分 您可能已经知道,您可以从控制台调用程序,然后传递程序可能期望的任何参数:
>php -f /path/to/program arg1[ arg2 ... argN] >/dev/null 2>&1 &
因此,当您将字符串传递给exec()
时,为什么不只是将数组“插入”作为参数然后执行它
$test = array(1,2,3);
$args = implode($test, " ");
$prog = 'php -f /path/to/script.php ' . $args . ' >/dev/null 2>&1 &'
exec($prog);
以下是Nicolas Brown提到的教程。在script.php
中,您可以从$argv[]
$myParam1 = $argv[1];
$myParam2 = $argv[2];
请注意,在argv [0]中是程序的名称。这正是他们在教程中首先做arry_shift($argv)
的原因,以摆脱第一个元素(程序的名称和路径)。
希望它有所帮助!
答案 1 :(得分:1)
使用$ argv变量
您可以在此tutorial
中找到示例答案 2 :(得分:1)
+1给@Havelock以获得全面的答案 - 只是想发布一些额外的实施建议。
我实际上最近必须实现这一点:)我使用的实现路径是serialize()
数组并将其作为命令行参数传递给PHP脚本。这允许您将任意参数传递给脚本,而无需使用参数解析进行太多维护工作。
我认为序列化为json甚至可能比PHP序列化更友好一些。如果你走这条路,并且如果windows / linux兼容性对你的应用程序很重要(无论是本地开发环境还是其他),请确保在两种环境中测试你的序列化有效负载。
Windows似乎不喜欢有效负载中的引号。
哦,为了实现可调试性,请确保在PHP脚本中做一些好的日志记录 - 这种解决方案有助于进行有趣的调试会话。