2

如何从另一个执行 php 脚本?

我想从我的 php 文件中执行 3 个 php 脚本,而无需等待 3 个脚本完成。换句话说,这 3 个 php 文件需要一次全部执行(并行)而不是一个接一个(顺序执行)。

这 3 个脚本位于我的主 php 文件(脚本)的同一文件夹中。

4

5 回答 5

3

如果您不想等待它们完成,请运行它们

exec('php script.php &> /dev/null &');
shell_exec('php script.php &> /dev/null &');
system('php script.php &> /dev/null &');
`php script.php &> /dev/null &`

其中任何一个都应该完成这项工作,具体取决于您的 PHP 配置。尽管它们是不同的函数,但它们的行为应该相似,因为所有输出都被重定向到 /dev/null 并且进程会立即分离。

我在生产环境中使用第一个解决方案,其中客户端启动一个 bash SMS 发送脚本,该脚本可能需要 10 分钟才能完成,它从未失败过。

更多信息在: http: //php.net/exec · http://php.net/shell_exec · http://php.net/system

于 2012-08-24T22:03:13.937 回答
0

您需要将它们作为独立作业运行,这并不容易 - 或可移植。通常的解决方案是使用nohup或执行脚本,并将 stdout 和 stderr 重定向到 /dev/null(或 Windows 中的 NUL),但这通常会出现问题。

如果可能,将这三个脚本作为 Web 服务器上的脚本提供,并通过异步cURL 函数访问它们。这还具有能够通过浏览器测试脚本并为您提供脚本输出的优势。

其他方法包括使用popen(),或者如果在 Linux 下,使用atorbatch实用程序。

于 2012-08-24T22:05:12.483 回答
0

取自http://board.phpbuilder.com/showthread.php?10351142-How-can-I-exec%28%29-in-a-non-blocking-fashion

为了执行一个命令,让它在运行时不挂起你的 php 脚本,你运行的程序一定不能输出回 php。为此,请将 stdout 和 stderr 都重定向到 /dev/null,然后将其作为背景。

> /dev/null 2>&1 &

为了执行一个命令并让它作为另一个不依赖于 apache 线程的进程继续运行(如果有人取消页面不会死)运行这个:

exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');

对于 Windows http://www.php.net/manual/en/function.exec.php

function execInBackground($path, $exe, $args = "") {
global $conf;

if (file_exists($path . $exe)) {
    chdir($path);
    if (substr(php_uname(), 0, 7) == "Windows"){
        pclose(popen("start \"bla\" \"" . $exe . "\" " . escapeshellarg($args), "r"));   
    } else {
        exec("./" . $exe . " " . escapeshellarg($args) . " > /dev/null &");   
    }
}
于 2012-08-24T22:07:31.200 回答
0

在 shell_exec 中添加 '/B' 参数,这允许您一次运行多个可执行文件。请参阅我对这个问题的回答:Windows 机器上的 PHP;在后台启动进程

一样的。

shell_exec('start /B "C:\Path\to\program.exe"); /B 参数是这里的关键。我试图再次为您找到主题,但我似乎再也找不到了。这对我有用。

我希望这可以为您解决问题。

于 2012-08-24T22:30:59.113 回答
0

如何使用exec("php yourscript.php")

请考虑使用排队系统来存储您的 php 脚本名称和工作人员以从队列中获取数据并执行例如beanstalkd

于 2012-08-24T22:00:29.657 回答