前言:持续我一贯的标题党作风,说说例子解决方案,没有深入探讨。
情景:线上图片服务压缩的图片品质(100),缩略图品质(100)占用了很多空间,导致后来又55个文件了(占用空间160G)才发现这个问题。现在需要解决的是把这部分压缩个低品质的缩略图节省空间(当然在这个硬盘白菜价的时代搞这样的问题没这个必要,我这里讨论的不是节省空间是想找出内存消耗问题)。我用php脚本重新生成缩略图的时候,通过top发现内存消耗一直增加导致后来脚本报错内存不够了,到底谁动了我的内存?
处理代码版本一(php):
set_time_limit(0);
function thumbnailimage($img,$width,$height,$savefile){
$new_img = imagecreatetruecolor ( $width, $height );
imagedestroy($new_img);
}
//$list:是那个55万的文件名
foreache($list as $v) {
$img = imagecreatefromjpeg($v);
thumbnailimage($img,480,300,$savepath);
imagedestroy($img);
}
这个脚本处理了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):
set_time_limit(0);
function thumbnailimage($img,$width,$height,$savefile){
$new_img = imagecreatetruecolor ( $width, $height );
...
imagedestroy($new_img);
}
//$list:是那个55万的文件名
foreache($list as $v) {
$memory1=memory_get_usage();
file_put_contents('memory','memory1:'.$memory1."\n",FILE_APPEND);
$img = imagecreatefromjpeg($v);
thumbnailimage($img,480,300,$savepath);
imagedestroy($img);
$memory1=memory_get_usage();
file_put_contents('memory','memory1:'.$memory1."\n",FILE_APPEND);
system('sync && echo 3 > /proc/sys/vm/drop_caches');
}
通这个版本处理内存消耗就正常了,当然php进程也要消耗内存,php.ini的memory_limit稍微改大一下。
从这里看来消耗内存的是系统操作文件消耗的,不是php,由于我的无知一开始错怪了PHP。
结尾:这个例子只是简单的描述我找到内存消耗的原因。
分享到:
相关推荐
使用缓存系统如Redis或Memcached来存储和检索经常访问的数据,减少数据库查询和内存压力。 综上所述,提高PHP内存涉及到多个层面,包括理解内存限制、修改配置、代码优化、使用内存管理工具以及制定有效的数据处理...
【深入解析PHP内存管理之谁动了我的内存】 在PHP中,内存管理是一个复杂而关键的话题。这篇文章主要探讨了PHP如何处理内存分配与释放,以及在特定情况下内存使用的变化。首先,我们通过一个简单的示例代码来引入...
这有助于你在不同阶段查看内存消耗的变化,从而找出可能的内存泄漏或者过度使用的情况。 除了`$this->benchmark->memory_usage()`方法,CodeIgniter还提供了一个模板伪变量`{memory_usage}`。这是一个预定义的变量...
2. **内存保护**:增强了内存保护机制,防止因内存泄漏或溢出导致的安全问题。 3. **函数限制**:禁止了某些可能导致安全风险的函数,如`eval()`。 ### 四、安装与编译 要使用PHP 7.2源码包,首先需要确保系统上...
合理配置OPcache的缓存大小、生命周期等参数,可以有效减少CPU和内存的消耗。 2. memory_limit:内存限制是影响PHP性能的关键因素。根据应用的需求,适当增大memory_limit可以避免内存不足导致的错误,但也不能过大...
Memcache是一款强大的分布式内存对象缓存系统,其设计目标是减轻数据库负载,提高Web应用的响应速度。本文将深入探讨PHP如何利用Memcache实现高效的数据缓存。 一、Memcache系统概述 Memcache的核心理念是将经常...
【LAMP系统性能调优】是指针对Linux操作系统、Apache HTTP服务器、MySQL数据库和PHP脚本语言组成的开源Web应用平台进行优化的过程。这篇文章主要探讨了如何优化Apache和PHP以提升整个系统的性能。 Apache作为世界上...
3. **性能优化**:通过缓存经常访问的代码,APC能减少服务器资源的消耗,提高响应时间和整体系统性能。 **APC扩展的DLL文件** 在Windows环境下,PHP的扩展通常以DLL动态链接库的形式存在。对于PHP 5.4版本,...
这个错误通常发生在处理大型数据集、递归操作或者内存泄漏时。以下是一些关于如何识别和解决这个问题的详细知识。 1. **内存限制的理解**: PHP的`memory_limit`配置选项定义了脚本可以使用的最大内存。默认值可能...
4. **内存管理**:APC提供了内存分配和回收机制,有效管理内存使用,避免内存泄漏。 最后,Apache Benchmark(ab)是一款简单但强大的压力测试工具,用于测试Web服务器的性能。使用ab,开发者可以模拟大量并发用户...
2. **缓存系统**:Laravel提供了多种缓存驱动,如文件、数据库、Redis、Memcached等,它们可以帮助开发者将频繁访问的数据暂存到内存中,提高读取速度,减轻数据库压力。通过配置`config/cache.php`,可以选择最适合...
通过监控内存使用情况,可以及时发现内存泄漏等问题。 - **磁盘I/O**:频繁的磁盘读写操作会显著影响服务器性能。优化磁盘I/O可以有效提升服务器的整体性能。 - **网络带宽**:网络传输速度直接影响着用户访问网站的...
2. **内存使用**:通过探针,可以实时监测PHP脚本的内存消耗,了解是否有内存泄漏或不合理的内存使用情况。 3. **CPU使用率**:探针会展示CPU占用情况,帮助识别CPU密集型任务,优化代码以减轻服务器负担。 4. **...
28. **memcached**:使用memcached作为内存对象缓存,减轻数据库负载,提升动态应用性能。 29. **IP地址存储**:将IP地址转换为整型存储,节省数据库空间,便于排序和搜索。 30. **checkdnsrr**:使用checkdnsrr...
3. **内存管理**:探讨如何有效地管理PHP程序的内存,包括使用引用、对象池,以及理解PHP内存模型和内存泄漏的预防。 4. **PHP扩展和C优化**:了解编写PHP扩展的方法,利用C语言实现性能敏感的部分,以提升PHP代码...
例如,配置文件中可以设置初始启动的进程数为50,最小空闲进程数为15,最大空闲进程数为30,同时处理的最大客户端连接数为225,每个进程处理的最多请求数为4000,以防止内存泄漏。 worker模型采用多进程多线程方式...
- **定期维护**:定期进行性能监控,及时发现并解决瓶颈问题,如内存泄漏、磁盘碎片等。 - **监控与日志**:使用如Nagios、Zabbix等工具监控系统状态,通过Logrotate管理日志,便于故障排查。 综上所述,LAMP...
3. **内存和CPU使用情况**:探针能够实时监测服务器的内存使用和CPU负载,这对于识别性能瓶颈和防止资源过度消耗非常有用。 4. **错误和日志**:探针可能会提供错误报告功能,帮助开发者快速定位代码中的错误或异常...
5. **资源管理**:合理管理文件系统、内存和数据库连接等资源,例如,及时关闭不再使用的数据库连接,使用PHP的垃圾回收机制,避免内存泄漏。 6. **HTTP缓存**:利用HTTP头部的Cache-Control和Expires字段,可以...
然而,不当使用引用可能导致内存泄漏,因此需要谨慎使用。 8. **减少函数调用**: - 函数调用有额外的开销,特别是对于嵌套函数。考虑将常用功能封装成类的方法,或者使用内联代码。 9. **优化循环**: - 在循环...