2016-12-28 3 views
3

Я обнаружил, что pthreads не работает в веб-среде. Я использую PHP7.1 на FPM на Linux Debian, который я также использую Symfony 3.2. Все, что я хочу сделать, это, например:Async/Thread на PHP7 с FPM

  1. Пользователь сделал запрос и PUT файл (который составляет 1 ГБ)
  2. PHP сервер получает файл и обработать его.
  3. Немедленно вернуть true к пользователю (jsonResponse), не дожидаясь обработки загруженного файла
  4. Позже, при обработке файла закончена (перемещение, копирование, дублировать то, что вы хотите) просто добавить событие или сделать обратный вызов от фона и уведомления пользователя.

Теперь. Для этого я создал Console Command. Я выполняю Process('bin/console my:command')->start(); с фона, и я делаю свою обработку. Но это убивает муху с помощью базуки для меня. Мне нужно передать много переменных этой исполняемой команде.

Все, что я хочу создать другой поток и просто вернуться к пользователю, не ожидая обработки.

Вы можете сказать, что это duplicate. И укажите на pthreads. Но pthreads заявил, что он предназначен только для CLI. Также последняя версия pthreads не работает с symfony. (фатальная ошибка).

Я застрял в этой точке и есть сомнения, если я должен остаться с созданием процессов для каждого загружаемого файла или двигаться к python -> django

+3

Вы не хотите создавать темы. Вам нужна очередь заданий. Посмотрите на Gearman или подобные вещи. – Gordon

+0

Мне очень понравилось. Я посмотрел на дока. и я думаю, что это будет лучше для меня. Я также упомянул ** очередь ** в моем вопросе, но я удалил позже. Увидев механизм Gearman и очереди, я решил пойти с очередью заданий. Кроме того, прочитайте, что создание - для примера - 2 потока на выполнение и позволяет сказать, что 400 клиент приходит на сервер, он будет запускать 800 потоков. и это не то, что я хочу. Гирмен - это ключ. Я глубоко погрузись в это. Благодарю. Ой! Вы можете добавить это как ответ :) – xangr

+1

Возможно, вы ищете асинхронную обработку: https://gist.github.com/LeonanCarvalho/62c6fe0b62db8a478f502f84c5734c83 – LeonanCarvalho

ответ

3

Вы не хотите темы. Вам нужна очередь заданий. Посмотрите на Gearman или подобные вещи.

Gearman предоставляет универсальную инфраструктуру приложения для работы с другими машинами или процессами, которые лучше подходят для выполнения работы. Он позволяет выполнять параллельную работу, обрабатывать баланс нагрузки и вызывать функции между языками. Он может использоваться в различных приложениях, с веб-сайтов высокой доступности и для транспорта событий репликации базы данных. Другими словами, именно нервная система связана с передачей распределенной обработки.

+1

Plus, https://github.com/mmoreram/GearmanBundle для тех, кто использует Symfony, как я. Все становится лучше каждую минуту :) – xangr