Как открыть несколько соединений сокетов и сделать обратные вызовы в PHP - PullRequest
0 голосов
/ 21 января 2010

Я пишу некоторый код, который обрабатывает очередь элементов. Вот как это работает:

  1. Получить следующий элемент, помеченный как необходимый обрабатываться из MySQL строка базы данных.
  2. Запрос информации в Google API используя Curl, подождите, пока информация вернулся.
  3. сделать оставшуюся часть обработки на основании возвращенной информации.
  4. Пометить товар как обработанный в ДБ, перейти к следующему пункту.

Проблема в том, что на шаге №2. Google иногда требуется 10-15 секунд, чтобы вернуть запрошенную информацию, в течение этого времени мой сценарий должен оставаться остановленным и ждать.

Мне интересно, смогу ли я изменить код для выполнения следующего:

  1. Получить следующие 5 предметов для обработки как обычно.
  2. Запрос информации по пунктам 1-5 от Гугл, один за другим.
  3. Когда информация для элемента 1 возвращается, обратный вызов должен быть сделано, что вызывает функцию или в противном случае вызывает некоторый код, который затем делает оставшуюся часть обработки по пунктам 1-5.
  4. А потом сценарий начинается заново пока все незавершенные пункты в БД помечено обработано.

Как можно добиться чего-то подобного?

Ответы [ 3 ]

2 голосов
/ 21 января 2010

Вы можете разделить это на 2 типа процесса.

  1. Рабочий процесс (их много): знает, что строка базы данных обрабатывается, выполняет и ожидает вызова API Google, а затем выполняет работу и сохраняет результаты в базе данных.

  2. Планировщик (один и только): периодически (скажем, каждые несколько секунд) проверяет, есть ли работа, которую нужно выполнить, и проверяет, работают ли N (5 или что-то оптимальное) рабочих. Если работает меньше чем N работников, запускается больше работников (с exec), чтобы сохранить его N, пока вся работа не будет выполнена.

1 голос
/ 21 января 2010

Я думаю, вы можете создать мастер-скрипт, который будет вызывать дочерний скрипт на том же компьютере для определенного элемента. Дочерний скрипт отправит запрос в Google API и будет работать соответственно.

1 голос
/ 21 января 2010

Я действительно не знаю, является ли это элегантным подходом, но теоретически вы могли бы использовать fork () для форка PHP-процесса для каждого элемента. Это позволило бы весь код быть в одном файле.

// Get items from DB
$items = get_items_from_db();
foreach($items as $item) {
    $pid = pcntl_fork();
    if($pid == -1) die("Couldn't fork!");
    if(!$pid) {
      // Process the item in the child process
      process_item($item);
      exit();
    }
}
// Wait for all child processes to end
pcntl_wait();
// We're done!

Но да, это решение, скорее всего, заставит некоторых кричать;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...