解決內存溢出問題

1.經過php.ini進行設置php

  eg:ini_set('memory_limit,'128M');  //若是safe_mode開啓的話是沒有用的html

2.若是代碼塊中出現了大量的循環語句,使用事後的沒有用的數據,應當及時unset掉數組

  eg:服務器

  foreach ($ask_lists as $k_1 => $list)
  {
    $ask_img_set = array();
    foreach ($student_info as $k_2 => $info)
    {
      if($list->student_id == $info->student_id)
      {
        $ask_lists[$k_1] -> student_name = $info->student_name;
        $ask_lists[$k_1] -> student_nickname = $info->student_nickname;
      }
      unset($student_info[$k_2]);
    }
   //將提問的圖片放置數組
    if(strlen($list->ask_img_1)>0): array_push($ask_img_set,$list->ask_img_1);
    if(strlen($list->ask_img_2)>0): array_push($ask_img_set,$list->ask_img_2);
    unset($ask_lists[$k_1]->ask_img_1);
    unset($ask_lists[$k_1]->ask_img_2);
  }
session

3.大文件進行分片讀寫函數

  eg:性能

  public function testFilePutContent(Request $request)
  {
    header("content-type:text/html;charset=utf-8");
    $mp3_url = 'http://oflmvdj34.bkt.clouddn.com/20180325_9x2wesr2.mp3';
    $src_data = fopen("$mp3_url","r");
    $des_data = fopen("test.mp3","w");
    while($str = fread($src_data,4096)){
      fwrite($des_data,$str);
    }
    fclose($des_data);
    fclose($src_data);
    echo "寫入完畢";
  }
url

 

3.__destruct
spa

__destruct() 析構函數,是在垃圾對象被回收時執行。 線程

4.Session 與PHP垃圾回收機制

因爲PHP的工做機制,它並無一個daemon線程來按期的掃描Session信息並判斷其是否失效,當一個有效的請求發生時,PHP 會根據全局變量 session.gc_probability和session.gc_divisor的值,來決定是否啓用一個GC, 在默認狀況下,session.gc_probability=1, session.gc_divisor =100也就是說有1%的可能性啓動GC(也就是說100個請求中只有一個gc會伴隨100箇中的某個請求而啓動).

PHP垃圾回收機制的工做就是掃描全部的Session信息,用當前時間減去session最後修改的時間,同session.gc_maxlifetime參數進行比較,若是生存時間超過gc_maxlifetime(默認24分鐘),就將該session刪除。 
可是,若是你Web服務器有多個站點,多個站點時,GC處理session可能會出現意想不到的結果,緣由就是:GC在工做時,並不會區分不一樣站點的session.

那麼這個時候怎麼解決呢?

  1). 修改session.save_path,或使用session_save_path()讓每一個站點的session保存到一個專用目錄,    2). 提供GC的啓動率,天然,PHP垃圾回收機制的啓動率提升,系統的性能也會相應減低,不推薦。    3). 在代碼中判斷當前session的生存時間,利用session_destroy()刪除.

相關文章
相關標籤/搜索