如何从另一个执行php脚本?
我想从我的php文件中执行3个PHP脚本,而无需等待3个脚本完成。换句话说,3个php文件需要一次执行(并行)而不是一个一个(sequentiell)。
3个脚本位于我的主要php文件(脚本)的同一个文件夹中。
答案 0 :(得分:2)
如果您不想等待它们完成,请使用
运行它们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并且proccess立即被分离。
我在生产环境中使用第一个解决方案,其中客户端启动bash SMS发送脚本,该脚本最多可能需要10分钟才能完成,但它从未失败。
更多信息请参阅:http://php.net/exec·http://php.net/shell_exec·http://php.net/system
答案 1 :(得分:0)
如何使用exec("php yourscript.php")
考虑使用排队系统来存储你的php脚本名称和worker来从队列中获取数据并执行例如执行beanstalkd
答案 2 :(得分:0)
您需要将它们作为分离的作业运行,并且它并不容易 - 或者是便携式的。通常的解决方案是使用nohup
或执行脚本,将stdout和stderr重定向到/ dev / null(或Windows中的NUL),但这通常会有问题。
如果可能,请将三个脚本作为Web服务器上的脚本提供,并通过异步 cURL函数访问它们。这样做的另一个好处是能够通过浏览器测试脚本,并为您提供脚本输出。
其他方式包括使用popen()
,或者在Linux下使用at
或batch
实用程序。
答案 3 :(得分: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 &");
}
}
答案 4 :(得分:0)
对于shell_exec,添加'/ B'参数,这允许您一次运行多个可执行文件。 请参阅此问题的答案:PHP on a windows machine; Start process in background
它是一样的。
shell_exec('start / B“C:\ Path \ to \ program.exe”); / B参数是关键 这里。我试图再次找到你的主题,但我似乎无法 找到它了。这对我有用。
我希望这能为您解决问题。