Я должен открыть именованный fifo из сценария php, который должен записывать в fifo, но он не всегда может быть открыт для чтения. Сейчас я пользуюсь fopen
, но он всегда блокируется, когда конец чтения fifo не открывается. Есть ли эквивалент UNIX int open(pname, O_WRONLY | O_NONBLOCK)
в php, чтобы, когда fifo не открылся, немедленно вернуться?
Нет прямого эквивалента функции C, которую вы описываете. Но вы можете использовать:
fopen($pipename, "w+")
Операция вернется немедленно, потому что она получает доступ на чтение / запись к каналу, поэтому дескриптор чтения всегда будет открыт (открытие обычного доступа на запись канал заблокирует для читателя, чтобы открыть другой конец)
Примечание: обычно люди не хотят этого делать. Нет никакого способа узнать, действительно ли реальный читатель канала получил сообщение или нет. Это может привести к потере данных.
Именованные каналы лучше всего подходят для приложений, в которых можно гарантировать, что и пишущий и читающий работают параллельно.
Других решений пока нет …