У меня есть сценарий, который, каждый раз называют, получает первую строку файла. Каждая строка, как известно, точно той же длины (32 алфавитно-цифровых символа) и завершается с "\r\n". После получения первой строки сценарий удаляет его.
Это сделано таким образом:
$contents = file_get_contents($file));
$first_line = substr($contents, 0, 32);
file_put_contents($file, substr($contents, 32 + 2)); //+2 because we remove also the \r\n
Очевидно, это работает, но я задавался вопросом, существует ли более умное (или более эффективный) способ сделать это?
В моем простом решении я в основном считал и переписываю весь файл только, чтобы взять и удалить первую строку.
Нет более эффективного способа сделать это, кроме перезаписи файла.
Обычно я бы не рекомендовал открывать оболочку для такого рода вещей, но если вы делаете это нечасто с очень большими файлами, вероятно, есть что сказать:
$lines = `wc -l myfile` - 1;
`tail -n $lines myfile > newfile`;
Это просто, и это не так ' t подразумевают чтение всего файла в память.
Я бы не рекомендовал это для небольших файлов или для очень частого использования. Накладные расходы слишком высоки.
Можно хранить позиционную информацию в самом файле. Например, в первых 8 байтах файла может храниться целое число. Это целое число является смещением байта первой реальной строки в файле.
Таким образом, вы больше не удаляете строки. Вместо этого удаление строки означает изменение начальной позиции. fseek() к ней, а затем читайте строки как обычно.
Со временем файл вырастет. Вы можете периодически очищать осиротевшие строки, чтобы уменьшить размер файла.
Но если серьезно, просто используйте базу данных и не делайте ничего подобного.
, вы можете перебирать файл вместо того, чтобы помещать их все в память
$handle = fopen("file", "r");
$first = fgets($handle,2048); #get first line.
$outfile="temp";
$o = fopen($outfile,"w");
while (!feof($handle)) {
$buffer = fgets($handle,2048);
fwrite($o,$buffer);
}
fclose($handle);
fclose($o);
rename($outfile,$file);
Вы можете использовать метод file ().
Получает первую строку
$content = file('myfile.txt');
echo $content[0];
Вот один способ:
$contents = file($file, FILE_IGNORE_NEW_LINES);
$first_line = array_shift($contents);
file_put_contents($file, implode("\r\n", $contents));
Есть бесчисленное множество других способов сделать это, но все методы включают в себя какое-то разделение первой строки и сохранение остальных. Вы не можете избежать перезаписи всего файла. Альтернативный вариант:
list($first_line, $contents) = explode("\r\n", file_get_contents($file), 2);
file_put_contents($file, implode("\r\n", $contents));