|
我在配置文件中设置了 Constant::OPTION_WORKER_NUM=1 按照swoole的文档描述来说
我在 hyperf 里面配置成1 以后,如果单请求执行时间为1s时,服务只能请求一个程序,但是服务还是,可以并行的处理很多请求的,跟预期效果不相符这是我配置的问题? 还是bug? 单服务想增加大并发量的时候是否需要关心此参数?为了方便验证,我写了一个sleep(1)的简单程序
纯swoole代码hyperf 配置controller 代码并行请求golang脚本 |
Answered by
her-cat
Sep 21, 2022
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。 |
0 replies
Answer selected by
limingxinleo
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment

为什么「纯 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 代码」一样的效果了。