#この記事の動作環境:Windows7 システム、PHP7.1 バージョン、DELL G3 パソコン大きなファイルの特定の行を読み取るために PHP を実装する方法: 1. ファイル関数を直接使用して操作します; 2. Linux tail コマンドを呼び出して最後の数行を表示します; 3. PHP の fseek を使用して実行しますファイル操作; 4. PHP の stream_get_line 関数による読み取り。
php 読み方大きなファイルの行?
PHP で大きなファイルを読み取るさまざまな方法の紹介大きなファイルの読み取りは常に頭痛の種でした。PHP 開発を使用すると、さまざまな方法で小さなファイルを読み取ることができます。関数の実装、しかし、大きな記事に到達すると、一般的に使用されるメソッドが正常に使用できないか、時間がかかりすぎて行き詰まっていることがわかります。PHP で大きなファイルを読み取る際の問題の解決策を見てみましょう。例が役に立ちます。 PHP では、ファイルを読み取るときに、file や file_get_contents などの関数を使用するのが最も早い方法です。数行の簡単なコードで、必要なことを美しく実現できます。ただし、操作するファイルが比較的大きなファイルの場合、これらの機能では不十分な場合がありますので、ここからは大きなファイルを読み込む際の一般的な操作方法について説明します。 要件:約 500 万行を含む 8 億のログ ファイルがあります。PHP を使用して、最後の数行の内容を返します。 実装方法:1. file関数を直接使って操作するfile関数は内容を一度にメモリ上に読み込むため、PHPはそれを防ぐために一部の書き込み比較 不正なプログラムはメモリを占有しすぎてシステム メモリ不足を引き起こし、サーバーのクラッシュを引き起こします。そのため、デフォルトでは、最大メモリ使用量は 16M に制限されています。これは、php.ini のmemory_limit = 16M によって設定されます。この値の場合、メモリ使用量を無制限にするには、-1 に設定します。 次は、file を使用してこのファイルの最後の行を抽出するコードです:<?php ini_set('memory_limit', '-1'); $file = 'access.log'; $data = file($file); $line = $data[count($data) - 1]; echo $line; ?>
<?php $file = 'access.log'; $file = escapeshellarg($file); // 对命令行参数进行安全转义 $line = `tail -n 1 $file`; echo $line; ?>
<?php $fp = fopen($file, "r"); $line = 10; $pos = -2; $t = " "; $data = ""; while ($line > 0) { while ($t != "\n") { fseek($fp, $pos, SEEK_END); $t = fgetc($fp); $pos--; } $t = " "; $data .= fgets($fp); $line--; } fclose($fp); echo $data ?>
<?php $fp = fopen($file, "r"); $num = 10; $chunk = 4096; $fs = sprintf("%u", filesize($file)); $max = (intval($fs) == PHP_INT_MAX) ? PHP_INT_MAX : filesize($file); for ($len = 0; $len < $max; $len += $chunk) { $seekSize = ($max - $len > $chunk) ? $chunk : $max - $len; fseek($fp, ($len + $seekSize) * -1, SEEK_END); $readData = fread($fp, $seekSize) . $readData; if (substr_count($readData, "\n") >= $num + 1) { preg_match("!(.*?\n){" . ($num) . "}$!", $readData, $match); $data = $match[0]; break; } } fclose($fp); echo $data; ?>
<?php function tail($fp, $n, $base = 5) { assert($n > 0); $pos = $n + 1; $lines = array(); while (count($lines) <= $n) { try { fseek($fp, -$pos, SEEK_END); } catch (Exception $e) { fseek(0); break; } $pos *= $base; while (!feof($fp)) { array_unshift($lines, fgets($fp)); } } return array_slice($lines, 0, $n); } var_dump(tail(fopen("access.log", "r+"), 10)); ?>
$fp = fopen('./iis.log', 'r'); //文件 while (!feof($fp)) { //for($j=1;$j<=1000;$j++) { //读取下面的1000行并存储到数组中 $logarray[] = stream_get_line($fp, 65535, "\n"); // break; // } }
PHP ビデオ チュートリアル "
以上がPHPで大きなファイルの特定の行を読み取る方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。