在apcahe服务器中我想运行一个PHP脚本作为cron,它在后台启动一个php文件并在文件启动后退出,并且不等待脚本完成,因为该脚本大约需要60分钟到完成。这可以做到吗?
答案 0 :(得分:9)
你应该知道PHP中没有线程。 但是如果你在Unix / linux系统上运行,你可以执行程序并轻松分离它们。
$command = "/usr/bin/php '/path/to/your/php/to/execute.php'";
exec("{$command} > /dev/null 2>&1 & echo -n \$!");
可以做这个工作。我们来解释一下:
exec($command);
执行/ usr / bin / php'/path/to/your/php/to/execute.php':您的脚本已启动,但Apache将在执行下一个代码之前等待执行结束。
> /dev/null
会将标准输出(即你的回声,打印等)重定向到一个虚拟文件(写在其中的所有输出都会丢失)。
2>&1
将错误输出重定向到标准输出,写入相同的虚拟和非现有文件。这样可以避免将日志记录到apache2 / error.log中。
&
是你最重要的事情:它将分离你的$ command的执行:所以exec()会立即释放你的php代码执行。
echo -n \$!
会将您的分离执行的PID作为响应给出:它将由exec()返回并使您能够使用它(例如,将此pid放入数据库并在一段时间后将其终止以避免僵尸)。
答案 1 :(得分:1)
你需要使用“&”将程序作为后台进程运行的符号。
$ php -f file.php &
这将在后台运行此命令。
你可以怀疑脚本
#!/bin/bash
php -f file.php &
从crontab运行此脚本。
答案 2 :(得分:1)
这可能不是解决您特定问题的最佳方法。但是为了记录,PHP中有Threads。
https://github.com/krakjoe/pthreads
我假设您知道如何使用线程,这是我自己编写的非常年轻的代码,但如果您有线程和互斥体等经验,那么您应该能够使用此扩展来解决您的问题。
这显然是我自己的项目的无耻插件,如果用户没有安装扩展所需的访问权限,那么它将无法帮助他,但很多人发现stackoverflow,毫无疑问它将解决其他问题。 ..