ホームページ  >  記事  >  バックエンド開発  >  PHPのメモリオーバーフロー問題を解決するにはどうすればよいですか?

PHPのメモリオーバーフロー問題を解決するにはどうすればよいですか?

coldplay.xixi
coldplay.xixiオリジナル
2020-07-01 16:27:454887ブラウズ

PHP のメモリ オーバーフロー問題を解決する方法: 1. PHP の利用可能なメモリ サイズを増やす; 2. 配列をバッチで処理し、使用されている変数を時間内に破棄する; 3. 静的変数の使用をできる限り減らす; 3. 静的変数の使用をできるだけ減らす; 4. データベース操作が完了したら、接続を直ちに閉じる必要があります。

PHPのメモリオーバーフロー問題を解決するにはどうすればよいですか?

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() を使用しても、変数が占有しているメモリを破壊できない場合があります。まず例を見てみましょう: <pre class="brush:php;toolbar:false">&lt;?php $s=str_repeat(&amp;#39;1&amp;#39;,255); //产生由255个1组成的字符串 $m=memory_get_usage(); //获取当前占用内存 unset($s); $mm=memory_get_usage(); //unset()后再查看当前占用内存 echo $m-$mm; ?&gt;</pre>最終出力unset()前に占有されていたメモリから、後に占有されていたメモリを引いた値

unset()

それが正の数の場合、これは、unset($s)$s がメモリから破棄された (言い換えれば、unset() 後にメモリ使用量が減少した) ことを意味しますが、PHP5 および Windows プラットフォームでは、結果は次のようになります。得られた値: 0。これは、unset($s) は変数 $s が占有するメモリを破壊しないことを意味しますか?もう一度次の例を作成してみましょう: <pre class="brush:php;toolbar:false">&lt;?php $s=str_repeat(&amp;#39;1&amp;#39;,256); //产生由256个1组成的字符串 $m=memory_get_usage(); //获取当前占用内存 unset($s); $mm=memory_get_usage(); //unset()后再查看当前占用内存 echo $m-$mm; ?&gt;</pre> この例は上記の例とほぼ同じですが、唯一の違いは、$s が 256 個の 1 で構成されており、最初の 1 よりも多いことです。例: 1 を追加すると、結果は 272 になります。これは、

unset($s)

$s が占有しているメモリを破壊したことを意味しますか? 上記の例から、次の結論を導き出すことができます。 結論 1.

unset()

関数は、変数値が 256 を超える場合にのみ使用できます。メモリ空間のバイト数。メモリ空間は解放されます。

結論 2. メモリは、その変数を指すすべての変数 (参照変数など) が破棄された場合にのみ解放されます。

関連する学習の推奨事項:

PHP プログラミングの入門から熟練度まで

以上がPHPのメモリオーバーフロー問題を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。