Действительно ли это - самый эффективный способ получить и удалить первую строку в файле?

У меня есть сценарий, который, каждый раз называют, получает первую строку файла. Каждая строка, как известно, точно той же длины (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

Очевидно, это работает, но я задавался вопросом, существует ли более умное (или более эффективный) способ сделать это?

В моем простом решении я в основном считал и переписываю весь файл только, чтобы взять и удалить первую строку.

15
задан Cœur 10 September 2017 в 06:43
поделиться

6 ответов

Нет более эффективного способа сделать это, кроме перезаписи файла.

14
ответ дан 30 November 2019 в 23:57
поделиться

Обычно я бы не рекомендовал открывать оболочку для такого рода вещей, но если вы делаете это нечасто с очень большими файлами, вероятно, есть что сказать:

$lines = `wc -l myfile` - 1;
`tail -n $lines myfile > newfile`;

Это просто, и это не так ' t подразумевают чтение всего файла в память.

Я бы не рекомендовал это для небольших файлов или для очень частого использования. Накладные расходы слишком высоки.

4
ответ дан 30 November 2019 в 23:57
поделиться

Можно хранить позиционную информацию в самом файле. Например, в первых 8 байтах файла может храниться целое число. Это целое число является смещением байта первой реальной строки в файле.

Таким образом, вы больше не удаляете строки. Вместо этого удаление строки означает изменение начальной позиции. fseek() к ней, а затем читайте строки как обычно.

Со временем файл вырастет. Вы можете периодически очищать осиротевшие строки, чтобы уменьшить размер файла.

Но если серьезно, просто используйте базу данных и не делайте ничего подобного.

2
ответ дан 30 November 2019 в 23:57
поделиться

, вы можете перебирать файл вместо того, чтобы помещать их все в память

$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);
4
ответ дан 30 November 2019 в 23:57
поделиться

Вы можете использовать метод file ().

Получает первую строку

$content = file('myfile.txt');
echo $content[0];  
-2
ответ дан 30 November 2019 в 23:57
поделиться

Вот один способ:

$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));
2
ответ дан 30 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: