在PHP中调用脚本并在后台继续运行它?

3
我想编写一个脚本,在调用某些代码后继续运行。 例如:
function foo()
{
 $this->load_function_a();
 $this->load_function_b();
 echo 'A and B succesfully called';
}

我希望函数的输出可以立即显示,而不必等待两个函数的处理完成。有什么办法可以在PHP中实现这一点?


哇...我不认为这是可能的...也许你可以使用Javascript和AJAX。 - Goudgeld1
可能是重复的问题:如何在表单提交后在后台运行PHP脚本? - halfer
除了那些选项之外,也可以考虑使用作业队列 - Gearman 或 Resque。 - halfer
3个回答

0

通常在 web 环境下使用 PHP 很难实现。可能有各种“hacky”的方法可以实现,但它们不可靠,比如在析构函数中调用函数,或者使用 register_shutdown_function()

事实上,简单的答案是:

function foo()
{
 $this->load_function_a();
 echo 'A succesfully called';
 $this->load_function_b();
}

然而,我假设这在您的实际代码中不适用。因此,要正确解决此问题,真正的答案是使用某种队列和队列处理器。例如:

  • 让函数B将其功能排队,然后由cron作业稍后处理。
  • 使用RabbitMQ或Gearman等工具异步处理函数B的功能。

希望这可以帮助到您!


0

如果您不想稍后显示函数的输出,这是有可能的。

<?php
ignore_user_abort(true);
header("Content-Length: 0");
flush();
do_your_work_here();

你可以打印出真实的内容长度并输出一些东西,而不是使用Content-Length: 0。这样浏览器就会认为它已经读取了所有内容(至少是假设如此),你的脚本将继续运行。


请注意,这仍然受最大执行时间的限制。 - A.B. Carroll
@kelunik:是的,我不关心输出,那么在调用函数a之前需要调用这个吗? - SanketR
@SanketR:没错,这就是我所说的“do_your_work_here”。请注意,这样的操作很容易为您的Web服务器创建大量负载。 - kelunik

0
你需要的是异步函数调用。PHP支持多线程,但需要在服务器上安装PThreads扩展。我对PHP中的多线程编程不是很熟悉(更多的是.NET方面的人:P),但这个链接可能会对你有很大帮助: PThreads

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接