file_put_contents() блокирует?

diamond_krnl

pure-php
file_put_contents() блокирует? (методы кеширования)

Интересно делает ли file_put_contents, блокировку - flock?
канечно можно писать по старинке - fopen, flock, fwrite, flock, fclose.
но кода получаетя явно больше.

Спасибо.
 

diamond_krnl

pure-php
еще интересно узнать как лучше делать кеширование?
встречал два метода:

1. обычный
fopen, flock, fwrite, flock, fclose.

2. не обычный
tmpfile, fwrite, fclose, rename.

3. ленивый
file_put_contents

вроде методы равноправны, но не понятно что лучше,
1-й очевидный,
2-й извращеный, но почемуто часто применяемый, например в smarty.
3-й просто "красивый".

я так понимаю это дело фкуса, стиля кодинга, и не более. :)

-~{}~ 05.07.06 15:14:

Shturm, да панятно что в мане написанно, но однако обратного не написано(что НЕ блокирует).

по логики блокировка должна быть, вообщем не уверен вот и спрашиваю.
 

Shturm

Гигант мысли
Сравни tmpfile и fopen и почувствуй разницу.


по логики блокировка должна быть, вообщем не уверен вот и спрашиваю
"По логике" - для блокировки существует отдельная функция.

Кстати, в мане написано : Identical to calling fopen(), fwrite(), and fclose() successively.
Читайте ман.
 

diamond_krnl

pure-php
Shturm
если вы еще не вниклись обсуждением, говорится о том почему именно один из методов кеширования лучше/хуже, а не описании в функций мунале.
 

Shturm

Гигант мысли
diamond_krnl
Если вы еще не прониклись сутью вопроса, поясняю - вышеперечисленные функции не имеют никакого отношения к методам кеширования. Это - методы работы с файлами.

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

Какой лучше в конкретном случае - решать вам.
 

SelenIT

IT-лунатик :)
C версии 5.1.0 использование блокировки при file_put_contents регулируется соотв. флагом. В русской версии мана про это еще не написали.
 

SiMM

Новичок
> второй - использование временного файла (в данном случае, я предполагаю, это некоторым образом отменяет необходимость блокировки),
Не думаю. Представьте два процесса, производящих запись одновременно. Результат записи одного из них будет утерян.
 

diamond_krnl

pure-php
SelenIT, спасибо за ясноть, я как чувствовал что должно быть. :)

SiMM, ок - значит лучше не изврашатся а делать обычным методом.
 

Shturm

Гигант мысли
SiMM
Да, согласен.
Правда, в свете вышесказанного непонятен смысл следующего куска кода из упомянутого Smarty (функция smarty_core_write_file()) :
PHP:
...
    // write to tmp file, then rename it to avoid
    // file locking race condition
    $_tmp_file = tempnam($_dirname, 'wrt');

    if (!($fd = @fopen($_tmp_file, 'wb'))) {
        $_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('wrt');
        if (!($fd = @fopen($_tmp_file, 'wb'))) {
            $smarty->trigger_error("problem writing temporary file '$_tmp_file'");
            return false;
        }
    }

    fwrite($fd, $params['contents']);
    fclose($fd);

    // Delete the file if it allready exists (this is needed on Win,
    // because it cannot overwrite files with rename()
    if (file_exists($params['filename'])) {
        @unlink($params['filename']);
    }
    @rename($_tmp_file, $params['filename']);
...
а конкретно - непонятен комментарий - "write to tmp file, then rename it to avoid file locking race condition", однозначно указывающий на то, что люди вставили это ВМЕСТО использования flock().
 

SiMM

Новичок
В smarty не предполагается, что шаблоны кто-то будет менять одновременно. А даже если так - вопрос о том, чьи изменения принять - довольно сложный - проще не париться и принять, как получится.
 
Сверху