Roberto,不幸的是Thrift框架没有这样的内置功能。可能有许多替代方案,具体取决于您希望PHP客户端会话在您通常等待计算密集型Thrift服务器应答的时间(如果您没有单独使用)。
我现在只能想象一下,在编码一个用户(或多个并行用户)可以触发计算密集型任务的Web应用程序的情况下,您想向所述用户提供一些反馈同时说任务流失。
从一开始,您绝对正确地尝试避免您想要避免的解决方案。您的PHP客户端会话无法保护回调界面,而不会阻止(除非您尝试使用pcntl_fork或其他PHP threading band-aid更深入挖掘您的洞)
最简单的和IMHO最好的方式是从事件驱动的模型(我想在服务器完成时被通知)到轮询模型的两个切换(我会定期询问服务器是否完成)。有几种实现轮询模型的方法,在服务器和客户端都有多个实现选项,例如:
>在调用阶段:
> PHP客户端会话分配唯一的job_id值;会话然后使异步的oneway调用void compute(…,job_id)到计算密集型Thrift服务器,
– 要么 –
> PHP客户端会话使得计算密集型Thrift服务器同步调用job_id start_compute(…)服务器分配唯一的job_id值,然后在单独的线程/进程中产生实际的计算密集型任务,立即返回到具有已分配job_id的PHP客户端会话
>在计算阶段:
> PHP客户端会话继续通过对计算密集型Thrift服务器的同步状态get_status(job_id)调用来定期检查计算密集型作业的状态,
– 要么 –
> PHP客户端会话立即终止,以便在将job_id传递到浏览器之后释放宝贵的资源,并指示浏览器定期检查计算密集型作业job_id的状态(例如通过META REFRESH或通过XHR (AJAX)请求从Javascript等);浏览器检查产生一个简单的PHP客户端会话,该会话执行对计算密集型Thrift服务器的同步状态get_status(job_id)调用,在将状态(无论哪个可能)转发到浏览器之后立即终止