我在这里有一些情况.我正在使用symfony2和facebook SDK为我的iPhone和Android应用程序设置Web服务.问题是后台工作可能需要很长时间.用户首先被重定向到Facebook登录页面,在那里他可以继续接受我的Facebook应用程序权限.因此,不应等待我的服务完成后台工作,应立即通知用户一切正常.服务应该在后台继续工作,用户应该不知道它.这是控制器操作的相关部分:
public function persistPostsAction() { ... if ($this->CheckUser($user_id) == 0) { /*This function should be called on background thread*/ $this->persistPosts($user_id); } ... return $this->render('FacebookAPIFacebookBundle:Page:postovi.html.twig', array( 'FacebookPosts' => $pwu )); }
如何$this->persistPosts($user_id);
在另一个线程上调用函数然后继续执行?这类问题的最佳做法是什么?
PHP确实进行了多线程处理,可以找到pthreads的文档:http://php.net/pthreads
许多用法示例:https://github.com/krakjoe/pthreads/tree/master/examples
它不是简单的创建一个线程并允许它在完成服务请求时在后台执行,而你可以通过从服务请求的主线程中分离来做到这一点,这不是一个好主意.
您从不真正想要直接响应Web请求创建任何线程,因为这只能扩展到目前为止.您想要做的事情是将应用程序的一部分分开,您需要不断运行,而不管网站的前端部分是做什么的.这个新分离的应用程序部分我们将其称为后端.应用程序的后端应该是一直运行的服务,与apache,fpm或nginx无关.它很可能使用多线程来最大化后端服务的吞吐量,你仍然需要一些简单的方法来进行前端和后端的通信; unix域套接字,tcp套接字等.通过应用程序的前端和后端之间的通信通道,前端可以传递数据并指示后端以适当的形式排队事务,而前端永远不必等待结果.这是一个更好的设计,不一定需要任何多线程,但毫无疑问它是候选者.
重要的是要记住,在某些东西上投掷线程并不一定会让事情变得更好,唯一可以肯定的是,它会更加繁忙,性能不是默认使用的产品,你必须仔细考虑如何您将使用资源,如何在应用程序的组件部分之间进行通信,以及如何使用最少数量的线程(或实际上是进程)来获得最大吞吐量.