PHP のメモリ オーバーフロー問題を解決する方法: 1. PHP の利用可能なメモリ サイズを増やす; 2. 配列をバッチで処理し、使用されている変数を時間内に破棄する; 3. 静的変数の使用をできる限り減らす; 3. 静的変数の使用をできるだけ減らす; 4. データベース操作が完了したら、接続を直ちに閉じる必要があります。
PHP メモリ オーバーフローの問題を解決する方法:
1.メモリ オーバーフローの解決策
データの統計分析を行う場合、大きな配列に遭遇することが多く、メモリ オーバーフローが発生する可能性があります。ここで私の解決策を共有します。この問題を説明するために、次のような例を使用します。
ログに保存されているレコードの数が 500,000 であると仮定すると、解決策は次のようになります。
ini_set(‘memory_limit’,’64M’);
//メモリをリセットします。 PHP で使用できるサイズは 64M までです。通常、php.ini ファイルはリモート ホスト上では変更できず、プログラムを通じてのみ設定できます。
注: safe_mode
(セーフ モード) では、ini_set
は無効です。
set_time_limit(600);//设置超时限制为6分钟 $farr = $Uarr = $Marr = $IParr = $data = $_sub = array(); $spt = ”$@#!$”; $root = ”/Data/webapps/VisitLog”; $path = $dpath = $fpath = NULL; $path = $root.”/”.date(“Y-m”,$timestamp); $dpath = $path.”/”.date(“m-d”,$timestamp); for($j=0;$j<24;$j++){ $v = ($j < 10) ? ”0″.$j : $j; $gpath = $dpath.”/”.$v.”.php”; if(!file_exists($gpath)){ continue; } else { $arr = file($gpath);////将文件读入数组中 array_shift($arr);//移出第一个单元-》<?php exit;?> $farr = array_merge($farr,$arr); unset($arr); } } if(empty($this->farr)){ echo ”<p><center>没有相关记录!</center></p>”; exit; } while(!empty($farr)){ $_sub = array_splice($farr, 0, 10000); //每次取出$farr中1000个 for($i=0,$scount=count($_sub);$i<$scount;$i++){ $arr = explode($spt,$_sub[$i]); $Uarr[] = $arr[1]; //vurl $Marr[] = $arr[2]; //vmark $IParr[] = $arr[3].” |$nbsp;”.$arr[1]; //IP } unset($_sub);//用完及时销毁 } unset($farr);
ここで、次のことを確認するのは難しくありません:
1. 一方で、PHP の使用可能なメモリ サイズを増やす必要があります。配列をバッチで処理し、分割して征服する方法では、使用された変数は時間内に破棄され (unset
)、通常はオーバーフローの問題は発生しません。
2. また、PHP プログラムのメモリ消費を抑えるため、静的変数の使用をできる限り減らし、データの再利用が必要な場合は参照 (&) の使用を検討してください。
3. もう 1 つのポイントは、データベース操作の完了後、接続を直ちに閉じる必要があり、オブジェクトの使用後、デストラクター (__destruct()
) を直ちに呼び出す必要があることです。 #########二。 Unset は変数を破棄し、メモリの問題を解放します。
PHP の unset()
関数は、変数をクリアして破棄するために使用されます。未使用の変数については、unset()## を使用できます。 #破壊してください。ただし、unset() を使用しても、変数が占有しているメモリを破壊できない場合があります。まず例を見てみましょう: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><?php
$s=str_repeat(&#39;1&#39;,255); //产生由255个1组成的字符串
$m=memory_get_usage(); //获取当前占用内存
unset($s);
$mm=memory_get_usage(); //unset()后再查看当前占用内存
echo $m-$mm;
?></pre><div class="contentsignin">ログイン後にコピー</div></div>
最終出力unset()
前に占有されていたメモリから、後に占有されていたメモリを引いた値
それが正の数の場合、これは、unset($s)
$s がメモリから破棄された (言い換えれば、unset() 後にメモリ使用量が減少した) ことを意味しますが、PHP5 および Windows プラットフォームでは、結果は次のようになります。得られた値: 0。これは、unset($s)
は変数 $s が占有するメモリを破壊しないことを意味しますか?もう一度次の例を作成してみましょう: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><?php
$s=str_repeat(&#39;1&#39;,256); //产生由256个1组成的字符串
$m=memory_get_usage(); //获取当前占用内存
unset($s);
$mm=memory_get_usage(); //unset()后再查看当前占用内存
echo $m-$mm;
?></pre><div class="contentsignin">ログイン後にコピー</div></div> この例は上記の例とほぼ同じですが、唯一の違いは、<code>$s
が 256 個の 1 で構成されており、最初の 1 よりも多いことです。例: 1 を追加すると、結果は 272 になります。これは、unset($s)
が $s
が占有しているメモリを破壊したことを意味しますか? 上記の例から、次の結論を導き出すことができます。
結論 1.
関数は、変数値が 256 を超える場合にのみ使用できます。メモリ空間のバイト数。メモリ空間は解放されます。
結論 2. メモリは、その変数を指すすべての変数 (参照変数など) が破棄された場合にのみ解放されます。
PHP プログラミングの入門から熟練度まで
以上がPHPのメモリオーバーフロー問題を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。