Многопоточность в Symfony2

У меня здесь немного ситуация. Я использую symfony2 и facebook SDK для настройки веб-службы для своих приложений для IPhone и Android. Проблема в том, что фоновая работа может занять довольно много времени. Пользователь сначала перенаправляется на страницу входа в 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

Это не так просто, как просто создать поток и разрешить его выполнять в фоновом режиме, пока вы завершаете обслуживание запроса, в то время как вы можете сделать это, отделившись от основного потока, обслуживающего запрос, это не очень хорошая идея.

Вы никогда не хотите создавать какие-либо потоки в прямом ответе на веб-запрос, так как это пока только масштабирование. Вместо этого вы хотите отделить ту часть приложения, которую требуется запускать постоянно, и независимо от того, что делают передние части веб-сайта. Эта новая отдельная часть приложения, которую мы будем называть задней частью. Задняя часть приложения должна быть службой, которая работает все время независимо от apache, fpm или nginx. Он очень хорошо может использовать многопоточность, чтобы максимизировать пропускную способность служб back-end, вам все равно потребуется простой способ для интерфейса переднего и заднего конца; unix-доменные сокеты, сокеты tcp и т. д. С каналом связи между передним и задним концами приложения передний фронт может передавать данные и указывать задний конец на транзакции очереди в любой форме, в то время как передняя часть никогда не должна ждать результат. Это гораздо лучший дизайн, который не обязательно требует многопоточности, хотя, без сомнения, это кандидат.

Важно помнить, что бросание нитей в чем-то не обязательно делает что-то лучше, единственное, что вы можете сказать наверняка, это то, что он будет более занят, производительность не является продуктом использования по умолчанию, вам нужно тщательно подумать о том, как вы будете использовать ресурсы, как вы будете взаимодействовать между составными частями вашего приложения и как использовать минимальное количество потоков (или действительно, процессов) для максимальной пропускной способности.

По умолчанию PHP не поддерживает многопоточность. Существуют фреймворки для PHP, такие как pthreads, которые привносят многопоточность в язык, но вы, возможно, не найдете много документации для комбинации pthreads im с symfony2. Итак, что бы я рекомендовал и что мы делаем в нашей компании, используется асинхронный инструмент обмена сообщениями, такой как RabbitMQ. В основном, вы отправляете сообщения из приложения, которые будут храниться в очереди и асинхронно обрабатываться рабочими процессами. Я также могу рекомендовать комплект videlalvaro для RabbitMQ https://github.com/videlalvaro/rabbitmqbundle .