防止 php 进程关闭,关于PHP进程防止内存溢出的排查_后端开发

php如何使用PHPAnalysis提取关键字中文分词_后端开发

需求:做SEO的keywords时,需要从标题或者正文里提取关键字,下载后解压放到extend目录下(以tp5为例,其他目录也行)。

PHP进程内存大小是可以设置的,默认在配置文件 memory_limit=128M

也可以在程序中动态设置 ini_set('memory_limit', '1024M');这样就设置成1G了。但是一般不会这样设置,毕竟会影响到机器的其他服务。有时候可以排查一下代码,很多时候内存溢出是因为php变量没有及时释放,或者遍历比较大的数组时出现。

1.排查

memory_get_usage() php有这个系统函数,可以得到当前进程使用了多少内存空间。返回是字节单位round(memory_get_usage()/1024/1024, 2).'MB',转换为MB.

可以追踪代码执行过程中内存的变化。

2.常见内存溢出的案例

遍历大型数组,修改数组的某些值,导致遍历过程数组复制一份。PHP 函数 file_get_contents 怎么用?_后端开发

在PHP中file_get_contents函数的作用是将整个文件读入一个字符串,其语法为“file_get_contents($filename) ”,返回值为读取出来的字符,使用方法只需将文件路径传入$filename即可。

php变量的特点是“写时复制”,

当涉及$arr数组赋值时,会产生分裂,生成新的HashTable结构体,导致内存占用瞬间变大

3.遍历赋值其他变量

$arr = range(0, 599999);

echo 'foreach前内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '
';

foreach($arr as $key => $item) {

$arr[$key] = $item + 1;

if($item % 100000 == 0) {

echo 'foreach中内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '
';

}

}

echo 'foreach后内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '
';

//输出

/*

foreach前内存:49.9MB

foreach中内存:81.36MB

foreach中内存:84.42MB

foreach中内存:87.47MB

foreach中内存:90.52MB

foreach中内存:93.57MB

foreach中内存:96.62MB

foreach后内存:49.9MB

*/

解决方法,采用引用遍历

$arr = range(0, 599999);

echo 'foreach前内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '
';

foreach($arr as $key => &$item) {

$arr[$key] = $item + 1;

if($item % 100000 == 0) {

echo 'foreach中内存:'.round(memory_get_usage()/1024/1024, 2).'MB', '
';

}

}unset($key);unset($item);

遍历完成后记得unset($key);unset($item); 因为$item是对数组最后一个元素的引用,后面如果修改这个变量,会直接修改到数组。

推荐:《PHP视频教程》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值