新年的第一天,Workerman v5 正式發(fā)布!這是一個(gè)全新的里程碑,凝聚了貢獻(xiàn)者們無數(shù)的心血與智慧。感謝每一位為 Workerman 貢獻(xiàn)代碼、提出建議、反饋問題的開發(fā)者,是你們讓這個(gè)項(xiàng)目不斷成長、完善。
v5 的發(fā)布標(biāo)志著性能與穩(wěn)定性的進(jìn)一步提升,協(xié)程的引入也為開發(fā)者們帶來了更多可能性。未來,我們將繼續(xù)攜手,共同推動(dòng) Workerman 的發(fā)展,為更多開發(fā)者提供強(qiáng)大的工具與支持。
注意
同一個(gè)Worker中Fiber協(xié)程、Swoole協(xié)程、Swow協(xié)程無法共存,只能使用其中一種。
不同Worker可以設(shè)置不同的協(xié)程驅(qū)動(dòng)類型
composer require revolt/event-loop ^1.0.0
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Events\Revolt;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Revolt::class;
$worker->onMessage = function (TcpConnection $connection, Request $request) {
$connection->send('hello workerman');
};
Worker::runAll();
測試代碼
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Events\Swoole;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class;
$worker->onMessage = function (TcpConnection $connection, Request $request) {
$connection->send('hello workerman');
};
Worker::runAll();
測試代碼
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Events\Swow;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swow::class;
$worker->onMessage = function (TcpConnection $connection, Request $request) {
$connection->send('hello workerman');
};
Worker::runAll();
websocket協(xié)議onWebSocketConnect
事件
$worker = new Worker('websocket://0.0.0.0:2345');
$worker->onWebSocketConnect = function (TcpConnection $connection, Request $request) {
// 不再支持 $_GET $_SERVER 獲取參數(shù),統(tǒng)一使用$request獲取參數(shù)
$token = $request->get('token');
};
Timer::public static function repeat($time, $callback, $args)
一次性定時(shí)器
相當(dāng)于 Timer::add($time, $callback, $args, false)
Timer::repeat($time, $callback, $args)
連續(xù)性定時(shí)器
相當(dāng)于 Timer::add($time, $callback, $args)
PHP引入?yún)f(xié)程后最大的作用就是可以用同步的方式編寫異步代碼,避免了回調(diào)地獄,提高了代碼的可讀性和可維護(hù)性。
引入?yún)f(xié)程后可以讓應(yīng)用有更好的彈性,尤其在慢IO的情況下,能大幅提升應(yīng)用性能。
但是引入?yún)f(xié)程后開發(fā)者需要時(shí)刻注意全局變量污染、資源競爭、第三方庫改造等問題,開發(fā)維護(hù)成本增大,心智負(fù)擔(dān)明顯增加。
引入?yún)f(xié)程后產(chǎn)生了協(xié)程創(chuàng)建、調(diào)度、銷毀、連接池等額外開銷。
不管通過swoole自己的壓測還是workerman的壓測,在充分利用資源的情況下,引入?yún)f(xié)程后性能比阻塞式IO,MySQL單查詢極限性能下降約5%-15%左右,PgSQL單查詢性能下降更多。
數(shù)據(jù)來源 techempower
盡管使用協(xié)程極限性能會(huì)下降,但是協(xié)程在慢IO的業(yè)務(wù)下會(huì)大幅度提高吞吐率。
請問有詳細(xì)的說明文檔嗎?
是不是可以這么理解:
只要升級(jí)到5.0,然后 $worker->eventLoop = Swoole::class; 這樣設(shè)置了,
整個(gè)系統(tǒng)就可以使用 swoole 中的協(xié)程了,例如:
go(function (){
//這里的邏輯就是在協(xié)程內(nèi)運(yùn)行了
});
老大,我composer里面安裝5.0,Root composer.json requires workerman/workerman ^5.0, found workerman/workerman[v5.0.0-beta.1, ..., v5.0.0-rc.3] but it does not match your minimum-stability.
我的配置
"require": {
"php": ">=8.1",
"workerman/workerman": "^5.0"
},