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

WBOY
リリース: 2016-06-13 12:02:10
オリジナル
932 人が閲覧しました

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 モデレーターからのメソッドをここで借用します
$dir='d:\';
$res=glob($dir);
for($i=0;$iif(is_dir($res[$i])){
$res=array_merge($res,glob($res[$i].'/*'));
$ g=glob($res[$i].'/*');
var_dump($g);
}
}
?>
-- -- --解決策------------------
なぜ if ($filename == '.'
を入れたのですか -- ---解決策---------
$filename == '..') コメントアウトしますか?

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

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!