Как работает amphp

Документы на их сайте http://amphp.org/faq мне не очень понятны. Вещи смущают меня. Это предназначено для запуска в качестве сервера?? или запустить как CLI? или запустить в веб-контейнере ( apache, nginx fpm)? А php по своей природе синхронизирован, как это может быть асинхронно без поддержки какого-либо расширения (например, pthread).

РЕДАКТИРОВАТЬ ---

Потенциальное применение amp: background thread? В простом случае использования, например, пользователь отправляет заказ, php может общаться во времени, чтобы обработать заказ. Поэтому мы хотим использовать поток (как Java-сервлет делает это все время), не заставляя пользователя ждать. Мы знаем, что это можно сделать с помощью cron-job или Additional-AJAX, но это ужасно, и у нас есть много требований по асинхронности

1 ответ

Решение

Amp использует неблокирующий ввод / вывод для достижения параллелизма. PHP имеет встроенную поддержку для этого через http://php.net/stream_set_blocking.

Amp можно использовать в приложениях CLI, но также можно использовать и в других SAPI, таких как Apache, для выполнения нескольких одновременных запросов к какой-либо службе. Если вы хотите встроить асинхронную синхронизацию в другое приложение, вы можете использовать Amp\Promise\wait для этого:

$uris = ["https://google.com/", "https://github.com/"];
$client = new Amp\Artax\BasicClient;

$promises = array_map(function ($uri) use ($client) {
    return $client->request($uri);
}, $uris)

$responses = Amp\Promise\wait(Amp\Promise\all($promises));

Усилитель обычно однопоточный. Это только многопоточный, если вы используете что-то вроде amphp/parallel, amphp/parallel можешь использовать pthreads или несколько процессов для одновременного выполнения нескольких блокирующих действий.

Если у вас есть более конкретные вопросы, просто отредактируйте свой вопрос и комментарий, я постараюсь ответить на них.


Что касается фоновой обработки, да, это возможно с amphp/parallel, но оригинальный процесс должен остаться в живых для этого. Вы могли бы реализовать disown механизм в amphp/process чтобы процесс продолжал работать, даже если родитель умирает, он также работает внутри Apache или PHP-FPM.

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

Другие вопросы по тегам