
امروز با هم به آموزشی درمورد چگونگی خواندن خطوط نوشتاری از درون یک فایل می پردازیم . در کل خواند فایل ها در زبان php یکی از مبحث های جنجالی و حساس است که اگر به درستی انجام نشود ممکن است آسیب هایی به سایت مقصد بزند . از این رو آموزش این مورد بسیار پراهمیت است . در اولین نگاه برای انجام عملیات خواندن خطوط از فایل نزدیک ترین ابزار تابع file() به ذهن خواهد رسید . مشکل استفاده از این تابع خواندن کل یک فایل به صورت مقدار آرایه ای array است از این رو در حافظه سرور ( لوکال ) هر عملیات زیر دست بر روی آرایه مانند foreach() منجر به پردازش دوبرابری آن خواهد شد برای مثال خواندن فایل log دو گیگی حافظه ای برابر با 4 گیگ نیاز خواهد داشت که برای خواندن چندصد خط متن بی جهت خواهد بود .
<?php
/**
*
* Read a line number from a file
*
* @param string $file The path to the file
* @param int $line_num The line number to read
* @param string $delimiter The character that delimits lines
* @return string The line that is read
*
*/
function readLine($file, $line_num, $delimiter="n")
{
/*** set the counter to one ***/
$i = 1;
/*** open the file for reading ***/
$fp = fopen( $file, 'r' );
/*** loop over the file pointer ***/
while ( !feof ( $fp) )
{
/*** read the line into a buffer ***/
$buffer = stream_get_line( $fp, 1024, $delimiter );
/*** if we are at the right line number ***/
if( $i == $line_num )
{
/*** return the line that is currently in the buffer ***/
return $buffer;
}
/*** increment the line counter ***/
$i++;
/*** clear the buffer ***/
$buffer = '';
}
return false;
}
?>
<?php
/*** make sure the file exists ***/
$file = 'my_file.txt';
if( file_exists( $file ) && is_readable( $file ) )
{
echo readLine($file, 6);
}
else
{
echo "Cannot read from $file";
}
?>
<?php
/*** the file to read ***/
$file = 'foo.txt';
/**
*
* Read a line number from a file
*
* @param string $file The path to the file
* @param int $line_num The line number to read
* @return string The line that is read
*
*/
function readLine( $file, $line_number )
{
/*** read the file into the iterator ***/
$file_obj = new SplFileObject( $file );
/*** seek to the line number ***/
$file_obj->seek( $line_number );
/*** return the current line ***/
return $file_obj->current();
}
echo readLine( $file, 345678 );
?>