Home
Download
Document
Forum
Video
Donate
Source Code
AI 助理
Sponsors
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
Products
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
Login
Register
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
同步阻塞客户端的recv方法感觉有异常(偏慢)
### 问题描述 同步阻塞客户端的recv方法感觉有异常 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.8.6 php 8.1.1 CentOS Linux release 8.5.2111 ### 相关代码 ```php <?php if(php_sapi_name() !== 'cli'){ die(''.__LINE__); } try { $server = new Swoole\Server('/tmp/swoole_x_server.sock', null, SWOOLE_PROCESS, SWOOLE_UNIX_STREAM); } catch (Exception $e) { die(''.__LINE__); } $server->set([ 'daemonize' => ($argv[1] === 'debug') ? false : false, 'pid_file' => '/tmp/swoole_x_server.pid', 'log_file' => '/tmp/swoole_x_server.log', 'max_connection' => 1024, 'max_request' => 0, 'enable_coroutine' => false, 'reactor_num' => 1, 'worker_num' => 1, 'task_worker_num' => 0, 'open_length_check' => 1, 'package_length_type' => 'V', 'package_length_offset' => 1, //第N个字节是包长度的值 'package_body_offset' => 5, //第几个字节开始计算长度 ]); $server->on('start', function(Swoole\Server $server) { foreach ([$server->setting['pid_file'], $server->setting['log_file'], '/tmp/swoole_x_server.sock'] as $file){ if(file_exists($file) == true){ chmod($file, 0777); } } }); $server->on('connect', function(Swoole\Server $server, int $fd, int $reactorId) { }); $server->on('receive', function(Swoole\Server $server, int $fd, int $reactorId, string $data) { if(! $body = substr($data, 5)){ } $response = json_encode([]); $data = 'P'; $data .= pack("V", strlen($response)); //包体长度 $data .= $response; $server->send($fd, $data); }); $server->on('close', function (Swoole\Server $server, int $fd, int $reactorId) { }); $server->start(); ``` ```php <?php $client = new Swoole\Client(SWOOLE_SOCK_UNIX_STREAM); $client->set(array( 'open_length_check' => 1, 'package_length_type' => 'V', 'package_length_offset' => 1, //第N个字节是包长度的值 'package_body_offset' => 5 //第几个字节开始计算长度 )); if(! $client->connect('/tmp/swoole_x_server.sock', null, 1)){ die(''.__LINE__); } $start = microtime(true); for($i=0; $i<100000; $i++){ $body = json_encode([]); $data = 'P'; $data .= pack("V", strlen($body)); //包体长度 $data .= $body; if(! $client->send($data)){ die(''.__LINE__); } if(! $data = $client->recv()){ //这个接口10万次要20秒之多 die(''.__LINE__); } } echo microtime(true) - $start; ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 把$client->recv()注释掉只要0.几秒,否则要20几秒,不正常不?
发布于2年前 · 11 次浏览 · 来自
提问
弯刀
### 问题描述 同步阻塞客户端的recv方法感觉有异常 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.8.6 php 8.1.1 CentOS Linux release 8.5.2111 ### 相关代码 ```php <?php if(php_sapi_name() !== 'cli'){ die(''.__LINE__); } try { $server = new Swoole\Server('/tmp/swoole_x_server.sock', null, SWOOLE_PROCESS, SWOOLE_UNIX_STREAM); } catch (Exception $e) { die(''.__LINE__); } $server->set([ 'daemonize' => ($argv[1] === 'debug') ? false : false, 'pid_file' => '/tmp/swoole_x_server.pid', 'log_file' => '/tmp/swoole_x_server.log', 'max_connection' => 1024, 'max_request' => 0, 'enable_coroutine' => false, 'reactor_num' => 1, 'worker_num' => 1, 'task_worker_num' => 0, 'open_length_check' => 1, 'package_length_type' => 'V', 'package_length_offset' => 1, //第N个字节是包长度的值 'package_body_offset' => 5, //第几个字节开始计算长度 ]); $server->on('start', function(Swoole\Server $server) { foreach ([$server->setting['pid_file'], $server->setting['log_file'], '/tmp/swoole_x_server.sock'] as $file){ if(file_exists($file) == true){ chmod($file, 0777); } } }); $server->on('connect', function(Swoole\Server $server, int $fd, int $reactorId) { }); $server->on('receive', function(Swoole\Server $server, int $fd, int $reactorId, string $data) { if(! $body = substr($data, 5)){ } $response = json_encode([]); $data = 'P'; $data .= pack("V", strlen($response)); //包体长度 $data .= $response; $server->send($fd, $data); }); $server->on('close', function (Swoole\Server $server, int $fd, int $reactorId) { }); $server->start(); ``` ```php <?php $client = new Swoole\Client(SWOOLE_SOCK_UNIX_STREAM); $client->set(array( 'open_length_check' => 1, 'package_length_type' => 'V', 'package_length_offset' => 1, //第N个字节是包长度的值 'package_body_offset' => 5 //第几个字节开始计算长度 )); if(! $client->connect('/tmp/swoole_x_server.sock', null, 1)){ die(''.__LINE__); } $start = microtime(true); for($i=0; $i<100000; $i++){ $body = json_encode([]); $data = 'P'; $data .= pack("V", strlen($body)); //包体长度 $data .= $body; if(! $client->send($data)){ die(''.__LINE__); } if(! $data = $client->recv()){ //这个接口10万次要20秒之多 die(''.__LINE__); } } echo microtime(true) - $start; ``` ### 你期待的结果是什么?实际看到的错误信息又是什么? 把$client->recv()注释掉只要0.几秒,否则要20几秒,不正常不?
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2022-01-27
弯刀
https://github.com/swoole/swoole-src/tree/master/examples/unixsock 用这个官方的测试,client中循环recv 10万次,也是要20秒,应该哪里有问题
赞
0
回复
2022-01-29
鲁飞
这个和服务器端性能有关。
赞
0
回复
微信公众号
热门内容
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。