Неужели PHP ждет завершения операций файловой системы (например, file_put_contents), прежде чем двигаться дальше? - PullRequest
9 голосов
/ 22 июля 2010

У меня есть вопрос о том, как PHP обрабатывает операции файловой системы.Я запускаю этот код, который зависит от файла, создаваемого до того, как он будет использован, и мне кажется, что когда я запускаю код, он становится условием гонки - иногда это работает, файл создается и код php использует его, иногдавыходит из строя.

Так что мне было интересно, как php обрабатывает операции с файловой системой, отправляет ли он его в фоновом режиме или ожидает завершения операции?

Ответы [ 4 ]

8 голосов
/ 22 июля 2010

file_put_contents эквивалентно fopen, fwrite, fclose.fclose должен гарантировать, что файл полностью записан на диск.

7 голосов
/ 22 июля 2010

Да, если вы не открываете дескриптор файла, а затем переводите его в неблокирующий режим: stream_set_blocking()

4 голосов
/ 10 апреля 2013

Год 2013, на моем обычном садовом сорте linux vps с cpanel, с настройками по умолчанию, с php 5.2.17, file_put_contents всегда занимает ~ 5 мс для коротких строк.

Случайно 5 мс - это полное время записи высококачественного жесткого диска.

file_put_contents($filename,'abcdefghi...~100chars',FILE_APPEND);

Это занимает ~ 5 мс последовательно. Это, кажется, включает в себя «блокирование» и «промывка». Так что для тех, кто интересуется скоростью file_put_contents, не менее 5 мсек / операция на общих серверах 2013 04.

Если вам нужна скорость, например, для регистрации, @Matthew Flaschen сказал:

file_put_contents is equivalent to fopen, fwrite, fclose. 
fclose should ensure the file is fully flushed to disk.

Тогда нужно:

function file_put_contents_fast() {...no fclose...}

Но потребуется некоторое исследование, чтобы выяснить, что произойдет, если дескрипторы файлов останутся открытыми. Php закрывает их на выходе , но так ли это на самом деле? Даже если он падает? Что произойдет, если файл останется открытым с помощью php после сбоя? и т. д. и т. д. После 30 минут чтения и поиска в Google php ничего не было сказано о его последствиях.

3 голосов
/ 22 июля 2010

PHP должен дождаться завершения процесса. Но не зная, как вы выполняете операции, трудно сказать. Если вы можете опубликовать пример кода, который вы используете, это было бы полезно, чтобы мы могли помочь вам выяснить, почему он не работает должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...