PHP изначально синхронный и однопоточный, но асинхронные задачи можно реализовать несколькими способами. Рассмотрим популярные подходы.
Самый надежный способ для фоновых задач. Популярные брокеры:
Пример с библиотекой php-amqplib
:
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('task_queue', false, true, false, false);
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'task_queue');
$channel->close();
$connection->close();
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->rPush('task_queue', json_encode(['task' => 'send_email']));
Запуск PHP-скриптов как демонов:
#!/usr/bin/env php
<?php
while (true) {
// Проверяем наличие задач
$task = getTaskFromQueue();
if ($task) {
processTask($task);
}
sleep(1);
}
Запуск: nohup php worker.php > /dev/null 2>&1 &
Библиотеки для асинхронного программирования:
<?php
require 'vendor/autoload.php';
$loop = React\EventLoop\Factory::create();
$loop->addTimer(1, function () {
echo "Асинхронная задача выполнена!\n";
});
$loop->run();
Пример cron-задачи:
* * * * * /usr/bin/php /path/to/script.php
Критерий | Очереди | Демоны | ReactPHP | CRON |
---|---|---|---|---|
Сложность | Средняя | Низкая | Высокая | Низкая |
Надежность | Высокая | Средняя | Низкая | Средняя |
Масштабируемость | Высокая | Низкая | Средняя | Низкая |
Для production-решений лучше использовать очереди (RabbitMQ/Redis). Для простых задач подойдут демоны или CRON. ReactPHP/Amp — для сложных асинхронных сценариев.