关于Yii2框架跑脚本时内存泄漏问题的分析与解决_php实例

来源:脚本之家  责任编辑:小易  

【圈圈助手】和叉叉助手的功能类似。圈圈助手介绍:圈圈助手是一款功能超全面的绿色辅助工具,既为游戏小白提供了快捷方便的一键游戏辅助,也是真正专业游戏玩家的不二之选.圈圈助手由热爱手机游戏的圈圈团队自主研发,致力于为游戏玩家提供更简单便捷的游戏操作,让广大玩家更好的享受游戏带来的乐趣!目前圈圈在安卓平台上提供了内存猎手、变速齿轮、圈聊等强大的游戏辅助功能,并在此基础上不断优化现有技术和产品,努力打破现有局限,为圈粉们及时更新更加实用有趣的辅助工具,力争为圈粉们构筑一个多元化乐享游戏社区www.zgxue.com防采集请勿采集本网。

现象

在跑 edu_ocr_img 表的归档时,每跑几万个数据,都会报一次内存耗尽

注意前面的那一句话:“获取光标当前的坐标”,这需要我们创建一个数据传递结构的框架来获取实时的坐标信息,然后才能判断出对应的菜单项所处的位置,而鼠标右键菜单又有一个特性,那就是可以由用户自行

PHP Fatal error:  Allowed memory size of 134217728 bytesexhausted (tried toallocate 135168 bytes)

2.5.4 设置表格的背景颜色 2.5.5 表格的正确显示 2.6 用框架布局 2.6.1 在网页中创建框架 2.6.2 调整框架属性 2.6.3 在框架间轻松跳转 2.6.4 生成无框架内容 2.7 使用更高级的布局方法-分层

然而,业内对其技术含量并不尊重,没有好用和专业的IDE这一点就可见一斑,Js被大多数人看作脚本语言,更说明了很多人根本没给予充分的重视。开发者都不重视了,还怎么做到兼容性。我敢说公司要招聘到一个

跟踪代码发现,是在插入时以下代码造成的:

要做一个脚本,首先要知道想让脚本帮助做什么,也就是脚本应该有什么功能。以一个找怪、打怪脚本为例: 1、首先是自动打怪功能,要想打怪首先就得找到怪,玩过回合制网游的都知道,回合制网游和

EduOCRTaskBackup::getDb()->createCommand()->batchInsert(EduOCRTaskBackup::tableName(), $fields, $data)->execute();

用GG修改器

然而,业内对其技术含量并不尊重,没有好用和专业的IDE这一点就可见一斑,Js被大多数人看作脚本语言,更说明了很多人根本没给予充分的重视。开发者都不重视了,还怎么做到兼容性。我敢说公司要招聘到一个

execute 之后会造成使用内存涨上去,并且在之后 unset 所有变量内存也会有一部分不会删除,直到内存耗尽。

于是跟踪到 Yii2中execute的具体代码块发现在记录 log 的时候会将使用很高的内存,分析代码之后得出造成泄漏的代码块如下:

造成泄漏的代码块

/** * Logs a message with the given type and category. * If [[traceLevel]] is greater than 0, additional call stack information about * the application code will be logged as well. * @param string|array $message the message to be logged. This can be a simple string or a more * complex data structure that will be handled by a [[Target|log target]]. * @param integer $level the level of the message. This must be one of the following: * `Logger::LEVEL_ERROR`, `Logger::LEVEL_WARNING`, `Logger::LEVEL_INFO`, `Logger::LEVEL_TRACE`, * `Logger::LEVEL_PROFILE_BEGIN`, `Logger::LEVEL_PROFILE_END`. * @param string $category the category of the message. */public function log($message, $level, $category = 'application'){ $time = microtime(true); $traces = []; if ($this->traceLevel > 0) { $count = 0; $ts = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); array_pop($ts); // remove the last trace since it would be the entry script, not very useful foreach ($ts as $trace) { if (isset($trace['file'], $trace['line']) && strpos($trace['file'], YII2_PATH) !== 0) { unset($trace['object'], $trace['args']); $traces[] = $trace; if (++$count >= $this->traceLevel) { break; } } } } // 这里是造成内存的罪魁祸首 $this->messages[] = [$message, $level, $category, $time, $traces]; if ($this->flushInterval > 0 && count($this->messages) >= $this->flushInterval) { $this->flush(); }}

造成内存泄漏的原因分析

在 Yii2框架中的 vendor/yiisoft/yii2/log/Logger.php:156 log函数的156行之后会判断 count($this->messages) >= $this->flushInterval

即:内存中存储的 message 的条数要大于等于预设的 $this->flushInterval 才会将内存中的message 刷到磁盘上去。

如果在刷新到磁盘之前就已经将 php.ini 设置的 128M 内存打满的话,会直接报错申请内存耗尽。

很多关于 YII2其他原因的内存泄漏的讨论

https://github.com/yiisoft/yii2/issues/13256

解决方案

在程序开始时,设置 flushInterval 为一个比较小的值

\Yii::getLogger()->flushInterval = 100; // 设置成一个较小的值

在程序执行过程中,每次 execute 之后对内存中的 message 进行 flush

\Yii::getLogger()->flush(true); // 参数传 true 表示每次都会将 message 清理到磁盘中

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对真格学网的支持。

你好我是从事自动化测试方面的1、自动化测试脚本,包括下面几个方面1)CLI自动化测试,其应用脚本技术,包括tcl、phython、ruby,你学好一门自动化测试脚本即可,因为CLI的自动化测试就是应用脚本去模拟人工输入命令行,建议学习一下phython,因为其强大的社区,还有不亚于高级语言的编程思想。2)工具方面,自动化测试工具例如:RFT的脚本包括java与.net;QPT的脚本为VB等。你有一定的编程基础的话,就不要停留在工具试用方面,而是要去重点学习一下其工具思想。你没有基础的话,你就从其RFT与QTP的帮助文档看起,里面都有关于这些功能的API的。3)自动化测试框架,这个方面不是单存的自动化测试脚本了,而是利用编程技巧,结合各种自动化测试理念去构建适合自己的自动化测试框架,则就要求一定高度的编程技巧和各种知识了。你需要自动化测试脚本编写教程,这先要看你去掌握什么方面的的自动化测试脚本了,我可以提供你教程,但关键先看你的需求这样,推荐你一个博客,是专注自动化测试的博客。你先看看,我觉得你对自动化测试认识不深,你先把自动化测试弄得有点小明白,再去看看。你需要什么,你的方向是什么:51tesing上的“散步的SUN”的博客,这是我的博客,你可以在百度里面直接输入“散步的SUN”就是其博客了。上面有各种关于自动化测试方面的知识,希望对你又帮助吧。或者对自动化测试有兴趣的,可以发短消息或者邮件我吧(test_sunny@hotmail.com),有机会一起学习探讨下内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 从零开始学yii2框架(一)通过composer安装yii2框架
  • 从零开始学yii2框架(五)快速生成代码工具 gii 的使用
  • 从零开始学yii2框架(六)高级应用程序模板
  • 从零开始学yii2框架(三)扩展插件yii2-gird
  • 从零开始学yii2框架(二)通过 composer 安装扩展插件
  • 从零开始学yii2框架(四)扩展插件yii2-kartikgii
  • yii2框架数据库简单的增删改查语法小结
  • yii2框架使用计划任务的方法
  • 一个php并发访问实例代码
  • symfony核心类概述
  • php+layui数据表格实现数据分页渲染代码
  • 分享5个非常有用的laravel blade指令
  • thinkphp添加更新标签的方法
  • tp3.2.3框架使用ckeditor编辑器在页面中上传图片的方法分析
  • 详解php中cookie和session的区别及cookie和session用法小结
  • 一个用php实现的获取url信息的类
  • php封装分页函数实现文本分页和数字分页
  • laravel日志用法详解
  • 求自动化测试脚本编写教程,别就说让我去学各式语言,详细点。
  • 有没有像叉叉助手差不多的软件?
  • 如何学习Java——谨以此文献给打算以编程为职业、并愿意为之疯狂的人
  • GG 修改怎么改逃跑吧!少年.
  • 怎样用批处理完成和"桌面右击刷新"一样的功能的刷新?
  • Photoshop做网站的问题
  • Web开发瓶颈:为何浏览器兼容困难重重
  • 如何用TC制作游戏脚本?
  • 逃跑吧!少年怎么开挂
  • 魔兽世界怀旧服团队框架跑尸体 怎么显示?
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全php基础php技巧php实例php文摘php模板首页php编程php实例从零开始学yii2框架(一)通过composer安装yii2框架从零开始学yii2框架(五)快速生成代码工具 gii 的使用从零开始学yii2框架(六)高级应用程序模板从零开始学yii2框架(三)扩展插件yii2-gird从零开始学yii2框架(二)通过 composer 安装扩展插件从零开始学yii2框架(四)扩展插件yii2-kartikgiiyii2框架数据库简单的增删改查语法小结yii2框架使用计划任务的方法一个php并发访问实例代码symfony核心类概述php+layui数据表格实现数据分页渲染代码分享5个非常有用的laravel blade指令thinkphp添加更新标签的方法tp3.2.3框架使用ckeditor编辑器在页面中上传图片的方法分析详解php中cookie和session的区别及cookie和session用法小结一个用php实现的获取url信息的类php封装分页函数实现文本分页和数字分页laravel日志用法详解php获取数组长度的方法(有实例)微信公众平台实现获取用户openid教你如何使用php session使用php生成二维码的两种方法(带php发送get、post请求的6种方法简php中把stdclass object转array的微信公众平台网页授权获取用户基laravel框架数据库curd操作、连贯php字符串的连接的简单实例php删除数组中空值的方法介绍php使用json和将json还原成数组php实现的短网址算法分享基于php实现七牛抓取远程图片thinkphp 在api开发中异常返回依然是htmlsmarty中post用法实例基于php socket(fsockopen)的应用实例分析laravel 实现eloquent模型分组查询并返回thinkphp中where()使用方法详解php cli 模式设置进程名称的方法php随手笔记整理之php脚本和java连接mysq
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved