Swoole 在 PHP-fpm/apache 中使用 task 功能

  • 新建RedisServer.php
  • 代码如下
    <?php
    use Swoole\Redis\Server;
    $server = new Server("127.0.0.1", 9501, SWOOLE_PROCESS );
    $server->set(array(
        'task_worker_num' => 32,
        'worker_num' => 1,
        'task_enable_coroutine' => true,
        'heartbeat_check_interval' => 5,
        'heartbeat_idle_time' => 10,
    ));
    $server->setHandler('LPUSH', function ($fd, $data) use ($server) {
        $taskId = $server->task($data);
        if ($taskId === false) {
            $server->send($fd, Server::format(Server::ERROR));
        } else {
            $server->send($fd, Server::format(Server::INT, $taskId));
        }
    });
    $server->on('Finish', function($serv, $taskID, $data) {
        $stats = $serv->stats();
        if ($stats['tasking_num'] > 10) { //tasking_num 当前正在排队的任务数
            echo "剩余任务信息:" . json_encode($serv->stats()) . "\n";
        }
    });
    $server->on('Task', function ($serv, $data) {
        go(function () {
            usleep(50000);
        });
        var_dump($data);
    });
    $server->start();

    task里面 usleep(50000);模拟任务执行时间

  • 新建Queue.php
  • 代码如下
    <?php
    $redis = new Redis;
    $redis->connect('127.0.0.1', 9501);
    $x=1; 
    while($x <= 1000) {
      $redis->lpush("myqueue", json_encode(array("hello".$x, "swoole")));
      $x++;
    } 

    模拟1000的任务投递
    经测试,1秒处理完毕

    可以根据Task任务执行的速度调节task_worker_num控制启动的进程数量

  • 这些进程是由swoole底层负责管理的,在发生致命错误或进程退出后底层会重新创建新的任务进程

    task_worker_num

  • 最大值不得超过SWOOLE_CPU_NUM * 1000
  • 单个task的处理耗时,如100ms,那一个进程1秒就可以处理1/0.1=10个task
  • task投递的速度,如每秒产生2000个task
  • 2000/10=200,需要设置task_worker_num => 200,启用200个task进程
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1
tangq

php-fpm 也可以使用swoole吗?

4年前 评论
JaguarJack 4年前
php迷途小书童 (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!