-
我在配置文件中设置了 Constant::OPTION_WORKER_NUM=1 按照swoole的文档描述来说
我在 hyperf 里面配置成1 以后,如果单请求执行时间为1s时,服务只能请求一个程序,但是服务还是,可以并行的处理很多请求的,跟预期效果不相符这是我配置的问题? 还是bug? 单服务想增加大并发量的时候是否需要关心此参数?为了方便验证,我写了一个sleep(1)的简单程序
纯swoole代码
hyperf 配置
controller 代码
并行请求golang脚本
|
Beta Was this translation helpful? Give feedback.
Replies: 1 comment
-
为什么「纯 Swoole 代码」与「Hyperf 代码」的预期效果不一样?根本原因是两者的配置项不一样。 「纯 Swoole 代码」的 HTTP 服务仅设置了 worker_num 和 daemonize 两个配置项。 所以,只需要在「纯 Swoole 代码」的配置项中加入 hook_flags,并设置值为 SWOOLE_HOOK_ALL 或 SWOOLE_HOOK_SLEEP,就能得到跟「Hyperf 代码」一样的效果了。 <?php
$http = new Swoole\Http\Server('127.0.0.1', 9503);
//设置worker进程4个
$http->set([
'worker_num' => 1,
'daemonize' => false,
'hook_flags' => SWOOLE_HOOK_SLEEP, // 新增的配置项
]);
$http->on('start', function ($server) {
echo "Swoole http server is started at http://127.0.0.1:9503\n";
});
$http->on('request', function ($request, $response) {
$response->header('Content-Type', 'text/plain');
sleep(1);
echo "1\n";
$response->end('Hello World');
});
$http->start(); Constant::OPTION_WORKER_NUM 常量是跟 Swoole 里面的一个作用么?答:是的。 当你打开这个常量所在的文件会发现,这个常量的值是 为什么 Constant::OPTION_WORKER_NUM=1 不起作用?你贴的 Swoole 文档的描述是没有问题的,但是漏了这段描述之后「提示」的内容。 Hyperf 提供的是全异步 IO 的 HTTP 服务,而你的「纯 Swoole 代码」是同步 IO。 |
Beta Was this translation helpful? Give feedback.
为什么「纯 Swoole 代码」与「Hyperf 代码」的预期效果不一样?
根本原因是两者的配置项不一样。
「纯 Swoole 代码」的 HTTP 服务仅设置了 worker_num 和 daemonize 两个配置项。
而 Hyperf 除此之外还设置了hook_flags 配置项,默认值为 SWOOLE_HOOK_ALL,表示 hook 所有会发生阻塞的原生 PHP 函数,其中就包括了 sleep 函数。
所以,只需要在「纯 Swoole 代码」的配置项中加入 hook_flags,并设置值为 SWOOLE_HOOK_ALL 或 SWOOLE_HOOK_SLEEP,就能得到跟「Hyperf 代码」一样的效果了。