PHP Conference Nagoya 2025

dio_open

(PHP 4 >= 4.2.0, PHP 5 < 5.1.0)

dio_open Abre (crea si fuera necesario) un fichero a un nivel más bajo que el permitido por flujos de entrada y salida de las bibliotecas en C

Descripción

dio_open(string $filename, int $flags, int $mode = 0): resource

dio_open() abre un fichero y devuelve su descriptor de fichero.

Parámetros

filename

Ruta del fichero a abrir.

flags

El parámetro flags es una máscara OR de bits compuesta a partir de las siguientes banderas. Estos valores tienen que incluir alguno de entre O_RDONLY, O_WRONLY, o O_RDWR. Además, podría incluir cualquier combinación del resto de banderas de la lista.

  • O_RDONLY - abre el fichero con acceso de lectura.

  • O_WRONLY - abre el fichero con acceso de escritura.

  • O_RDWR - abre el fichero con acceso de lectura y de escritura.

  • O_CREAT - crea el fichero, si no existiera ya.

  • O_EXCL - si tanto O_CREAT como O_EXCL están habilitados, y el fichero existe, dio_open() fallará.

  • O_TRUNC - si el fichero existe, y está abierto con sólo escritura, se truncará a cero.

  • O_APPEND - las operaciones de escritura añaden los datos al final del fichero.

  • O_NONBLOCK - asigna el modo no bloqueante.

  • O_NOCTTY - previene que el SO asigne al fichero abierto como el terminal controlador del proceso cuando se abra un fichero de dispositivo TTY.

mode

Si flags contiene O_CREAT, mode establecerá los permisos del ficher (permisos de creación). mode es necesario para un correcto funcionamiento cuando O_CREAT se especifica en flags, y se ignorará en cualquier otro caso.

Los permisos que realmente se asignan al fichero creado se verán afectados por el umask del proceso, como suele suceder.

Valores devueltos

Descriptor de fichero o false en caso de error.

Ejemplos

Ejemplo #1 Abrir un descriptor de fichero

<?php

$fd
= dio_open('/dev/ttyS0', O_RDWR | O_NOCTTY | O_NONBLOCK);

dio_close($fd);
?>

Ver también

add a note

User Contributed Notes 3 notes

up
4
j at pureftpd dot org
19 years ago
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.
up
2
Marius Karthaus
14 years ago
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.
up
0
Anonymous
12 years ago
"The prominent reason" to use direct I/O is when your application provides its own cache feature, so you won't do double caching
To Top