Среда:
В предыдущей главе мы кратко описали, как написать простой эхо-сервер, и изучили методы использования нескольких основных функций обратного вызова, таких как onReceive. В этой главе мы рассмотрим, как использовать асинхронные задачи Swoole.
Бизнес-логика Swoole выполняется синхронно и блокируется, что может повлиять на скорость отклика сервера, если возникнут длительные операции, такие как доступ к базе данных или широковещательная рассылка сообщений. Для решения этой проблемы Swoole предоставляет функцию задач, которая позволяет выполнять длительные операции в отдельном процессе, пока текущий процесс продолжает выполнение следующей логики.
Чтобы активировать функцию задач, необходимо добавить элемент конфигурации task_worker_num в swoole_server, например:
$serv->set(array(
'task_worker_num' => 8
));
Это активирует функцию задач. Кроме того, необходимо привязать два обратных вызова к swoole_server: onTask и onFinish. Эти обратные вызовы используются для выполнения задач и обработки результатов выполнения задач соответственно.
Сначала инициируется задача, код выглядит следующим образом:
public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {
echo "Get Message From Client {$fd}:{$data}\n";
// отправляем задачу работнику задач.
$param = array(
'fd' => $fd
);
// запускаем задачу
$serv->task( json_encode( $param ) );
echo "Continue Handle Worker\n";
}
Как видно из кода, для запуска задачи достаточно вызвать функцию task объекта swoole_server. Swoole внутренне передаст этот запрос работнику задач, а текущий рабочий процесс продолжит выполнение. Когда задача запущена, работник задач ответит на обратный вызов onTask, например:
public function onTask($serv,$task_id,$from_id, $data) {
echo "This Task {$task_id} from Worker {$from_id}\n";
echo "Data: {$data}\n";
for($i = 0 ; $i < 10 ; $i ++ ) {
sleep(1);
echo "Task {$task_id} Handle {$i} times...\n";
}
$fd = json_decode( $data , true )['fd'];
$serv->send( $fd , "Data in Task {$task_id}");
return "Task {$task_id}'s result";
}
Здесь я использовал функцию sleep и цикл для имитации длительной задачи. В обратном вызове onTask мы используем task_id и from_id (то есть worker_id), чтобы различать задачи, отправленные разными рабочими процессами. После завершения выполнения задачи результат выполнения возвращается рабочему процессу через return. Рабочий процесс получит результат обработки через обратный вызов onFinish. Давайте посмотрим на обратный вызов onFinish:
public function onFinish($serv,$task_id, $data) {
echo "Task {$task_id} finish\n";
echo "Result: {$data}\n";
}
В обратном вызове onFinish будет получен результат выполнения задачи $data. Здесь вы можете обработать этот результат. (Совет: Вы можете сохранить fd, buff и другие данные в переданных данных, чтобы продолжить работу, начатую перед отправкой задачи.) Полный пример можно посмотреть здесь
Причина, по которой я объясняю, как использовать swoole_client, заключается в том, что при написании серверного кода неизбежно требуется клиент для тестирования. Swoole предоставляет swoole_client для написания тестовых клиентов. Ниже я объясню, как использовать этот инструмент. Swoole_client имеет два режима работы: синхронный блокирующий режим и асинхронный режим обратного вызова. Синхронный блокирующий режим уже был представлен в предыдущей главе, и его использование практически не отличается от обычного сокета. Поэтому я сосредоточусь на асинхронном режиме обратного вызова swoole_client. Создайте асинхронный клиент следующим образом:
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
Среди них SWOOLE_SOCK_ASYNC указывает на создание асинхронного клиента. Поскольку это асинхронно, конечно, требуются обратные вызовы. Swoole_client предоставляет четыре обратных вызова:
$client->on("connect", function($cli) {
$cli->send("hello world\n");
});
$client->on("receive", function($cli, $data){
echo "Received: ".$data."\n";
});
$client->on("error", function($cli){
echo "Connect failed\n";
});
$client->on("close", function($cli){
echo "Connection close\n";
});
Эти несколько обратных вызовов работают аналогично swoole_server, за исключением того, что параметры различаются, поэтому я не буду повторять их здесь. Полный пример можно посмотреть здесь Server.php — это класс, в котором реализованы все функции обратного вызова Swoole.
Содержание следующей главы: примеры использования таймера, механизма обнаружения пульса и пула соединений с базой данных MySQL на продвинутом уровне.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )