PHP асинхронное выполнение - PullRequest
4 голосов
/ 07 мая 2011

Сценарий выглядит следующим образом:

Вызов на указанный URL, включая Id известного SearchDefinition, должен создать новую запись Search в БД и вернуть новый Search.Id.

Перед возвратом Id мне нужно создать новый процесс / запустить асинхронное выполнение файла PHP, который принимает новый Search.Id и выполняет поиск.

Затем пользовательский интерфейс опрашивает3-й PHP-скрипт для получения статуса поиска (2-й скрипт продолжает обновлять запись поиска в БД).

Это вызывает у меня проблему с порождением 2-го PHP-скрипта в асинхронном режиме.

Я собираюсь запустить это на стороннем сервере, так что имею небольшой контроль над разрешениями.Поэтому я предпочел бы избегать задания cron / аналогичного опроса для новых записей поиска (и мне не очень нравится опрашивать, если я могу его избежать).Я не большой поклонник необходимости использовать веб-сервер для работы, которая не связана с Интернетом, но во избежание проблем с разрешениями это может потребоваться.

Это, кажется, оставляет мне 2 варианта:

  • Вызов 1-го сценария возвращает Id и закрывает соединение, но продолжает выполнение и фактически выполняет поиск (т.е. придерживается сценария 2 в конце сценария 1, но закрывает ответ в точке добавления)
  • Launchвторой PHP-скрипт в асинхронном режиме.

Я не уверен, как можно было бы выполнить что-либо из вышеперечисленного.Первый по-прежнему чувствует себя отвратительно.

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

Ответы [ 2 ]

7 голосов
/ 07 мая 2011

Я бы предпочел использовать вариант 1. Это также будет держать связанные функции ближе друг к другу.Вот подсказка, как отправить что-то пользователю, а затем закрыть соединение и продолжить выполнение:

(по ********* на gmail dot com, источник: http://www.php.net/manual/en/features.connection-handling.php#93441)

<?php
ob_end_clean();
header("Connection: close\r\n");
header("Content-Encoding: none\r\n");
ignore_user_abort(true); // optional
ob_start();
echo ('Text user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush();     // Strange behaviour, will not work
flush();            // Unless both are called !
ob_end_clean();

//do processing here
sleep(5);

echo('Text user will never see');
//do some processing
?>
0 голосов
/ 22 апреля 2014

swoole: асинхронное и одновременное расширение. https://github.com/matyhtf/swoole

  • управляемый событиями
  • полная асинхронная неблокировка
  • многопоточный реактор
  • многопроцессный рабочий
  • таймер миллисекунды
  • async MySQL
  • асинхронное задание
  • асинхронная файловая система для чтения / записи
  • async dns lookup
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...