LINUX.ORG.RU

Как работает file_put_contents?

 


0

1

Есть файл $fileName, в который, время от времени, записывается строка $str функцией file_put_contents.

Известно, что всегда strlen ($str) > 0.

В какой-то момент времени обнаруживается, что закончилось место на диске, a filesize ($fileName) == 0.

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

Такое возможно, или эти факты между собой не связаны?

Неожиданное предложение - посмотри в исходниках. Вопрос о очень специфичном нюансе, проще будет самому уточнить.

anonymous
()
Ответ на: комментарий от anonymous

порылся в исходниках, не нашел о_О. По крайней мере, по именам файлов исходников непонятно, где же там эта функция (в тех что по названию как-то относятся к файловой системе - нету). Хотя, мб, просто прозевал...

stevejobs ★★★★☆
()
Ответ на: комментарий от metrokto

судя по написанному, он умеет применять ее к строке, массиву и объекту, вначале превращая их в строку, а потом натравливая на нее функцию php_stream_write. Теперь надо раскопать исходник этой функции и посмотреть, что произойдет в случае ошибки.

CC rikardoac

stevejobs ★★★★☆
()
Ответ на: _php_stream_write от rikardoac

судя по этому, он пишет переданный объект по символам, кусками длиной stream->chunk_size с помощью фукнции stream->ops->write, и потом проверяет, сколько же байтов записалось.

вот ее заголовок: http://lxr.php.net/xref/PHP_5_5/main/php_streams.h

не уверен, что нашел верную реализацию, но кажись оно: http://lxr.php.net/xref/PHP_5_5/ext/standard/php_fopen_wrapper.c

оно юзает PHPWRITE(buf, count), который расположен здесь: http://lxr.php.net/xref/PHP_5_5/main/output.c#249

и если не используются zend_output_globals,

в конце концов натыкаемся на

fwrite(str, 1, str_len, stderr);

т.е. вопрос, что происходит с fwrite (или с файловой системой/ведром), когда ему не хватает места

подозреваю, ничего криминального (типа «усечения до нуля») он не делает, просраться может только кусок который прямо сейчас непосредственно пишется, и ответ на вопрос ТСа - НЕТ, такого быть не может

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

ответ на вопрос ТСа - НЕТ, такого быть не может

Ещё как может. Если FILE_APPEND не задан, то файл открывается аналогично fopen(filename, «wb») — смотри реализацию php_stream_open_wrapper_ex — что как раз-таки и усекает файл до нулевого размера. Если же как раз где-то в это время закончится место на диске, то _php_stream_write_buffer() обломается и ничего не запишет.

sjinks ★★★
()
Ответ на: комментарий от sjinks

ты прав :3

в документацию по PHP надо включить пункт, что перед изучением PHP нужно в совершенстве знать Си и поведение стандартных линуксовых библиотек

stevejobs ★★★★☆
()
Ответ на: комментарий от metrokto

Да тут и обсуждения не было особо, просто stevejobs не успокоился пока не нашел ответ и пинал других, чтобы тоже искали ;-)

rikardoac
()
Ответ на: комментарий от Photon79

А то тут на free-lance.ru читаю иногда некоторые статьи.. Есть там один комментатор, который всех обсирает.. Типа «вы все тупые, надо вот так делать.. Могу повторить» При этом ни одного знака препинания на 50 слов :-D

Photon79
()
Ответ на: комментарий от rikardoac

Знать реализацию интерпретатора компилятора интерпретатора :-D

Photon79
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.