新年的第一天,Workerman v5 正式發(fā)布!這是一個(gè)全新的里程碑,凝聚了貢獻(xiàn)者們無(wú)數(shù)的心血與智慧。感謝每一位為 Workerman 貢獻(xiàn)代碼、提出建議、反饋問(wèn)題的開(kāi)發(fā)者,是你們讓這個(gè)項(xiàng)目不斷成長(zhǎng)、完善。
v5 的發(fā)布標(biāo)志著性能與穩(wěn)定性的進(jìn)一步提升,協(xié)程的引入也為開(kāi)發(fā)者們帶來(lái)了更多可能性。未來(lái),我們將繼續(xù)攜手,共同推動(dòng) Workerman 的發(fā)展,為更多開(kāi)發(fā)者提供強(qiáng)大的工具與支持。
注意
同一個(gè)Worker中Fiber協(xié)程、Swoole協(xié)程、Swow協(xié)程無(wú)法共存,只能使用其中一種。
不同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();
測(cè)試代碼
<?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();
測(cè)試代碼
<?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é)程后開(kāi)發(fā)者需要時(shí)刻注意全局變量污染、資源競(jìng)爭(zhēng)、第三方庫(kù)改造等問(wèn)題,開(kāi)發(fā)維護(hù)成本增大,心智負(fù)擔(dān)明顯增加。
引入?yún)f(xié)程后產(chǎn)生了協(xié)程創(chuàng)建、調(diào)度、銷毀、連接池等額外開(kāi)銷。
不管通過(guò)swoole自己的壓測(cè)還是workerman的壓測(cè),在充分利用資源的情況下,引入?yún)f(xié)程后性能比阻塞式IO,MySQL單查詢極限性能下降約5%-15%左右,PgSQL單查詢性能下降更多。
數(shù)據(jù)來(lái)源 techempower
盡管使用協(xié)程極限性能會(huì)下降,但是協(xié)程在慢IO的業(yè)務(wù)下會(huì)大幅度提高吞吐率。
請(qǐng)問(wèn)有詳細(xì)的說(shuō)明文檔嗎?
是不是可以這么理解:
只要升級(jí)到5.0,然后 $worker->eventLoop = Swoole::class; 這樣設(shè)置了,
整個(gè)系統(tǒng)就可以使用 swoole 中的協(xié)程了,例如:
go(function (){
//這里的邏輯就是在協(xié)程內(nèi)運(yùn)行了
});
webman中可以使用協(xié)程嘛
本身就是可選項(xiàng),只有在 config/process.php 里配置了eventLoop的進(jìn)程才會(huì)啟用。
比如想開(kāi)啟一個(gè)task進(jìn)程使用協(xié)程處理數(shù)據(jù),在 config/process.php 新加一個(gè)task進(jìn)程配置項(xiàng),eventLoop 設(shè)置為 swoole 或者 swow,這樣只有task進(jìn)程開(kāi)啟了協(xié)程,其它進(jì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"
},