我试图让PHP告诉Apache关闭连接,并分别释放工作线程。原因是我有一个脚本,这个脚本是用客户端请求调用的,需要一些时间来处理,但是没有任何返回给客户端,所以让线程被占用是没有意义的。我目前使用的代码:
ignore_user_abort(true);
header('Content-Length: 0');
flush();
ob_end_flush();
header('Connection: Close');因为我要从原始用户请求向这个脚本发送额外的异步请求,所以Content-Length: 0不会破坏客户机请求的响应。
无论如何,当我去监视服务器正在做什么时,我看到有一个工作线程被长期运行的请求所占用,这正是我不希望发生的情况。我希望脚本在后台安静地运行,而不占用Apache线程。我该怎么做?
发布于 2014-10-01 13:11:06
这听起来是一种糟糕的实践,而且有很多麻烦,例如并发性和负载平衡。
考虑实现任务队列:
然后,在Apache之外设置一个后台处理上述队列的守护进程或cron作业。
这样你就可以很好地控制什么时候会发生什么,而不需要这样的黑客攻击。更重要的是,通过控制队列的处理速度,可以控制资源的使用。(如果您与限制通信量的外部API交谈,则特别有用。)
如果您希望您的队列是并行的,没有什么可以阻止您这样做的--考虑设置一些任务池,创建时的每个任务都分配给随机任务池。然后,为每个任务池设置守护进程实例--不需要PHP线程或类似的东西。
https://stackoverflow.com/questions/26141924
复制相似问题