【发布时间】:2012-08-24 21:58:40
【问题描述】:
如何从另一个执行 php 脚本?
我想从我的 php 文件中执行 3 个 php 脚本,而无需等待 3 个脚本完成。换句话说,这 3 个 php 文件需要一次全部执行(并行)而不是一个接一个(顺序执行)。
这 3 个脚本位于我的主 php 文件(脚本)的同一文件夹中。
【问题讨论】:
如何从另一个执行 php 脚本?
我想从我的 php 文件中执行 3 个 php 脚本,而无需等待 3 个脚本完成。换句话说,这 3 个 php 文件需要一次全部执行(并行)而不是一个接一个(顺序执行)。
这 3 个脚本位于我的主 php 文件(脚本)的同一文件夹中。
【问题讨论】:
如果您不想等待它们完成,请使用任一方法运行它们
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 短信发送脚本,该脚本可能需要 10 分钟才能完成,它从未失败过。
更多信息在:http://php.net/exec·http://php.net/shell_exec·http://php.net/system
【讨论】:
用exec("php yourscript.php")怎么样
请考虑使用队列系统来存储您的 php 脚本名称和工作人员以从队列中获取数据并执行例如beanstalkd
【讨论】:
您需要将它们作为独立作业运行,这并不容易 - 或可移植。通常的解决方案是使用nohup 或执行脚本并将stdout 和stderr 重定向到/dev/null(或Windows 中的NUL),但这通常会出现问题。
如果可能,将这三个脚本作为脚本在 Web 服务器上可用,并通过 异步 cURL 函数访问它们。这还具有能够通过浏览器测试脚本并为您提供脚本输出的优势。
其他方法包括使用popen(),或者如果在Linux 下使用at 或batch 实用程序。
【讨论】:
取自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 &"');
对于windowshttp://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 &");
}
}
【讨论】:
在 shell_exec 中添加 '/B' 参数,这允许您一次运行多个可执行文件。 请参阅我对这个问题的回答:PHP on a windows machine; Start process in background
都一样。
shell_exec('start /B "C:\Path\to\program.exe"); /B 参数是关键 这里。我试图再次为您找到主题,但我似乎无法 找到它了。这对我有用。
我希望这可以为您解决问题。
【讨论】: