PHP内存占用如何限制?

PHP内存占用如何限制?

野心澎湃 发布于 2021-11-30 字数 3596 浏览 979 回复 11

执行命令行的laravel PHP artisan脚本(php artisan brainsocket:start --port=8080),启动一个web socket服务,当用户量上来的时候,内存总是会慢慢跑满,以至于服务宕掉,如何解决?

top - 17:41:55 up 123 days,  2:51,  1 user,  load average: 0.98, 0.64, 0.49
Tasks: 104 total,   2 running, 102 sleeping,   0 stopped,   0 zombie
Cpu(s): 77.6%us, 12.8%sy,  0.0%ni,  0.0%id,  8.9%wa,  0.0%hi,  0.4%si,  0.3%st
Mem:   1017972k total,   883840k used,   134132k free,    14308k buffers
Swap:        0k total,        0k used,        0k free,    96324k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                         
24233 root      20   0  181m  68m 6776 R 86.1  6.9   1:52.58 php                                                                                              
32498 www       20   0  208m  26m 6136 S  0.5  2.7   0:18.54 httpd                                                                                            
 6975 www       20   0  208m  26m 6428 S  0.4  2.7   0:13.80 httpd                                                                                            
19170 www       20   0  208m  28m 7656 S  0.4  2.8   0:04.13 httpd                                                                                            
24380 www       20   0  210m  27m 6012 S  0.3  2.8   0:25.70 httpd                                                                                            
 7338 root      20   0  673m  11m 2956 S  0.3  1.2 209:07.32 AliYunDun                                                                                        
 8860 www       20   0  210m  28m 6572 S  0.3  2.9   0:13.98 httpd                                                                                            
19468 www       20   0  201m  19m 6184 S  0.3  1.9   0:04.05 httpd                                                                                            
23171 www       20   0  201m  19m 6244 S  0.3  1.9   0:02.70 httpd                                                                                            
15173 root      20   0  669m 8060 2704 S  0.2  0.8  63:21.96 AliHids     

htop

 CPU[||||||||||||||||||||||||||||||||||||||||||||||||||||99.3%]     Tasks: 64, 57 thr; 2 running
  Mem[||||||||||||||||||||||||||||||||||||||||||||||||636/994MB]     Load average: 1.00 0.68 0.37 
  Swp[                                                    0/0MB]     Uptime: 123 days(!), 19:05:51

  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
28858 root       20   0  202M 91680  6776 R 97.0  9.0  5:54.93 php artisan brainsocket:start --port=8080
29054 root       20   0 24508  2184  1448 R  1.0  0.2  0:00.06 htop

web socket 挂掉时的错误:

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 33151019 bytes) 
in /alidata/www/wcketbtn/vendor/react/stream/src/Buffer.php on line 118
{"error":{"type":"Symfony\Component\Debug\Exception\FatalErrorException",
"message":"Allowed memory size of 134217728 bytes exhausted (tried to allocate 33151019 bytes)",
"file":"/alidata/www/wketbtn/vendor/react/stream/src/Buffer.php","line":118}}

或者有什么方法能监控,如果stop了,就执行php artisan brainsocket:start --port=8080

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

反目相谮 2021-12-01 11 楼

代码写的不好

梅窗月明清似水 2021-12-01 10 楼

怎么找出那个只会增加的变量?我确实觉得是这个原因导致

回忆凄美了谁 2021-12-01 9 楼

楼主要确定一点是php cli的内存使用是否是随着连接数量增减,如果只增不减就要考虑是不是有变量未释放导致的内存泄漏

夜无邪 2021-12-01 8 楼

还是要找出哪里吃内存,是应用程序服务器还是php解析器,还是数据库,还是哪里

画骨成沙 2021-12-01 7 楼

http://xdebug.org/docs/execution_trace

配置:

xdebug.auto_trace = 1

xdebug.trace_output_dir = "/png/php/xdebug"

xdebug.trace_format = 0

xdebug.show_mem_delta = 1

xdebug.collect_params = 4

;xdebug.collect_return = 1

代码:

/home/eechen/test.php

<?php

while(1) {

    $a = time();

    sleep(1);

}

内容(trace.56974371.xt):

0.0002     231280  +231280   -> {main}() /home/eechen/test.php:0

0.0002     231888     +608     -> time() /home/eechen/test.php:3

0.0003     232072     +184     -> sleep(1) /home/eechen/test.php:4

1.0005     232024      -48     -> time() /home/eechen/test.php:3

1.0006     232072      +48     -> sleep(1) /home/eechen/test.php:4

2.0009     232024      -48     -> time() /home/eechen/test.php:3

2.0010     232072      +48     -> sleep(1) /home/eechen/test.php:4

第一列显示时间,第二列是累计的内存使用量,第三列是增加或减少的内存使用量,第四列显示函数调用,包括参数.

各自安好 2021-12-01 6 楼

1.通过ini_set 可以限制,导致问题就是php脚本跑到这个内存限制,进程就是down掉,但是不至于拖垮服务器。

2. 找到内存占用的点,代码上做限制。

左岸枫 2021-12-01 5 楼

可是再大的内存,总有跑尽的时候呀,我PHP动态设置了内存限制,可还是跑挂了,我也不太清楚哪个环节导致内存积累

瀞厅☆埖开 2021-12-01 4 楼

php.ini的内存限制默认为memory_limit = 128M

你的cli脚本超过了这个内存限制就会被终止,你可以把值设大点,设为-1则表示不限制内存使用.

梅窗月明清似水 2021-12-01 3 楼

Swoole作者韩天峰:虎牙游戏直播基于PHP+Swoole实现了TCP的长连接推送服务,仅用2台机器就支持了50万人同时连接在线,峰值每秒推送10万条消息。建立了一套完整推送服 务方案,提供了的移动端在线/离线PUSH、消息持久化、在线用户与设备状态管理、广播任务分发排队、外部调用API等功能。

韬韬不绝 2021-12-01 2 楼

Swoole这个PECL扩展支持WebSocket编程,提供有Swoole Framework这个针对Swoole使用的PHP框架.

Swoole HTTP WebSocket聊天室PHPWebIM:


http://webim.swoole.com/

百思不得你姐 2021-11-30 1 楼

你如果用php-fpm的话,说不定可以考虑cgroup,apache说不定也可以