1

我正在“分叉” 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 &');

所以首先,是否可以将我的数组传递给该脚本?如果它可以让脚本访问它,我怎么能访问该脚本中传递的变量?

(坐在这里困惑,考虑通过值/引用传递变量......)

谢谢!

4

3 回答 3

2

尼古拉斯·布朗几乎是对的。但我认为,这将是您正在寻找的解决方案的第二部分。
正如您可能已经知道的那样,您可以从控制台调用程序并传递程序可能期望的任何参数:

>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),以摆脱第一个元素(程序的名称和路径)。
希望能帮助到你!

于 2012-08-23T15:01:57.387 回答
1

使用 $argv 变量

您可以从本教程中找到一个示例

于 2012-08-23T14:44:12.273 回答
1

向@Havelock +1 以获得彻底的答案 - 只是想发布一些额外的实施建议。

实际上,我最近必须完全实现这一点 :) 我采用的实现路径是到serialize()数组并将其作为命令行参数传递给 PHP 脚本。这允许您将任意参数传递给脚本,而无需对参数解析进行太多维护工作。

我认为序列化为 json 甚至可能比 PHP 序列化更友好一些。如果你走那条路,并且如果 windows / linux 兼容性对你的应用程序很重要(无论是本地开发环境还是其他环境),请务必在两个环境中测试你的序列化有效负载。

Windows 似乎不喜欢有效载荷中的引号。

哦,为了可调试性,请确保在您的 PHP 脚本中进行一些良好的日志记录 - 这种解决方案适合于有趣的调试会话。

于 2012-08-24T04:48:28.823 回答