最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于Yii2框架跑腳本時(shí)內(nèi)存泄漏問(wèn)題的分析與解決

 更新時(shí)間:2019年12月01日 09:09:39   作者:麥葉  
這篇文章主要給大家介紹了關(guān)于Yii2框架跑腳本時(shí)內(nèi)存泄漏問(wèn)題的分析與解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Yii2具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

現(xiàn)象

在跑 edu_ocr_img 表的歸檔時(shí),每跑幾萬(wàn)個(gè)數(shù)據(jù),都會(huì)報(bào)一次內(nèi)存耗盡

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

跟蹤代碼發(fā)現(xiàn),是在插入時(shí)以下代碼造成的:

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

execute 之后會(huì)造成使用內(nèi)存漲上去,并且在之后 unset 所有變量?jī)?nèi)存也會(huì)有一部分不會(huì)刪除,直到內(nèi)存耗盡。

于是跟蹤到 Yii2中execute的具體代碼塊發(fā)現(xiàn)在記錄 log 的時(shí)候會(huì)將使用很高的內(nèi)存,分析代碼之后得出造成泄漏的代碼塊如下:

造成泄漏的代碼塊

/**
 * 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;
    }
   }
  }
 }
 
 // 這里是造成內(nèi)存的罪魁禍?zhǔn)?
 $this->messages[] = [$message, $level, $category, $time, $traces];
 if ($this->flushInterval > 0 && count($this->messages) >= $this->flushInterval) {
  $this->flush();
 }
}

造成內(nèi)存泄漏的原因分析

在 Yii2框架中的 vendor/yiisoft/yii2/log/Logger.php:156 log函數(shù)的156行之后會(huì)判斷 count($this->messages) >= $this->flushInterval

即:內(nèi)存中存儲(chǔ)的 message 的條數(shù)要大于等于預(yù)設(shè)的 $this->flushInterval 才會(huì)將內(nèi)存中的message 刷到磁盤上去。

如果在刷新到磁盤之前就已經(jīng)將 php.ini 設(shè)置的 128M 內(nèi)存打滿的話,會(huì)直接報(bào)錯(cuò)申請(qǐng)內(nèi)存耗盡。

很多關(guān)于 YII2其他原因的內(nèi)存泄漏的討論
https://github.com/yiisoft/yii2/issues/13256

解決方案

在程序開(kāi)始時(shí),設(shè)置 flushInterval 為一個(gè)比較小的值

\Yii::getLogger()->flushInterval = 100; // 設(shè)置成一個(gè)較小的值

在程序執(zhí)行過(guò)程中,每次 execute 之后對(duì)內(nèi)存中的 message 進(jìn)行 flush

\Yii::getLogger()->flush(true); // 參數(shù)傳 true 表示每次都會(huì)將 message 清理到磁盤中

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • PHP多進(jìn)程通信-消息隊(duì)列使用

    PHP多進(jìn)程通信-消息隊(duì)列使用

    這篇文章主要介紹了PHP通信-消息隊(duì)列使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Thinkphp開(kāi)發(fā)--集成極光推送

    Thinkphp開(kāi)發(fā)--集成極光推送

    極光推送(JPush)是獨(dú)立的第三方云推送平臺(tái),致力于為全球移動(dòng)應(yīng)用開(kāi)發(fā)者提供專業(yè)、高效的移動(dòng)消息推送服務(wù)。本文講述如何在將極光推送合到ThinkPHP框架中,
    2017-09-09
  • ajax+php實(shí)現(xiàn)無(wú)刷新驗(yàn)證手機(jī)號(hào)的實(shí)例

    ajax+php實(shí)現(xiàn)無(wú)刷新驗(yàn)證手機(jī)號(hào)的實(shí)例

    下面小編就為大家分享一篇ajax+php實(shí)現(xiàn)無(wú)刷新驗(yàn)證手機(jī)號(hào)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • php 問(wèn)卷調(diào)查結(jié)果統(tǒng)計(jì)

    php 問(wèn)卷調(diào)查結(jié)果統(tǒng)計(jì)

    一個(gè)新產(chǎn)品投入市場(chǎng),要先做問(wèn)卷調(diào)查,考察這個(gè)產(chǎn)品在市場(chǎng)的需求量,本篇文章主要跟大家介紹使用php問(wèn)卷調(diào)查結(jié)果統(tǒng)計(jì),感興趣的朋友一起學(xué)習(xí)吧
    2015-10-10
  • Yii獲取當(dāng)前url和域名的方法

    Yii獲取當(dāng)前url和域名的方法

    這篇文章主要介紹了Yii獲取當(dāng)前url和域名的方法,涉及Yii針對(duì)URL、域名、目錄等操作的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • php提取身份證號(hào)碼中的生日日期以及驗(yàn)證是否為成年人的函數(shù)

    php提取身份證號(hào)碼中的生日日期以及驗(yàn)證是否為成年人的函數(shù)

    本篇文章使用php技術(shù)提取身份證號(hào)碼中的生日日期來(lái)判斷是否是未成年人的一個(gè)函數(shù)。下面小編把代碼分享給大家,供大家參考
    2015-09-09
  • Yii 框架使用Forms操作詳解

    Yii 框架使用Forms操作詳解

    這篇文章主要介紹了Yii 框架使用Forms操作,結(jié)合實(shí)例形式分析了Yii 框架使用Forms模型、動(dòng)作創(chuàng)建及使用相關(guān)操作技巧,需要的朋友可以參考下
    2020-05-05
  • Laravel如何實(shí)現(xiàn)適合Api的異常處理響應(yīng)格式

    Laravel如何實(shí)現(xiàn)適合Api的異常處理響應(yīng)格式

    這篇文章主要給大家介紹了關(guān)于Laravel如何實(shí)現(xiàn)適合Api的異常處理響應(yīng)格式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Laravel具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Zend Framework教程之Zend_Config_Ini用法分析

    Zend Framework教程之Zend_Config_Ini用法分析

    這篇文章主要介紹了Zend Framework教程之Zend_Config_Ini用法,較為詳細(xì)的分析了Zend_Config_Ini操作配置數(shù)據(jù)的相關(guān)技巧,需要的朋友可以參考下
    2016-03-03
  • ThinkPHP獨(dú)立分組使用的注意事項(xiàng)

    ThinkPHP獨(dú)立分組使用的注意事項(xiàng)

    這篇文章主要介紹了ThinkPHP獨(dú)立分組使用的注意事項(xiàng),針對(duì)獨(dú)立分組的目錄結(jié)構(gòu)與分組之間的相互調(diào)用進(jìn)行了較為深入的分析,并指出了使用時(shí)的注意事項(xiàng),需要的朋友可以參考下
    2014-11-11

最新評(píng)論

武功县| 福鼎市| 谷城县| 民丰县| 万荣县| 张家口市| 乐平市| 黎平县| 井研县| 中宁县| 称多县| 海口市| 浠水县| 高淳县| 中西区| 吴忠市| 保康县| 宁海县| 奉化市| 格尔木市| 宁南县| 武宁县| 吉木萨尔县| 嘉荫县| 沙湾县| 景德镇市| 平顺县| 通城县| 宣化县| 云安县| 古交市| 鹿邑县| 称多县| 泰顺县| 淳化县| 凌源市| 来凤县| 彭水| 绍兴县| 汉寿县| 百色市|