ホームページ  >  記事  >  バックエンド開発  >  PHP の再帰がメモリ不足を吸収する

PHP の再帰がメモリ不足を吸収する

WBOY
WBOYオリジナル
2016-06-13 12:02:10932ブラウズ

PHP の再帰によりメモリ不足が発生する

<br />$user = 'root';<br />$pass = 'thrope';<br />$dbh = new PDO('mysql:host=localhost;dbname=income', $user, $pass);<br />$query = 'insert into picinfo set picpath=:pp, picsize=:ps';//把文件路径和文件大小写入数据库<br />$stmt = $dbh->prepare($query);<br /><br />function dir_read($dir){<br />	$dh = opendir($dir);//if (is_dir($dir)) echo realpath($dir).'<br/>';<br />	while (false !== ($filename = readdir($dh))){//echo realpath($dir.'/'.$filename).'<br/>';<br />		//if ($filename == '.' || $filename == '..') continue;<br />		if (is_file($dir.'/'.$filename)){<br />			global $stmt;<br />			$stmt->execute(array(':pp'=>realpath($dir.'/'.$filename), ':ps'=>filesize(realpath($dir.'/'.$filename))));<br />			//echo $dbh->errorCode();<br />		}<br />		if (is_dir(realpath($dir.'/'.$filename)))//这个递归调用特别耗费资源<br />			dir_read(realpath($dir.'/'.$filename));<br />		<br />	}<br />	closedir($dh);<br />}<br /><br />dir_read('K:/project/fileOperate');<br />

上記のコードの主な機能は、ディレクトリ K:/project/fileOperate 内のすべてのファイルとサブフォルダーをデータベースに書き込むことですが、この再帰は大量のリソースを消費します1G 以上のメモリを占有します
お聞きしたいのですが、何が問題なのでしょうか?それとももっと良い方法があるのでしょうか?
------解決策---------
前の xu モデレーターからのメソッドをここで借用します
7ccb982c3f9b3c7d3bf0259b2ea2776f
-- -- --解決策------------------
なぜ if ($filename == '.'
を入れたのですか -- ---解決策---------
$filename == '..') コメントアウトしますか?

$filename = '.' および $filename = '..' の場合、 is_dir(realpath($dir.'/'.$filename) が true の場合、無限ループは発生しませんか?

実際には、glob 関数またはディレクトリ反復子を使用する方がはるかに簡単です
------解決策------ -
if ($filename == '.'
-----解決策---------
$filename == '..') continue;
これを追加する必要があります

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