Какую нагрузку держит чтение/запись файлов в PHP?

123 4
BrokenBrake
На сайте с 03.03.2007
Offline
194
#11
DeveloperRu:
насколько я изучил документацию, можно использовать LOCK_EX в int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )

Описано это так:

LOCK_EX Acquire an exclusive lock on the file while proceeding to the writing.

А где именно про это написано? Я читал здесь - http://docs.php.net/manual/ru/function.file-put-contents.php

Там есть параметр resource $context, но ничего не говорится, что в качестве этого параметра может быть блокировка файлов.

dvaes:
слушайте netwind'а )
у флока минусов по-больше, чем с временным файлом и переименовыванием)

Ну блин. Это же техническая тема. Неужели так трудно перечислить эти минусы, если вы знаете о них? Давайте обсудим.

ewg777
На сайте с 04.06.2007
Offline
225
#12
А где именно про это написано? Я читал здесь - http://docs.php.net/manual/ru/functi...t-contents.php
Там есть параметр resource $context, но ничего не говорится, что в качестве этого параметра может быть блокировка файлов

http://docs.php.net/manual/en/function.file-put-contents.php

Flags

LOCK_EX Acquire an exclusive lock on the file while proceeding to the writing. Mutually exclusive with FILE_APPEND.
BrokenBrake
На сайте с 03.03.2007
Offline
194
#13

ewg777, спасибо! Зря я значит переделывал свой код с одной удобной строчки на несколько неудобных.

N
На сайте с 06.05.2007
Offline
419
#14
BrokenBrake:
Ну блин. Это же техническая тема. Неужели так трудно перечислить эти минусы, если вы знаете о них? Давайте обсудим.

давайте:

flock нужно вызывать каждый раз при обычном чтении, а атомарное переименование позволяет вообще не париться ни с какими вызовами. Этого мало?

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

Вообще-то я надеялся что вы вспомните еще какие-нибудь минусы переименования, помимо привязки этого метода к unix.

Кнопка вызова админа ()
BrokenBrake
На сайте с 03.03.2007
Offline
194
#15

netwind, не вспомнил, но подумал сейчас, и вижу одну проблему: c rename теоретически может случиться так, что более старые данные перезапишут более новые. Чтобы этого не происходило, надо блокировать файл, но тогда уже и raname вроде ни к чему :) Возможно, я не прав, тогда объясните почему.

BrokenBrake добавил 03.11.2009 в 19:35

Вообще, если честно, я удивлён, что нужны эти блокировки. Я раньше почему-то был уверен, что PHP должен сам понимать, что если мы пишем файл, не нужно допускать ситуаций с его чтением в тот же момент. То есть я всерьез считал, что эти все блокировки делаются автоматически. И вот, ошибся. Но почему так?

Кто нибудь может сказать, для чего может понадобиться специально чтение/запись без блокировок?

ewg777
На сайте с 04.06.2007
Offline
225
#16
То есть я всерьез считал, что эти все блокировки делаются автоматически.

SQLite (база на файлах) работает так.

BrokenBrake
На сайте с 03.03.2007
Offline
194
#17

ewg777, любая БД так работает, насколько мне известно, но причём здесь базы в этой теме? :)

N
На сайте с 06.05.2007
Offline
419
#18
BrokenBrake:
не вспомнил, но подумал сейчас, и вижу одну проблему: c rename теоретически может случиться так, что более старые данные перезапишут более новые. Чтобы этого не происходило, надо блокировать файл, но тогда уже и raname вроде ни к чему Возможно, я не прав, тогда объясните почему

Видимо, это вы о ситуации когда два процесса внезапно и одновременно решают обновить кеш.

Конечно, они поочередно отработают с flock, но ведь это же кеш. Там информация будет отличаться ненамного. По сравнению с общей сложностью flock, для вебсайтов я бы все равно выбрал бы rename.

BrokenBrake:
Вообще, если честно, я удивлён, что нужны эти блокировки. Я раньше почему-то был уверен, что PHP должен сам понимать, что если мы пишем файл, не нужно допускать ситуаций с его чтением в тот же момент. То есть я всерьез считал, что эти все блокировки делаются автоматически. И вот, ошибся. Но почему так?

Путаете с реляционными базами данных.


Кто нибудь может сказать, для чего может понадобиться специально чтение/запись без блокировок?

Отсутствие синхронизации всегда быстрее. Неужели не очевидно.

BrokenBrake
На сайте с 03.03.2007
Offline
194
#19
netwind:
Видимо, это вы о ситуации когда два процесса внезапно и одновременно решают обновить кеш.
Конечно, они поочередно отработают с flock, но ведь это же кеш. Там информация будет отличаться ненамного. По сравнению с общей сложностью flock, для вебсайтов я бы все равно выбрал бы rename.

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

netwind:
Отсутствие синхронизации всегда быстрее. Неужели не очевидно.

Но при этом при нагрузках всё выше вероятность проблем с потерей данных. Причем, эта вероятность не исчезает полностью - сбой может произойти и при маленькой нагрузке. Не слишком ли дорого обходятся эти микросекунды? Да и не очевидно, если честно.

N
На сайте с 06.05.2007
Offline
419
#20
BrokenBrake:
Не, я не про кэш, у меня в файл пишутся статистические данные, неплохо бы, чтобы они были точными.

так это счетчик просмотров на файлах? Я думал вся затея ради кеширования данных не имеющих "бухгалтерского" значения. rename тут не подходит.

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

123 4

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий