怎么修改源碼讓workerman的http轉(zhuǎn)為非阻塞呀
訪問外部http接口用 workerman/http-client ,是非阻塞的
workerman是php開發(fā)的框架,不會改變php的行為,如果你調(diào)用的php函數(shù)是阻塞函數(shù),那就是阻塞的,否則就是非阻塞的。
swoole是一個擴展,可以改變php的行為,比如阻塞調(diào)用變成協(xié)程非阻塞,不過開啟協(xié)程要使用上下文,考慮全局變量污染問題,如果使用了第三方庫需要對其改造,開發(fā)商會有一點難度。
就是單單的創(chuàng)建一個workerman的http服務(wù)和swoole的協(xié)程http服務(wù)內(nèi)寫同樣的時間打印出現(xiàn)時間方面相應(yīng)有幾百微秒的差別
進不來。如果有阻塞調(diào)用想提高并發(fā),設(shè)置$worker->reusePort=true;
, 增加進程數(shù)就好了。比如進程開到cpu的4倍。
如果你喜歡swoole的協(xié)程,也可以設(shè)置swoole為底層驅(qū)動
<?php
require 'vendor/autoload.php';
use Workerman\Events\Swoole;
use Workerman\Worker;
Worker::$eventLoopClass = Swoole::class;
$worker = new Worker('http://0.0.0.0:9898');
$worker->onWorkerStart = function () {
Swoole\Runtime::enableCoroutine(SWOOLE_HOOK_ALL);
};
$worker->onMessage = function ($connection, $request) {
$connection->send('hello');
};
Worker::runAll();
這樣workerman也具有swoole的協(xié)程能力了。
使用協(xié)程后需要改造第三方庫,包括避免全局變量污染、全局變量使用context、避免協(xié)程同時公用同一個資源例如數(shù)據(jù)庫。反正就是解決同一個進程并發(fā)執(zhí)行導(dǎo)致的問題。
可以結(jié)合yield,PHP的自帶的協(xié)程,迭代器。不過需要注意上面老哥說的,在攜程中要注意上下文變量,因為你一旦使用了迭代器,在當(dāng)前進程中就不是單線程的阻塞了,而是一個多線程的環(huán)境,如果你自己能處理或者第三方的包可以區(qū)別上下文就行
問的應(yīng)該是http-server吧?
amphp出了一個 amphp/http-server(一個進程處理多個請求,一個請求阻塞則掛起,繼續(xù)處理其他請求?)