这可以实现吗?如果没有,其他方式最佳做法是什么?
我试图:
让事情更清楚:
function foo() {
var $data; // a very large data
var $check = $this->bar($data); // gets true
if ($check) {
echo "FOO: Bar received my message!";
}
}
function bar($data) {
return true; // returns true, now foo doesn't care what bar will do
echo "BAR: returned true to foo, will now call foobar!";
// some code to process $data
$this->foobar(); // but hopefully still execute this line
}
function foobar() {
echo "FOOBAR: Hello, World!";
return;
}
预期输出:(异步)
FOO: Bar received my message!
BAR: returned true to foo, will now call foobar!
FOOBAR: Hello, World!
答案 0 :(得分:2)
您正在寻找的是“异步”处理。这种东西存在于某些语言中,特别是javascript,但在php中本身不存在。有一些扩展,但它们并没有真正普及,因为这有点违背了php的想法和力量。
通常使用两种替代方法,其中第二种方法是更好的方法:
您向客户端发送正常回复并使用phps ignore_client_abort
功能。该功能允许在发送响应后继续处理。但请注意,以这种同步方式处理更多数据是值得怀疑的:出于安全原因,您很可能会遇到许多php限制中的一些。因此,yu必须提高所有这些限制,这会降低您对未使用和错误的保护。
使用作业调度程序存储数据处理作业,并通知客户端您收到数据并创建处理作业的事实。然后通过cronjob或类似方法逐个处理队列中的每个作业,这与客户端请求无关。如果在客户端的队列状态上实现视图,则会获得额外的分数: - )
有这样的框架,基本上他们所做的是在数据库中创建条目,每个作业一个。然后你定期(每分钟)发射一个cron作业。该作业检查是否已经处理了另一个作业,如果没有,则选择下一个作业并开始处理。通常,每个php-cli调用都要进行处理,以独立于Web服务器环境。这也意味着您甚至可以在不同的系统上执行作业以获得更好的性能。你已经将处理与web gui分离了。
答案 1 :(得分:1)
如果要同时运行更多功能,PHP支持多线程。这是一个简单而又很好的例子:How can one use multi threading in PHP applications