メモリ オーバーフローとは、アプリケーション システムに回復不可能なメモリがあるか、使用されるメモリが多すぎることを意味します。その結果、最終的にプログラムの実行に使用されるメモリが仮想マシンが提供できる最大メモリを超えてしまいます。
メモリ オーバーフローの原因は多数ありますが、一般的な原因は次のとおりです:
メモリにロードされるデータの量大きすぎる 巨大な場合、データベースから一度に大量のデータを取得するなど; (推奨される学習: PHP ビデオ チュートリアル )
コレクション クラスにはオブジェクトへの参照があります。使用後にクリアされません;
コード内に無限ループがあるか、ループによって生成される反復オブジェクト エンティティが多すぎます;
使用されているサードパーティ ソフトウェアのバグ;
起動パラメータのメモリ値の設定が小さすぎます。
ログに保存されるレコードの数が 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);
ここで、一方では PHP の利用可能なメモリ サイズを増やす必要があることは、難しくありません。配列をバッチで処理し、分割統治し、使用された変数を時間内に破棄 (設定解除) する方法を見つければ、一般にオーバーフローの問題は発生しません。
また、PHP プログラムのメモリ消費を節約するために、静的変数の使用を可能な限り減らす必要があり、データの再利用が必要な場合は、参照 (&) の使用を検討できます。もう 1 つのポイントは、データベース操作の完了後、接続を直ちに閉じる必要があり、オブジェクトの使用後、デストラクター (__destruct()) を直ちに呼び出す必要があることです。
以上がPHPメモリオーバーフローの一般的な原因の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。