怎么修改源码让workerman的http转为非阻塞呀
访问外部http接口用 workerman/http-client ,是非阻塞的
就是在创建http服务,我打印了同时访问的时候有阻塞,在swoole中的http服务没有出现阻塞
是打印时间戳的时候
workerman是php开发的框架,不会改变php的行为,如果你调用的php函数是阻塞函数,那就是阻塞的,否则就是非阻塞的。 swoole是一个扩展,可以改变php的行为,比如阻塞调用变成协程非阻塞,不过开启协程要使用上下文,考虑全局变量污染问题,如果使用了第三方库需要对其改造,开发商会有一点难度。
没有打印hello的时候workerman可以看出来有阻塞
没有任何阻塞函数
你的代码怎么写的?你怎么看出来阻塞的?
就是单单的创建一个workerman的http服务和swoole的协程http服务内写同样的时间打印出现时间方面相应有几百微秒的差别
打印是阻塞函数,echo 'hello'; 实际上就是 fwrite(STDOUT, 'hello');,向 fd为2的文件写入数据
echo 'hello';
fwrite(STDOUT, 'hello');
当一个进程还没执行完的话,那么其他想进入这个进程的话就进不来了吗
进不来。如果有阻塞调用想提高并发,设置$worker->reusePort=true;, 增加进程数就好了。比如进程开到cpu的4倍。 如果你喜欢swoole的协程,也可以设置swoole为底层驱动
$worker->reusePort=true;
<?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的协程能力了。 使用协程后需要改造第三方库,包括避免全局变量污染、全局变量使用context、避免协程同时公用同一个资源例如数据库。反正就是解决同一个进程并发执行导致的问题。
大佬可以帮我看看不
可以结合yield,PHP的自带的协程,迭代器。不过需要注意上面老哥说的,在携程中要注意上下文变量,因为你一旦使用了迭代器,在当前进程中就不是单线程的阻塞了,而是一个多线程的环境,如果你自己能处理或者第三方的包可以区别上下文就行
php用了yield结合event-loop依然是单线程,只不过在上下文顺序上可能和自己所写的顺序不同,导致数据污染
swoole/swow区别于php,是在当前php线程上增加了独立的另一个线程,用于处理协程的调度和分配,所以是多线程的情况
workerman5可以了
workerman5发布了吗?
https://github.com/walkor/workerman/tree/v5.0.0-beta.4
问的应该是http-server吧? amphp出了一个 amphp/http-server(一个进程处理多个请求,一个请求阻塞则挂起,继续处理其他请求?)
访问外部http接口用 workerman/http-client ,是非阻塞的
就是在创建http服务,我打印了同时访问的时候有阻塞,在swoole中的http服务没有出现阻塞
是打印时间戳的时候
workerman是php开发的框架,不会改变php的行为,如果你调用的php函数是阻塞函数,那就是阻塞的,否则就是非阻塞的。
swoole是一个扩展,可以改变php的行为,比如阻塞调用变成协程非阻塞,不过开启协程要使用上下文,考虑全局变量污染问题,如果使用了第三方库需要对其改造,开发商会有一点难度。
没有打印hello的时候workerman可以看出来有阻塞
没有任何阻塞函数
你的代码怎么写的?你怎么看出来阻塞的?
就是单单的创建一个workerman的http服务和swoole的协程http服务内写同样的时间打印出现时间方面相应有几百微秒的差别
打印是阻塞函数,
echo 'hello';
实际上就是fwrite(STDOUT, 'hello');
,向 fd为2的文件写入数据当一个进程还没执行完的话,那么其他想进入这个进程的话就进不来了吗
进不来。如果有阻塞调用想提高并发,设置
$worker->reusePort=true;
, 增加进程数就好了。比如进程开到cpu的4倍。如果你喜欢swoole的协程,也可以设置swoole为底层驱动
这样workerman也具有swoole的协程能力了。
使用协程后需要改造第三方库,包括避免全局变量污染、全局变量使用context、避免协程同时公用同一个资源例如数据库。反正就是解决同一个进程并发执行导致的问题。
大佬可以帮我看看不
可以结合yield,PHP的自带的协程,迭代器。不过需要注意上面老哥说的,在携程中要注意上下文变量,因为你一旦使用了迭代器,在当前进程中就不是单线程的阻塞了,而是一个多线程的环境,如果你自己能处理或者第三方的包可以区别上下文就行
php用了yield结合event-loop依然是单线程,只不过在上下文顺序上可能和自己所写的顺序不同,导致数据污染
swoole/swow区别于php,是在当前php线程上增加了独立的另一个线程,用于处理协程的调度和分配,所以是多线程的情况
workerman5可以了
workerman5发布了吗?
https://github.com/walkor/workerman/tree/v5.0.0-beta.4
问的应该是http-server吧?
amphp出了一个 amphp/http-server(一个进程处理多个请求,一个请求阻塞则挂起,继续处理其他请求?)