In a apcahe server i want to run a PHP scripts as cron which starts a php file in background and exits just after starting of the file and doesn't wait for the script to complete as that script will take around 60 minutes to complete.how this can be done?
3 回答
您应该知道 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 放入数据库并在一段时间后将其杀死以避免僵尸)。
您需要使用“&”符号将程序作为后台进程运行。
$ php -f file.php &
那将在后台运行此命令。
你可以写 sh 脚本
#!/bin/bash
php -f file.php &
并从 crontab 运行此脚本。
这可能不是您特定问题的最佳解决方案。但是为了记录,PHP中有线程。
https://github.com/krakjoe/pthreads
我假设您知道如何使用线程,这是我自己编写的非常年轻的代码,但是如果您有线程和互斥锁等方面的经验,您应该能够使用此扩展解决您的问题。
这显然是我自己项目的无耻插件,如果用户没有安装扩展所需的访问权限,那么它对他没有帮助,但是很多人发现stackoverflow,它无疑会解决其他问题......