Roberto,不幸的是 Thrift 框架没有这样的内置功能。但是,可能有许多替代方案,具体取决于您希望 PHP 客户端会话在您通常等待计算密集型 Thrift 服务器响应的时间段内执行的操作(如果您没有使用oneway
.)
我现在只能想象,您处于这样一种情况,在编写了一个用户(或多个并行用户)可以分别触发计算密集型任务的 Web 应用程序后,您想向所述用户提供一些反馈虽然说任务随着时间的推移而变化。
从一开始,你试图避免你试图避免的解决方案是绝对正确的。您的 PHP 客户端会话无法在不阻塞的情况下为回调接口提供服务(除非您通过尝试使用pcntl_fork或其他一些PHP 线程创可贴来更深入地挖掘漏洞。)
最简单和恕我直言最好的方法是从事件驱动模型(我希望在服务器完成时收到通知)切换到轮询模型(我会定期询问服务器是否完成。)有几种实现轮询模型的方法,在服务器端和客户端都有多种实现选项,例如:
在调用阶段:
- PHP 客户端会话分配一个唯一
job_id
值;然后会话对计算密集型 Thrift 服务器进行异步oneway
调用,void compute(..., job_id)
- 或者 -
- PHP 客户端会话对计算密集型 Thrift 服务器进行同步调用;
job_id start_compute(...)
服务器分配唯一job_id
值,然后在单独的线程/进程中生成实际的计算密集型任务,立即返回到分配的 PHP 客户端会话job_id
在计算阶段:
- PHP 客户端会话通过对计算密集型 Thrift 服务器的同步 调用,定期检查计算密集型作业的状态,
status get_status(job_id)
- 或者 -
- PHP客户端会话立即终止以释放宝贵的资源,在传递
job_id
给浏览器并指示浏览器定期检查计算密集型作业的状态job_id
(例如,通过META REFRESH
,或通过XHR(AJAX)请求来自Javascript等);浏览器检查生成一个简短的 PHP 客户端会话,该会话执行对计算密集型 Thrift 服务器的同步调用,在将状态(无论它可能是什么)转发到浏览器后立即终止 status get_status(job_id)