1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/phpArtist-swoole-start

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
02-Swoole的Task使用以及swoole_client.md 8.4 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 04:51 cb930a5

Вторая глава: использование задач Swoole и Swoole_client

Среда:

  • Система: Ubuntu 14.04 (включая инструкции по установке для CentOS 6.5);
  • Версия PHP: PHP-5.5.10;
  • Версия Swoole: 1.7.6-stable.

В предыдущей главе мы кратко описали, как написать простой эхо-сервер, и изучили методы использования нескольких основных функций обратного вызова, таких как onReceive. В этой главе мы рассмотрим, как использовать асинхронные задачи Swoole.

1. Введение в задачи

Бизнес-логика Swoole выполняется синхронно и блокируется, что может повлиять на скорость отклика сервера, если возникнут длительные операции, такие как доступ к базе данных или широковещательная рассылка сообщений. Для решения этой проблемы Swoole предоставляет функцию задач, которая позволяет выполнять длительные операции в отдельном процессе, пока текущий процесс продолжает выполнение следующей логики.

2. Активация функции задач

Чтобы активировать функцию задач, необходимо добавить элемент конфигурации task_worker_num в swoole_server, например:

$serv->set(array(
    'task_worker_num' => 8
));

Это активирует функцию задач. Кроме того, необходимо привязать два обратных вызова к swoole_server: onTask и onFinish. Эти обратные вызовы используются для выполнения задач и обработки результатов выполнения задач соответственно.

3. Использование задач

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

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 и другие данные в переданных данных, чтобы продолжить работу, начатую перед отправкой задачи.) Полный пример можно посмотреть здесь

4. Swoole_Client

Причина, по которой я объясняю, как использовать 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/phpArtist-swoole-start.git
git@api.gitlife.ru:oschina-mirror/phpArtist-swoole-start.git
oschina-mirror
phpArtist-swoole-start
phpArtist-swoole-start
master