Symfony2中的多线程

时间:2013-12-26 20:57:59

标签: php multithreading symfony

我在这里有一些情况。我正在使用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);函数然后继续执行?这类问题的最佳做法是什么?

2 个答案:

答案 0 :(得分:7)

PHP确实进行多线程处理,可以找到pthreads的文档:http://php.net/pthreads

许多使用示例:https://github.com/krakjoe/pthreads/tree/master/examples

在完成服务请求时,创建一个线程并允许它在后台执行并不简单,而你可以通过从服务请求的主线程中分离来实现,这不是一个好主意。

您从不真正想要直接响应Web请求创建任何线程,因为这只能扩展到目前为止。您想要做的事情是将应用程序的一部分分开,您需要不断运行,而不管网站的前端部分是做什么的。这个新分离的应用程序部分我们将其称为后端。应用程序的后端应该是一直运行的服务,与apache,fpm或nginx无关。它很可能使用多线程来最大化后端服务的吞吐量,你仍然需要一些简单的方法来进行前端和后端的通信; unix域套接字,tcp套接字等。通过应用程序的前端和后端之间的通信通道,前端可以传递数据并指示后端以适当的形式排队事务,而前端永远不必等待结果。这是一个更好的设计,不一定需要任何多线程,但毫无疑问它是候选。

重要的是要记住,在某些东西上投掷线程并不一定会让事情变得更好,你唯一可以肯定的是它会更加繁忙,性能不是默认使用的产品,你必须要思考仔细考虑如何使用资源,如何在应用程序的组件部分之间进行通信,以及如何使用最少数量的线程(或实际上是进程)来实现最大吞吐量。

答案 1 :(得分:2)

默认情况下,PHP不支持多线程。像pthreads这样的PHP框架为这种语言带来了多线程,但你可能找不到很多pthreads与symfony2组合的文档。所以我推荐的以及我们在公司所做的是使用像RabbitMQ这样的异步消息传递工具。基本上,您所做的是从您的应用程序发送消息,这些消息将存储在队列中并由工作进程异步处理。我也可以为RabbitMQ https://github.com/videlalvaro/rabbitmqbundle推荐videlalvaro包。