注意
开源技术小栈本章节就是通过为不同Worker设置不同的协程驱动类型来演示webman框架是如何支持多个协程事件驱动的。
composer require revolt/event-loop
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8888');
$worker->eventLoop = \Workerman\Events\Revolt::class;
$worker->onMessage = function (TcpConnection $connection, Request $request) {
$connection->send('hello workerman');
};
Worker::runAll();
Fiber协程,在webman框架安装后,直接启动webman,事件驱动默认会切换到revolt/event-loop
事件驱动。
Workerman[start.php] start in DEBUG mode
------------------------------------------------ WORKERMAN -------------------------------------------------
Workerman/5.0.0 PHP/8.3.15 (Jit off) Linux/5.10.102.1-microsoft-standard-WSL2
------------------------------------------------- WORKERS --------------------------------------------------
event-loop proto user worker listen count state
revolt tcp root webman http://0.0.0.0:8288 8 [OK]
revolt tcp root monitor none 1 [OK]
------------------------------------------------------------------------------------------------------------
安装教程:https://wiki.swoole.com/zh-cn/#/environment
pecl info swoole
About pecl.php.net/swoole-6.0.0
===============================
Release Type PECL-style PHP extension (source code)
Name swoole
Channel pecl.php.net
Maintainers Tianfeng Han <rango@swoole.com> (lead)
Lu Fei <lufei@php.net> (developer)
Bruce Dou <doubaokun@php.net> (developer)
Release Date 2024-12-16 08:02:22
Release Version 6.0.0 (stable)
API Version 6.0 (stable)
License Apache2.0
Required Dependencies PHP version 8.1.0
PEAR installer version 1.4.0 or newer
package.xml version 2.0
Last Modified 2025-01-03 13:31
Previous Installed - None -
Version
SwooleCoroutine.php
每3秒执行一次协程任务
<?php
/**
* @desc SwooleCoroutine.php
* @author Tinywan(ShaoBo Wan)
*/
declare(strict_types=1);
namespace app\common\coroutine;
use Workerman\Crontab\Crontab;
class SwooleCoroutine
{
public function onWorkerStart(): void
{
/** 每3秒执行一次协程任务 */
new Crontab('*/3 * * * * *', function () {
$this->execCoroutineTask();
});
}
private function execCoroutineTask(): void
{
echo '[x] Swoole Coroutine 开始执行协程任务' . PHP_EOL;
/** go函数是swoole的开启协程函数,用于开启一个协程 */
go('task1');
go('task2');
go('task3');
}
}
开源技术小栈
go
函数是swoole
的开启协程函数,用于开启一个协程。
function task1(): void
{
for ($i=0;$i<=5;$i++){
//写入文件,大概要3000微秒
usleep(3000);
echo '[x] [写入文件] ['.$i.'] ' . date('Y-m-d H:i:s') . PHP_EOL;
\Co::sleep(0.001);//挂起当前协程,0.001秒后恢复//相当于切换协程
}
}
function task2(): void
{
for ($i=0;$i<=10;$i++){
//发送邮件给500名会员,大概3000微秒
usleep(3000);
echo '[x] [发送邮件] ['.$i.'] ' . date('Y-m-d H:i:s') . PHP_EOL;
\Co::sleep(0.001);//挂起当前协程,0.001秒后恢复//相当于切换协程
}
}
function task3(): void
{
for ($i=0;$i<=15;$i++){
//模拟插入100条数据,大概3000微秒
usleep(3000);
echo '[x] [插入数据] ['.$i.'] ' . date('Y-m-d H:i:s') . PHP_EOL;
\Co::sleep(0.001);//挂起当前协程,0.001秒后恢复//相当于切换协程
}
}
开源技术小栈自定义Swoole协程进程,在
config/process.php
中添加如下配置
'swoole-coroutine' => [
'handler' => \app\common\coroutine\SwooleCoroutine::class,
'eventLoop' => \Workerman\Events\Swoole::class,
],
配置说明
handler
为\app\common\coroutine\SwooleCoroutine::class
eventLoop
为 \Workerman\Events\Swoole::class
$ php start.php start
Workerman[start.php] start in DEBUG mode
------------------------------------------------ WORKERMAN -------------------------------------------------
Workerman/5.0.0 PHP/8.3.15 (Jit off) Linux/5.10.102.1-microsoft-standard-WSL2
------------------------------------------------- WORKERS --------------------------------------------------
event-loop proto user worker listen count state
revolt tcp root webman http://0.0.0.0:8288 8 [OK]
swoole tcp root swoole-coroutine none 8 [OK]
revolt tcp root monitor none 1 [OK]
------------------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.
$ php start.php status
Workerman[start.php] status
Start worker in DEBUG mode.
---------------------------------------------------GLOBAL STATUS---------------------------------------------------------
Workerman/5.0.0 PHP/8.3.15 (Jit off) Linux/5.10.102.1-microsoft-standard-WSL2
start time:2025-01-03 22:55:23 run 0 days 0 hours load average: 1.73, 0.79, 0.77
3 workers 17 processes
name event-loop exit_status exit_count
webman revolt 0 0
swoole-coroutine swoole 0 0
monitor revolt 0 0
---------------------------------------------------PROCESS STATUS--------------------------------------------------------
pid memory listening name connections send_fail timers total_request qps status
20277 8.47M http://0.0.0.0:8288 webman 0 0 2 0 0 [idle]
20278 8.47M http://0.0.0.0:8288 webman 0 0 2 0 0 [idle]
20279 8.47M http://0.0.0.0:8288 webman 0 0 2 0 0 [idle]
20280 8.47M http://0.0.0.0:8288 webman 0 0 2 0 0 [idle]
20281 8.47M http://0.0.0.0:8288 webman 0 0 2 0 0 [idle]
20282 8.47M http://0.0.0.0:8288 webman 0 0 2 0 0 [idle]
20283 8.47M http://0.0.0.0:8288 webman 0 0 2 0 0 [idle]
20284 8.47M http://0.0.0.0:8288 webman 0 0 2 0 0 [idle]
20285 8.25M none swoole-coroutine 0 0 3 0 0 [idle]
20286 8.25M none swoole-coroutine 0 0 3 0 0 [idle]
20287 8.25M none swoole-coroutine 0 0 3 0 0 [idle]
20288 8.25M none swoole-coroutine 0 0 3 0 0 [idle]
20289 8.25M none swoole-coroutine 0 0 3 0 0 [idle]
20290 8.25M none swoole-coroutine 0 0 3 0 0 [idle]
20291 8.25M none swoole-coroutine 0 0 3 0 0 [idle]
20292 8.25M none swoole-coroutine 0 0 3 0 0 [idle]
20293 8.49M none monitor 0 0 4 0 0 [idle]
---------------------------------------------------PROCESS STATUS--------------------------------------------------------
Summary 142.25M - - 0 0 44 0 0 [Summary]
[x] Swoole Coroutine 开始执行协程任务
[x] [写入文件] [0] 2025-01-03 22:47:09
[x] [发送邮件] [0] 2025-01-03 22:47:09
[x] [插入数据] [0] 2025-01-03 22:47:09
[x] [写入文件] [1] 2025-01-03 22:47:09
[x] [发送邮件] [1] 2025-01-03 22:47:09
[x] [插入数据] [1] 2025-01-03 22:47:09
[x] [写入文件] [2] 2025-01-03 22:47:09
[x] [发送邮件] [2] 2025-01-03 22:47:09
[x] [插入数据] [2] 2025-01-03 22:47:09
[x] [写入文件] [3] 2025-01-03 22:47:09
[x] [发送邮件] [3] 2025-01-03 22:47:09
[x] [插入数据] [3] 2025-01-03 22:47:09
[x] [写入文件] [4] 2025-01-03 22:47:09
[x] [发送邮件] [4] 2025-01-03 22:47:09
[x] [插入数据] [4] 2025-01-03 22:47:09
[x] [写入文件] [5] 2025-01-03 22:47:09
[x] [发送邮件] [5] 2025-01-03 22:47:09
[x] [插入数据] [5] 2025-01-03 22:47:09
[x] [发送邮件] [6] 2025-01-03 22:47:09
[x] [插入数据] [6] 2025-01-03 22:47:09
[x] [发送邮件] [7] 2025-01-03 22:47:09
[x] [插入数据] [7] 2025-01-03 22:47:09
[x] [发送邮件] [8] 2025-01-03 22:47:09
[x] [插入数据] [8] 2025-01-03 22:47:09
[x] [发送邮件] [9] 2025-01-03 22:47:09
[x] [插入数据] [9] 2025-01-03 22:47:09
[x] [发送邮件] [10] 2025-01-03 22:47:09
[x] [插入数据] [10] 2025-01-03 22:47:09
[x] [插入数据] [11] 2025-01-03 22:47:09
[x] [插入数据] [12] 2025-01-03 22:47:09
[x] [插入数据] [13] 2025-01-03 22:47:09
[x] [插入数据] [14] 2025-01-03 22:47:09
[x] [插入数据] [15] 2025-01-03 22:47:09
composer require swow/swow
开源技术小栈注意:
Swow
和Swoole
两个扩展只能选择开启一个,否则启动会报错
PHP Warning: Swow is incompatible with Swoole
because both of Swow and Swoole provide the similar functionality through
different implementations.
Please disable one of Swow or Swoole and re-run. in Unknown on line 0
PHP Fatal error: Unable to start Swow module in Unknown on line 0
开源技术小栈如何使用请看:webman如何使用swow事件驱动和协程?