Использование flock () для блокировки потока гарантированно работает только при каких обстоятельствах? - PullRequest
2 голосов
/ 23 июня 2010

Это вопрос PHP Zend Exam,

Использование flock () для блокировки потока гарантированно работает только при каких условиях?

  • При работе в среде Linux с локальной файловой системой
  • При доступе к потоку локальной файловой системы
  • При работе в среде Windows и доступе к общему ресурсу
  • При доступе к двунаправленному потоку
  • При доступе к потоку только для чтения

Ответы [ 2 ]

5 голосов
/ 23 июня 2010

Поток имеет этот набор операций - write, read, close, flush (обязательно, даже если они не выполняются) и seek, cast , stat, set_option (необязательно). Когда вы запрашиваете блокировку файла, операция set_option называется и называется .

Именно отсюда вы можете видеть, что двунаправленный или только для чтения не имеет к этому никакого отношения. Можно реализовать произвольную оболочку, придать эффектам записи и чтения, но не реализовать set_option, потому что это необязательно. Аналогично, в моей реализации set_option можно было бы реализовать операцию no-op write и, тем не менее, обрабатывать блокировки файлов. Запуск в среде Linux также не имеет значения, поскольку важно то, что поддерживает поток.

( ПРИМЕЧАНИЕ : я не уверен, что означает «запуск в локальной файловой системе среды Linux». Я признал, что это означает «запуск PHP из локальной файловой системы в среде Linux» вместо «например» запуск PHP из файловой системы AFS в среде Linux ". Если это означает" доступ к потоку, который поддерживает локальную файловую систему в среде Linux ", это, вероятно, правильный ответ, учитывая предупреждение, описанное ниже).

Остальные вопросы касаются потоков STDIO. Теперь, когда проверяется, поддерживает ли поток блокировку с помощью stream_supports_lock, PHP фактически не пытается скопиться, он передает операции set_option специальное значение, которое запрашивает «поддерживает ли этот поток блокировку файла»? Операция STDIO stream всегда отвечает, что делает , поэтому может показаться, что все два оставшихся ответа верны.

Однако тот факт, что операция set_option утверждает, что она поддерживает блокировку файлов, не делает это верным. Когда вы на самом деле пытаетесь получить блокировку, может перестать работать . Так когда же это гарантированно сработает? Конечно, нет общих папок Windows, поскольку они могут быть поддержаны практически чем угодно. Мы остались с "в локальной файловой системе". Таким образом, ответ, путем исключения

При доступе к потоку локальной файловой системы

Тем не менее, обратите внимание на (предположительно устаревшее) предупреждение в руководстве :

flock () не поддерживается в устаревших файловых системах, таких как FAT и его производные, и поэтому всегда будет возвращать FALSE в этой [sic] среде (это особенно верно для пользователей Windows 98).

1 голос
/ 23 июня 2010

О, хороший вопрос.

Проверка, поддерживает ли поток блокировку , была добавлена ​​только в 5.3, но в примере класса streamWrapper есть метод stream_lock , которыйкажется, "всегда" существовали.stream_lock предполагает, что он также может работать с потоками, которые могут быть заблокированы .

Я не ожидаю, что вы можете собрать сокет, поэтому похоже, что ваш ответ # 2: Вы можете с уверенностью знать, что объединение потока будет работать, когда поток является (локальным) файлом.

(Как flock работает с удаленными файлами (NFS, CIFS) зависит от службы, предоставляющей эти удаленные файлы. Некоторые старые версии различных демонов NFS, например, вообще не поддерживают flock.)

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