PHP中的多线程

时间:2012-09-09 17:48:01

标签: php cron

在apcahe服务器中我想运行一个PHP脚本作为cron,它在后台启动一个php文件并在文件启动后退出,并且不等待脚本完成,因为该脚本大约需要60分钟到完成。这可以做到吗?

3 个答案:

答案 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,毫无疑问它将解决其他问题。 ..