PHP Conference Japan 2024

dio_open

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

dio_open以比 C 函式庫輸入/輸出串流函式更低的層級開啟檔案(必要時建立檔案)

說明

dio_open(字串 $filename, 整數 $flags, 整數 $mode = 0): 資源

dio_open() 開啟一個檔案並傳回一個新的檔案描述符。

參數

filename

要開啟的檔案路徑名稱。

flags

flags 參數是一個以位元或 (bitwise-ORed) 運算組合的值,包含以下列表中的標記。此值*必須*包含 O_RDONLYO_WRONLYO_RDWR 其中之一。此外,它還可以包含此列表中其他標記的任意組合。

  • O_RDONLY - 以唯讀模式開啟檔案。

  • O_WRONLY - 以唯寫模式開啟檔案。

  • O_RDWR - 以讀寫模式開啟檔案。

  • O_CREAT - 若檔案不存在,則建立檔案。

  • O_EXCL - 若同時設定了 O_CREATO_EXCL,且檔案已存在,則 dio_open() 將會失敗。

  • O_TRUNC - 若檔案存在且以寫入模式開啟,則檔案將會被截斷為零長度。

  • O_APPEND - 寫入操作會將資料附加到檔案的末尾。

  • O_NONBLOCK - 設定非阻塞模式。

  • O_NOCTTY - 防止作業系統在開啟 TTY 設備檔案時,將開啟的檔案指定為程序的控制終端。

mode

如果 flags 包含 O_CREAT,則 mode 將會設定檔案的權限(建立權限)。當 flags 中指定了 O_CREAT 時,需要 mode 才能正常運作,否則會被忽略。

指派給已建立檔案的實際權限將會受到程序的 umask 設定影響,如同往常一樣。

回傳值

檔案描述符,或錯誤時回傳 false

範例

範例 #1 開啟檔案描述符

<?php

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

dio_close($fd);
?>

參見

新增筆記

使用者貢獻的筆記 3 則筆記

j at pureftpd dot org
19 年前
請注意,對於檔案而言,dio_open()/dio_write()/dio_close() 比 fopen()/fwrite()/fclose() *更快*。

fwrite() 必須管理一個 8k 的緩衝區,而 dio_write() 只發出單一的 write()。最終結果是更少的系統呼叫和更少的記憶體存取。

此外,像 dio_write() 那樣將完整大小提供給 write(),讓檔案系統可以正確地使用預先配置,以避免碎片化。
Marius Karthaus
14 年前
使用直接 I/O 的主要原因之一,就是它能夠執行真正的直接 I/O,繞過作業系統快取,直接從磁碟取得資料。
執行此操作的旗標 (O_DIRECT) 在上述文件中並未提及。這或許有其原因,因為這種類型的 I/O 只能作用於區塊裝置,而非檔案,而且只有在您**真的**確定自己在做什麼的情況下才應該使用。
匿名
12 年前
使用直接 I/O 的「主要原因」是當您的應用程式提供自己的快取功能時,這樣您就不會進行雙重快取。
To Top