我使用PHP中的exec
函数来运行命令。我运行的命令通常需要很长时间,我不需要读取它的输出。是否有一种简单的方式告诉PHP在继续执行脚本的其余部分之前不要等待exec
命令完成?如何在调用exec()后强制PHP脚本继续使用脚本?
回答
// nohup_test.php:
// a very long running process
$command = 'tail -f /dev/null';
exec("nohup $command >/dev/null 2>/dev/null &"); // here we go
printf('run command: %s'.PHP_EOL, $command);
echo 'Continuing to execute the rest of this script instructions'.PHP_EOL;
for ($x=1000000;$x-->0;) {
for ($y=1000000;$y-->0;) {
//this is so long, so I can do ps auwx | grep php while it's running and see whether $command run in separate process
}
}
运行nohup_test.php:
$ php nohup_test.php
run command: tail -f /dev/null
Continuing to execute the rest of this script instructions
让我们来看看我们的流程的PID:
$ ps auwx | grep tail
nemoden 3397 0.0 0.0 3252 636 pts/8 S+ 18:41 0:00 tail -f /dev/null
$ ps auwx | grep php
nemoden 3394 82.0 0.2 31208 6804 pts/8 R+ 18:41 0:04 php nohup_test.php
,你可以看到,PID是不同的,我的脚本,而无需等待tail -f /dev/null
运行。
这太棒了。谢谢! –
不用客气:) – Nemoden
使用'/ dev/null'是正确工作的关键。由于某些原因,当我指定一个实际的日志文件位置(即@zaf建议的'/ path/to/logfile')时,PHP仍然等待该过程完成。任何想法,为什么这是? –
这里是我使用(你可以使用EXEC或系统代替paasthru):
passthru("/path/to/program args >> /path/to/logfile 2>&1 &");
谢谢!不过,我并不太熟悉这里的一些语法。 '>>和'2>&1&'做什么? –
>>将程序的输出发送到日志文件。 '2>&1'会将错误消息重定向到标准输出,基本上意味着所有的输出都会转到日志文件。 '&'表示在后台运行命令。 – zaf
完美。谢谢! –
你要找的是所谓的异步调用,就像回答这里:
Asynchronous shell exec in PHP
php execute a background process
PHP exec() as Background Process (Windows Wampserver Environment)
谢谢!在发布之前,我对此进行了相当多的搜索,但显然没有使用正确的关键字... –
- 1. 使用exec()在调用php脚本
- 2. 脚本调用后Bash不会继续?
- 3. PHP调用服务器脚本 - 调用后不会继续
- 4. 在调用另一个脚本后立即继续使父代脚本
- 5. 错误后继续PHP脚本?
- 6. htaccess调用php脚本,然后继续处理
- 7. 如何在服务器启动后继续使用python脚本?
- 8. 如何在重新引导后继续使用Shell脚本?
- 9. 如何强制WebBrowser控件以继续脚本?
- 10. 错误使用EXEC()调用python脚本
- 11. PHP脚本继续如果MySQL失败
- 12. 在php脚本上继续cakephp 3 session
- 13. Python脚本继续运行使用pyRserve
- 14. 如何使用shell脚本调用PHP脚本?
- 15. PHP开始PHP脚本,并继续
- 16. 使用PHP运行Python脚本exec()
- 17. jquery ajax调用成功后,继续运行脚本
- 18. Powershell:如何在永无止境的脚本行后继续运行脚本?
- 19. 调用一个脚本并继续在PHP的后台运行它?
- 20. 使用exec在后台运行php脚本
- 21. Javascript - 让其他脚本执行,然后继续脚本
- 22. 单击PHP脚本中的链接并让脚本继续
- 23. 在另一个php脚本中使用exec()函数执行php脚本
- 24. 继续处理LFTP后的Bash脚本
- 25. 如何从PHP exec()调用Node.js脚本时传递参数?
- 26. 当使用PHP的exec()调用python脚本时,“ImportError:No module named _SHA256”
- 27. PHP脚本意外不会继续
- 28. 从脚本中调用php脚本
- 29. 从PHP脚本调用python脚本
- 30. 如何从另一个PHP脚本调用PHP脚本?
也许它是作为一个单独的过程吗? – tradyblix
我该怎么做呢?我只是将'&'追加到命令的末尾? –
'exec(“nohup $ your_command&”)' - 运行命令免于hangups,输出到非tty('nohup'),在后台运行('&') – Nemoden