首页 > 作文

PHP内存溢出优化代码详解

更新时间:2023-04-09 01:58:31 阅读: 评论:0

相信很多人做大批量数据导出和数据导入的时候,经常会遇到php内存溢出的问题,在解决了问题之后,总结了一些经验,整理成文章记录下。

优化点

1、优化sql语句,避免慢大一高数挂科严重吗查询,合理的建立索引,查询指定的字段,sql优化这块在此就不展开了。
2、查询的结果集为大对象时转数组处理,框架中一般有方法可以转,如laravel中有toarray(),yii2中有asarray()。
3、对于大数组进行数据切割处理,php函数有array_chunk()、array_slice()。
4、对于大型的字符串和对象,使用引用传递&。
5、用过的变量及时unt。
6、导出的文件格式由excel改为csv
7、ini_t(‘memory_limit’,”),设置程序可以使用的内存(不建议这样做)。

内存管理

php的内存什么怎么管理的呢? 在学c语言时,开发者是需要手动管理内存。在php中,zend引擎提供为了处理请求相关数据提供了一种特殊的内存管理器。请求相关数据是只需要服务单个请求,最迟会在请求结束时释放数据。

防止内存泄漏并尽可能快地释放所有内存是内存管理的重要组成部分。因为安全原因,zend引擎会释放所有上面提到的api锁分配的内存。

垃圾回收机制

简单说下:

php5.3之前,采用引用计数的方式管理。php中的变量存在zval的变量容器中,变量被引用的时,引用计数+1,变量引用计数为0时,php将在内存中销毁这个变量。但是在引用计数循环引用时,引用计数就不会消减为0,导致内存泄漏。

php5.3之后做了优化,并不是每次引用计数减少都进入回收周期,只有根缓冲区满额后才开始进行垃圾回收,这样可以解决循环引用的问题,也可以将总内存泄漏保持在一个阈值之下。

代码
由于使用phpexcel时经常会遇到内存溢出,下面分享一段生成csv文件的代码:

<?phpnamespace api\rvice;class exportrvice{ public static $outputfile = ''; /** * 导出文件 * @param string $filename * @param $data * @param array $formfields * @return mixed */ public static function exportdata($filename = '', $data,山水田园诗 $formfields = []) { $filearr = []; $tmppath = \yii::$app->params['excelsavepath']; foreach (array_chunk($data, 10000) as $key => $value) {  lf::$outputfile = '';  $subject  = !empty($filename) ? $filename : 'data_';  $subject  .= date('ymdhis');  if (empty($value) || empty($formfields)) {  continue;  }  lf::$outputfile = $tmppath . $subject . $key . '.csv';  if (!file_exists(lf::$outputfile)) {  touch(lf::$outputfile);  }  $index = array_keys($formfields);  $header = array_values($formfields);  lf::output($header);  foreach ($value as $k => $v) {  $tmpdata = [];  foreach ($index as $item) {   $tmpdata[] = ist($v[$item]) ? $v[$item] : '';  }  lf::output($tmpdata);  }  $filearr[] = lf::$outputfile; }  $zipfile = $tmppath . $filename . date('ymdhi') . '.zip'; $zipres = lf::zipfile($filearr, $zipfile); return $zipres; } /** * 向文件写入数据 * @param array $data */ public static function output($data = []) { if (is_array($data) && !empty($data)) {  $data = implode(',', $data);  file_put_contents(lf::$outputfile, iconv("utf-8", "gb2312//ignore", $data) . php_eol, file_append); } } /** * 压缩文件 * @param $sourcefil小时代台词e教资考试多少分及格 * @param $distfile * @return mixed */ public static function zipfile($sourcefile, $distfile) { $zip = new \ziparchive(); if ($zip->open($distfile, \ziparchive::create) !== true) {  return $sourcefile; } $zip->open($distfile, \ziparchive::create); foreach ($sourcefile as $file) {  $filecontent = file_get_contents($file);  $file = iconv('utf-8', 'gbk', baname($file));  $zip->addfromstring($file, $filecontent); } $zip->clo(); return $distfile; }  /** * 下载文件 * @pa老骥伏枥怎么读ram $filepath * @param $filename */ public static function download($filepath, $filename) { if (!file_exists($filepath . $filename)) {  header('http/1.1 404 not found'); } el {  //以只读和二进制模式打开文件  $file = fopen($filepath . $filename, "rb");  //告诉浏览器这是一个文件流格式的文件  header("content-type: application/octet-stream");  //请求范围的度量单位  header("accept-ranges: bytes");  //content-length是指定包含于请求或响应中数据的字节长度  header("accept-length: " . filesize($filepath . $filename));  //用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值  header("content-disposition: attachment; filename=" . $filename);  //读取文件内容并直接输出到浏览器  echo fread($file, filesize($filepath . $filename));  fclo($file);  exit(); } }}

调用处代码

$filename = "库存导入模板";$stockres = []; // 导出的数据$formfields = [ 'store_id' => '门店id', 'storename' => '门店名称', 'sku' => 'sku编码', 'name' => 'sku名称', 'stock' => '库存', 'reason' => '原因'];$fileres = exportrvice::exportdata($filename, $stockres, $formfields);$tmppath = \yii::$app->params['excelsavepath']; // 文件路径$filename = str_replace($tmppath, '', $fileres);// 下载文件exportrvice::download($tmppath, $filename);

到此这篇关于php内存溢出优化代码详解的文章就介绍到这了,更多相关php内存溢出优化内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-09 01:58:29,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/ae797eb4eaecd5cb9f2db6ce14b2649a.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:PHP内存溢出优化代码详解.doc

本文 PDF 下载地址:PHP内存溢出优化代码详解.pdf

标签:内存   文件   变量   数据
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图