php什么情况内存泄露

php什么情况内存泄露

内容导读

收集整理的这篇技术教程文章主要介绍了php什么情况内存泄露,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2307字,纯文字阅读大概需要4分钟

内容图文

情况一、程序操作数据过大

情景还原:一次性读取超过php可用内存上限的数据导致内存耗尽

<?phpini_set('memory_limit', '128M');$string = str_pad('1', 128 * 1024 * 1024);

解决办法:

1、能用钱解决的问题都不是问题,如果程序要读大文件的机会不是很多,且上限可预期,那么通过 ini_set('memory_limit', '1G'); 来设置一个更大的值或者 memory_limit=-1。内存管够的话让程序一直跑也可以。

2、如果程序需要考虑在小内存机器上也能正常使用,那就需要优化程序了。如下,代码复杂了很多。

<?php //php7 以下版本通过 composer 引入 paragonie/random_compat ,为了方便来生成一个随机名称的临时文件 require "vendor/autoload.php"; ini_set('memory_limit', '128M'); //生成临时文件存放大字符串 $fileName = 'tmp'.bin2hex(random_bytes(5)).'.txt'; touch($fileName);for ( $i = 0; $i < 128; $i++ ) {



$string = str_pad('1', 1 * 1024 * 1024);

file_put_contents($fileName, $string, FILE_APPEND); } $handle = fopen($fileName, "r"); for ( $i = 0; $i <= filesize($fileName) / 1 * 1024 * 1024; $i++ ) {
 //do something


 $string = fread($handle, 1 * 1024 * 1024); } fclose($handle); unlink($fileName);

情况二程序操作大数据时产生拷贝

情景还原:执行过程中对大变量进行了复制,导致内存不够用。

<?php ini_set("memory_limit",'1M'); $string = str_pad('1', 1* 750 *1024); $string2 = $string; $string2 .= '1';

解决办法:

及早释放无用变量,或者以引用的形式操作原始数据。

<?php ini_set("memory_limit",'1M'); $string = str_pad('1', 1* 750 *1024); $string2 = $string; unset($string); $string2 .= '1';

情况三、配置不合理系统资源耗尽

情景还原:因配置不合理导致内存不够用,2G 内存机器上设置最大可以启动 100 个 php-fpm 子进程,但实际启动了 50 个 php-fpm 子进程后无法再启动更多进程。

解决办法:

合理设置 post_max_size、max_file_uploads、upload_max_filesize、max_input_vars、max_input_nesting_level 等参数并调优 php-fpm 相关参数。

情况四、无用的数据未及时释放

情景还原:这种问题从程序逻辑上不是问题,但是无用的数据大量占用内存导致资源不够用,应该有针对性的做代码优化。

Laravel开发中用于监听数据库操作时有如下代码:

DB::listen(function ($query) {





// query?>sql//query?>sql//query->bindings





// $query->time



});

解决办法:

本例中要通过DB::listen方法获取所有执行的 SQL 语句记录并写入日志,但此方法存在内存泄露问题,在开发环境下无所谓,在生产环境下则应停用,改用其他途径获取执行的 SQL 语句并写日志。

推荐教程;PHP视频教程

以上就是php什么情况内存泄露的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的php什么情况内存泄露全部内容,希望文章能够帮你解决php什么情况内存泄露所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。


本文关键词:

联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com