Какой самый эффективный способ запуска асинхронных функций в PHP? - PullRequest
5 голосов
/ 17 октября 2011

Я работаю над приложением, использующим Amazon MWS API, написанным в основном на PHP.Это приложение позволяет продавцам Amazon зарегистрироваться, предоставить некоторые учетные данные продавца Amazon, а затем приложение начинает загружать заказы этого пользователя из Amazon, помещая их в базу данных MySQL.

Я создал методы для точной синхронизации данных сбаза данных использует скрипт с несколькими функциями, но заметила, что это занимает слишком много времени.Этот скрипт просто перебирает всех пользователей в базе данных и повторяет все заказы по одному.Сейчас, когда у нас всего 5 тестовых пользователей, время выполнимо, но я ищу более расширяемый метод.Подумайте о 500 пользователях, работающих синхронно по одному.Слишком долго!

Я довольно новичок в PHP и особенно запускаю асинхронные процессы из него.Единственный способ, который я нашел, что я могу сделать это - это иметь стартовый скрипт, который находит всех пользователей в базе данных и запускает скрипт синхронизации для каждого пользователя, а затем выпускает его.Мне не нравится эта идея, потому что если бы у меня было более 500 пользователей, моя ночная синхронизация состояла бы из 500 порожденных экземпляров этого скрипта PHP.

Кто-нибудь делал что-то подобное раньше?Если это так, я хотел бы услышать, как лучше сделать эту синхронизацию более эффективной.

Ответы [ 3 ]

2 голосов
/ 17 октября 2011

Поскольку PHP не может быть многопоточным 1 , на практике у вас есть только 2 варианта (есть несколько способов сделать это, но все они сводятся к следующим категориям):

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

Я думаю, что лучше всего объединить два подхода, чтобы у вас было несколько процессов, которые работают с несколькими пользователями.Таким образом, если у вас было 500 пользователей, появилось 100 процессов с 5 пользователями каждый или 50 процессов с 10 пользователями.

В качестве альтернативы, возможно, стоит написать программу на языке, который лучше подходит длязадача - что-то, поддерживающее многопоточность, например, Java или Perl, - которую вы можете запустить из PHP при необходимости.

1 Редактировать 03/2013: PHP теперь может быть многопоточным, но это не рекомендуется для производственного использования, так как расширение pthreads все еще крайне нестабильно, и также не рекомендуется для обычного пользователя, используйте его, только если вы действительно знаете, что делаете

1 голос
/ 23 октября 2011

Согласитесь с DaveRandom, проверьте пул HTTP-запросов на реализацию, а не накатывайте свои http://www.php.net/manual/en/class.httprequestpool.php

0 голосов
/ 10 ноября 2011

В итоге я использовал passthru и передал сценарий на задний план. Пока что дела идут хорошо.

...