首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
重复给TCP服务器发送消息导致worker线程无响应,是否为存在内存泄漏的问题
客户端代码: <?php swoole_timer_tick(10, function () use ($client) { $client->send($data); }); 这样重复给swoole tcp服务器发送消息,每次发送840次左右,服务器就无响应了。必须重启才能接收新的请求。会不会是内存泄漏导致的? 服务器端代码: ```php /** * Created by PhpStorm. * User: Administrator * Date: 2016/1/8 * Time: 17:06 */ namespace service; class Server { protected $_logFile = 'server.log'; protected $_host = "0.0.0.0"; protected $_port = 9990; protected $_serverConfig = []; /** * @var \swoole_server */ protected $_server; /** * @var \swoole_process */ protected $_process; /** * @var \swoole_atomic */ protected $_taskNum; protected $_defaultServerConfig = [ 'worker_num' => 8, //工作进程数量 'task_worker_num' => 2, 'daemonize' => false, //是否作为守护进程 'open_length_check' => true, //打开包长检测 'package_max_length' => 8192000, //最大的请求包长度,8M 'package_length_type' => 'N', //长度的类型,参见PHP的pack函数 'package_length_offset' => 0, //第N个字节是包长度的值 'package_body_offset' => 4, //从第几个字节计算长度 ]; public function onConnect($server, $fd) { $this->log("Client:Connect. client id: " . $fd); } public function onReceive(\swoole_server $server, $fd, $from_id, $data) { // 检查task数 if($this->_taskNum->get()>100){ return; } $bool = $server->task($data); $this->_taskNum->add(1); if (!$bool) { $this->log('Task ERR!'); } else { $this->log('Task Suc!'); } } public function onClose($server, $fd) { $this->log("Client: Close."); } public function onTask(\swoole_server $server, $task_id, $from_id, $taskData) { $this->log('Task Start num=' . $this->_taskNum->get()); //业务逻辑处理 $server->finish(1); } public function onFinish(\swoole_server $server, $task_id, $data) { $this->log("Task#$task_id finished, data_len=" . strlen($data)); $this->_taskNum->sub(1); $this->log('Task Finish num=' . $this->_taskNum->get()); } public function serve() { $server = new \swoole_server($this->_host, $this->_port); $this->_server = $server; $this->_taskNum = new \swoole_atomic(0); $server->set($this->_serverConfig); $server->on('connect', [$this, 'onConnect']); $server->on('receive', [$this, 'onReceive']); $server->on('close', [$this, 'onClose']); $server->on('task', [$this, 'onTask']); $server->on('finish', [$this, 'onFinish']); $server->start(); } } ``` 我试过:1.7.1与1.8.2,都是同样的问题。
发布于9年前 · 4 次浏览 · 来自
提问
愿
愿你不再是木偶丶
客户端代码: <?php swoole_timer_tick(10, function () use ($client) { $client->send($data); }); 这样重复给swoole tcp服务器发送消息,每次发送840次左右,服务器就无响应了。必须重启才能接收新的请求。会不会是内存泄漏导致的? 服务器端代码: ```php /** * Created by PhpStorm. * User: Administrator * Date: 2016/1/8 * Time: 17:06 */ namespace service; class Server { protected $_logFile = 'server.log'; protected $_host = "0.0.0.0"; protected $_port = 9990; protected $_serverConfig = []; /** * @var \swoole_server */ protected $_server; /** * @var \swoole_process */ protected $_process; /** * @var \swoole_atomic */ protected $_taskNum; protected $_defaultServerConfig = [ 'worker_num' => 8, //工作进程数量 'task_worker_num' => 2, 'daemonize' => false, //是否作为守护进程 'open_length_check' => true, //打开包长检测 'package_max_length' => 8192000, //最大的请求包长度,8M 'package_length_type' => 'N', //长度的类型,参见PHP的pack函数 'package_length_offset' => 0, //第N个字节是包长度的值 'package_body_offset' => 4, //从第几个字节计算长度 ]; public function onConnect($server, $fd) { $this->log("Client:Connect. client id: " . $fd); } public function onReceive(\swoole_server $server, $fd, $from_id, $data) { // 检查task数 if($this->_taskNum->get()>100){ return; } $bool = $server->task($data); $this->_taskNum->add(1); if (!$bool) { $this->log('Task ERR!'); } else { $this->log('Task Suc!'); } } public function onClose($server, $fd) { $this->log("Client: Close."); } public function onTask(\swoole_server $server, $task_id, $from_id, $taskData) { $this->log('Task Start num=' . $this->_taskNum->get()); //业务逻辑处理 $server->finish(1); } public function onFinish(\swoole_server $server, $task_id, $data) { $this->log("Task#$task_id finished, data_len=" . strlen($data)); $this->_taskNum->sub(1); $this->log('Task Finish num=' . $this->_taskNum->get()); } public function serve() { $server = new \swoole_server($this->_host, $this->_port); $this->_server = $server; $this->_taskNum = new \swoole_atomic(0); $server->set($this->_serverConfig); $server->on('connect', [$this, 'onConnect']); $server->on('receive', [$this, 'onReceive']); $server->on('close', [$this, 'onClose']); $server->on('task', [$this, 'onTask']); $server->on('finish', [$this, 'onFinish']); $server->start(); } } ``` 我试过:1.7.1与1.8.2,都是同样的问题。
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2017-07-01
h
han3r
请贴出客户端测试的代码,另外是否有错误信息
赞
0
回复
2017-07-01
S
Sτrīvér
你的代码有问题 ```php // 检查task数 if($this->_taskNum->get()>100){ return; } ``` 计数器超过100就直接return了,服务器当然不会执行任何代码。
赞
0
回复
2017-07-06
H
Helo
重新看了一下你的代码,请检查PHP错误日志,未设置`task_worker_num`不可以使用task功能。
赞
0
回复
2017-11-01
P
PAA小敏
你应该是客户端没有接收吧,客户端不接收会导致服务端发送缓冲区满的,后续的就不发出去了
赞
0
回复