Вот супер простой пример моей проблемы. Ожидается, что код создаст 1000 файлов с именами от file1 до file1000 соответственно, и в каждом файле числа от 1 до 1000000000 должны появляться в порядке возрастания, по одному на строку при просмотре файла.
<?php
for ($filenum=1;$filenum<=1000;$filenum++){
$handle=fopen("file".$filenum,"w");
for ($num=1;$num<=1000000000;$num++){
fwrite($handle,$num."\n");
}
fclose($handle);
}
?>
После выполнения первый файл file0001 создается правильно. Второй файл, однако, содержит числа, которые не в порядке. Я полагаю, что это потому, что fwrite отправляет строку для записи в специальный буфер, который будет записан позже?
Я хочу, чтобы данные были записаны немедленно. Мне все равно, если для правильной записи файлов требуются дополнительные десять минут, и я готов использовать лучшие функции вместо fopen () fwrite () и fclose (). Я верю в C, есть системная функция OPEN, которая используется для создания файла без буферизации, и это больше, чем я хочу.
Может кто-нибудь посоветовать мне, как лучше использовать функции? или мне придется прибегнуть к созданию собственной функции, включающей циклы, пока функция fwrite () не запишет все данные и не будет молиться за блокировку системы?
Если вы не хотите буферизировать, используйте fflush
каждый раз, когда вы используете fwrite.
http://php.net/manual/en/function.fflush.php
тем не мение fwrite
Функция должна работать для вашего варианта использования, даже если она буферизует данные. Буфер упорядочен.
Я рекомендую вам проверить возвращаемое значение функции. Рекомендуется всегда проверять его на функции, связанные с IO. fwrite
функция возвращает false, если это не удалось. Документ ниже объясняет другие случаи в деталях. Примером является случай, когда ваша файловая система заполнена.
http://php.net/manual/en/function.fwrite.php
Согласно комментарию на этой странице, fwrite
также возвращает ноль при сбоях.
Других решений пока нет …