dio_open
(PHP 4 >= 4.2.0, PHP 5 <= 5.0.5, PHP 7)
dio_open — Opens a file (creating it if necessary) at a lower level than the C library input/ouput stream functions allow.
Описание
$filename
, int $flags
[, int $mode
= 0
] )dio_open() opens a file and returns a new file descriptor for it.
Список параметров
-
filename
-
The pathname of the file to open.
-
flags
-
The
flags
parameter is a bitwise-ORed value comprising flags from the following list. This value must include one ofO_RDONLY
,O_WRONLY
, orO_RDWR
. Additionally, it may include any combination of the other flags from this list.-
O_RDONLY
- opens the file for read access. -
O_WRONLY
- opens the file for write access. -
O_RDWR
- opens the file for both reading and writing. -
O_CREAT
- creates the file, if it doesn't already exist. -
O_EXCL
- if bothO_CREAT
andO_EXCL
are set and the file already exists, dio_open() will fail. -
O_TRUNC
- if the file exists and is opened for write access, the file will be truncated to zero length. -
O_APPEND
- write operations write data at the end of the file. -
O_NONBLOCK
- sets non blocking mode. -
O_NOCTTY
- prevent the OS from assigning the opened file as the process's controlling terminal when opening a TTY device file.
-
-
mode
-
If
flags
containsO_CREAT
,mode
will set the permissions of the file (creation permissions).mode
is required for correct operation whenO_CREAT
is specified inflags
and is ignored otherwise.The actual permissions assigned to the created file will be affected by the process's umask setting as per usual.
Возвращаемые значения
A file descriptor or FALSE
on error.
Примеры
Пример #1 Opening a file descriptor
<?php
$fd = dio_open('/dev/ttyS0', O_RDWR | O_NOCTTY | O_NONBLOCK);
dio_close($fd);
?>
Коментарии
Please note that dio_open()/dio_write()/dio_close() is *faster* than fopen()/fwrite()/fclose() for files.
fwrite() has to manage a 8k buffer, while dio_write() just issue a single write(). The end result is less system calls and less memory access.
Also, giving the full size to write() as with dio_write() let filesystems properly use preallocation in order to avoid fragmentation.
One of the prominent reasons to use direct IO, is for it's ability to do actual direct IO, bypassing the operating system cache and getting the data from the disk directly.
The flag to do that (O_DIRECT) is missing from the documentation above. Maybe for good reasons, because this type of IO only works on blockdevices, not on files, and should only be used if you are **really** sure what you are doing.
"The prominent reason" to use direct I/O is when your application provides its own cache feature, so you won't do double caching