Поток имеет этот набор операций - 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).