首页
下载
文档
社区
视频
捐赠
源代码
赞助商
AOT 编译器
AI 助理
商业产品
PHP AOT 原生编译器
Swoole-Compiler 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
求助定时器任务进程内存不断增长问题
### 问题描述 定时器任务一直运行,top命令中能看到进程中的内存挺大,但是也没有报php超出最大内存限制问题,实际上php设置的最大内存是很小的,就感觉任务进程的内存大到一定时候就不会增长那么快,服务器运行时间一长,就会死机,需要重启。 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.7.0 php 7.3.29 centos 7.9.2009 ### 相关代码 ```php class Record { private function my_curl($key) { //这里发起curl请求获取数据 } //保存到csv文件 private function save_csv_file($filekey, $data) { $filename = APPPATH . '/database_csv/' . date('Ym') . '_' . $filekey . '.csv'; $fp = fopen($filename, 'a'); fputcsv($fp, $data); fclose($fp); } //获取数据 public function save($key) { $result = $this->my_curl($key); if ($result === false || empty($result->data)) { return; } $idata = [ 'field1 ' => $result->data->field1, 'field2 ' => $result->data->field2, 'field3 ' => $result->data->field3, ]; $this->save_csv_file($key, $idata); } //运行 public function run() { Swoole\Timer::tick(1000, function () { $this->save('a'); }); Swoole\Timer::tick(1000, function () { $this->save('b'); }); Swoole\Timer::tick(1000, function () { $this->save('c'); }); Swoole\Timer::tick(1000, function () { $this->save('d'); }); } } ``` 运行命令,并使其常驻进程 php index.php record run ### 你期待的结果是什么?实际看到的错误信息又是什么? 没有错误信息,就是运行一段时间进程占用内存越来越高,然后服务器就容易死机,我猜测是内存不够系统运行了,不知道为啥。下图中前面几个进程都是上面的任务,都会内存占用高。 
发布于5年前 · 35 次浏览 · 来自
提问
AndyE
### 问题描述 定时器任务一直运行,top命令中能看到进程中的内存挺大,但是也没有报php超出最大内存限制问题,实际上php设置的最大内存是很小的,就感觉任务进程的内存大到一定时候就不会增长那么快,服务器运行时间一长,就会死机,需要重启。 ### Swoole版本,PHP版本,以及操作系统版本信息 swoole 4.7.0 php 7.3.29 centos 7.9.2009 ### 相关代码 ```php class Record { private function my_curl($key) { //这里发起curl请求获取数据 } //保存到csv文件 private function save_csv_file($filekey, $data) { $filename = APPPATH . '/database_csv/' . date('Ym') . '_' . $filekey . '.csv'; $fp = fopen($filename, 'a'); fputcsv($fp, $data); fclose($fp); } //获取数据 public function save($key) { $result = $this->my_curl($key); if ($result === false || empty($result->data)) { return; } $idata = [ 'field1 ' => $result->data->field1, 'field2 ' => $result->data->field2, 'field3 ' => $result->data->field3, ]; $this->save_csv_file($key, $idata); } //运行 public function run() { Swoole\Timer::tick(1000, function () { $this->save('a'); }); Swoole\Timer::tick(1000, function () { $this->save('b'); }); Swoole\Timer::tick(1000, function () { $this->save('c'); }); Swoole\Timer::tick(1000, function () { $this->save('d'); }); } } ``` 运行命令,并使其常驻进程 php index.php record run ### 你期待的结果是什么?实际看到的错误信息又是什么? 没有错误信息,就是运行一段时间进程占用内存越来越高,然后服务器就容易死机,我猜测是内存不够系统运行了,不知道为啥。下图中前面几个进程都是上面的任务,都会内存占用高。 
赞
0
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
登录
后参与评论
评论
2021-08-30
1
16620******
我这边也遇到跟你一样的问题,但是排查来排查去没发现明显问题。 我之前的排查结果 php7.2 swoole4.5.6 centos7 - 怀疑是自己程序内存泄漏,检查半天没发现 - 跟你一样怀疑定时任务问题,但是也跑了半天没发现(疑似内存碎片管理问题) - 怀疑细微的内存碎片回收不及时导致的,gc_mem_caches(); gc_collect_cycles();还是那个鬼样。 > 临时解决方案 1.定时重启 2.按照执行任务次数到了就重启
赞
0
回复
2021-09-01
AndyE
回复
16620******
谢谢,我现在也是只有重启,会丢失2、3秒的数据。。。
赞
0
回复