php内存泄露,系统缓存消耗?

前言:持续我一贯的标题党作风,说说例子解决方案,没有深入探讨。

 

情景:线上图片服务压缩的图片品质(100),缩略图品质(100)占用了很多空间,导致后来又55个文件了(占用空间160G)才发现这个问题。现在需要解决的是把这部分压缩个低品质的缩略图节省空间(当然在这个硬盘白菜价的时代搞这样的问题没这个必要,我这里讨论的不是节省空间是想找出内存消耗问题)。我用php脚本重新生成缩略图的时候,通过top发现内存消耗一直增加导致后来脚本报错内存不够了,到底谁动了我的内存?

 

处理代码版本一(php):

 

Php代码   收藏代码
  1. set_time_limit(0);  
  2.   
  3. function thumbnailimage($img,$width,$height,$savefile){  
  4.     $new_img = imagecreatetruecolor ( $width$height );  
  5.     imagedestroy($new_img);  
  6. }  
  7. //$list:是那个55万的文件名  
  8. foreache($list as $v) {  
  9.     $img = imagecreatefromjpeg($v);  
  10.     thumbnailimage($img,480,300,$savepath);  
  11.     imagedestroy($img);  
  12. }  
 

 

这个脚本处理了5千多个的时候,由于内存不够用挂了,然后我改了php.ini里面的memory_limit改成了5G,但是随着脚本的执行,内存也会被消耗殆尽。

于是我就以为是php的内存泄露了,然后就想用其他方案解决,在老王的技术手册里面看到GraphicsMagick这个工具,然后写了个脚本去处理,结果发现top看到的内存消耗还是一直增加,然后经人提示这个应该是系统操作文件(写文件)文件被缓存了消耗了内存,

调整bash脚本,处理一张图片后手动释放一下内存(sync && echo 3 > /proc/sys/vm/drop_caches),然后top看到的内存消耗就正常了。

由于这个bash脚本处理的速度还不如php的gd库处理,然后就换成php处理。

验证php脚本内存消耗的原因:

处理代码版本二(php):

 

Php代码   收藏代码
  1. set_time_limit(0);  
  2.   
  3. function thumbnailimage($img,$width,$height,$savefile){  
  4. $new_img = imagecreatetruecolor ( $width$height );  
  5. ...  
  6. imagedestroy($new_img);  
  7. }  
  8. //$list:是那个55万的文件名  
  9. foreache($list as $v) {  
  10.     $memory1=memory_get_usage();  
  11.     file_put_contents('memory','memory1:'.$memory1."\n",FILE_APPEND);  
  12.       
  13.     $img = imagecreatefromjpeg($v);  
  14.     thumbnailimage($img,480,300,$savepath);  
  15.     imagedestroy($img);  
  16.       
  17.     $memory1=memory_get_usage();  
  18.     file_put_contents('memory','memory1:'.$memory1."\n",FILE_APPEND);  
  19.       
  20.     system('sync && echo 3 > /proc/sys/vm/drop_caches');  
  21. }  
 

通这个版本处理内存消耗就正常了,当然php进程也要消耗内存,php.ini的memory_limit稍微改大一下。

从这里看来消耗内存的是系统操作文件消耗的,不是php,由于我的无知一开始错怪了PHP。

 

结尾:这个例子只是简单的描述我找到内存消耗的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值