(PHP 4, PHP 5, PHP 7, PHP 8)
fopen — ファイルまたは URL をオープンする
$filename
,$mode
,$use_include_path
= false
,$context
= null
fopen() は、filename
で指定されたリソースをストリームに結び付けます。
filename
filename
が "スキーム://..." の形式である場合、
それは URL とみなされ、PHP はそのプロトコルのハンドラ
(ラッパーともいいます) を探します。
もしもそのプロトコルに対するラッパーが登録されていない場合、
PHP はスクリプトに潜在的な問題があることを示す NOTICE を発行したうえで、
filename
を通常のファイルとみなしてオープンすることを試みます。
PHP は、filename
がローカルのファイルを示しているとみなすと、
そのファイルへのストリームをオープンします。
そのファイルはPHPからアクセスできるものでなければなりません。
ファイルのパーミッションが (パラメータで指定された)
アクセスを許可されているかどうか確認する必要があります。
open_basedir
を有効にしている場合は、更なるアクセス制限が加えられることがあります。
filename
が登録されているプロトコルを示していると
PHP が判断し、かつそのプロトコルがネットワーク URL として登録されていれば、
PHP は allow_url_fopen
が有効となっているかどうかチェックします。
もしこれがオフになっていると、PHP は warning を発行し fopen は失敗します。
注意:
サポートされているプロトコルのリストは サポートするプロトコル/ラッパー にあります。 いくつかのプロトコル (
wrappers
にも関連する) はcontext
かつ/または php.ini のオプションをサポートします。 使用するプロトコルについてセットされるオプションのリストについては、 それぞれのページを見てください (例えば、 php.ini 上のuser_agent
の値はhttp
ラッパーが使用します)。
Windows 環境では、ファイルパスで用いる全てのバックスラッシュを エスケープするかフォワードスラッシュを使用することに注意してください。
<?php
$handle = fopen("c:\\folder\\resource.txt", "r");
?>
mode
パラメータ mode
は、
そのストリームに要するアクセス形式を指定します。
この指定は、下表のうちのどれかとなります。
mode |
説明 |
---|---|
'r' |
読み込みのみでオープンします。ファイルポインタをファイルの先頭に置きます。 |
'r+' |
読み込み/書き出し用にオープンします。 ファイルポインタをファイルの先頭に置きます。 |
'w' |
書き出しのみでオープンします。ファイルポインタをファイルの先頭に置き、 ファイルサイズをゼロにします。ファイルが存在しない場合には、 作成を試みます。 |
'w+' |
読み込み/書き出し用でオープンします。
それ以外の振る舞いは、'w' と同じです。
|
'a' |
書き出し用のみでオープンします。ファイルポインタをファイルの終端に置きます。 ファイルが存在しない場合には、作成を試みます。 このモードは、fseek() では何の効果もありません。 書き込みは、常に追記となります。 |
'a+' |
読み込み/書き出し用でオープンします。 ファイルポインタをファイルの終端に置きます。 ファイルが存在しない場合には、作成を試みます。 このモードは、fseek() では読み込み位置のみに影響します。 書き込みは、常に追記となります。 |
'x' |
書き込みのみでオープンします。ファイルポインタをファイルの先頭に置きます。
ファイルが既に存在する場合には fopen() は失敗し、
E_WARNING レベルのエラーを発行します。
ファイルが存在しない場合には新規作成を試みます。
これは open(2) システムコールにおける
O_EXCL|O_CREAT フラグの指定と等価です。
このオプションはPHP4.3.2以降でサポートされ、また、
ローカルファイルに対してのみ有効です。
|
'x+' |
読み込み/書き出し用でオープンします。
それ以外の振る舞いは 'x' と同じです。
|
'c' |
書き込みのみでオープンします。ファイルが存在しない場合には新規作成を試みます。
ファイルが既に存在する場合でもそれを ('w' のように) 切り詰めたりせず、
また ('x' のように) 関数のコールが失敗することもありません。
ファイルポインタをファイルの先頭に置きます。これは、アドバイザリ・ロック
(flock() を参照ください) を確保してからファイルを変更したい場合に便利です。
'w' を使うと、ロックを取得する前にファイルを切り詰めてしまいます
(もしファイルを切り詰めたいのなら、ロックを要求した後で
ftruncate() を使うこともできます)。
|
'c+' |
読み込み/書き出し用でオープンします。
それ以外の振る舞いは 'c' と同じです。
|
'e' |
オープンされたファイル記述子に close-on-exec フラグを設定します。 POSIX.1-2008 準拠のシステムでコンパイルされた PHP でのみ利用可能です。 |
注意:
オペレーティングシステムファミリが異なると行末も異なります。 テキストファイルに書き出し、そこに改行を加えたいとき、 オペレーティングシステムにあわせた正しい改行コードを使用する必要があります。 Unix ベースのシステムでは改行に
\n
キャラクタを使用します。 Windows ベースのシステムでは\r\n
を使用します。 マッキントッシュベースのシステム (Mac OS Classic) では\r
を使用します。間違った改行コードでファイルに書き込むと、 他のアプリケーション上でそのファイルを開いた際に変な風に見えてしまいます。
Windows上では、
\n
を\r\n
に透過的に変換する text-mode変換フラグ('t'
)が提供されます。 それに対し、'b'
を使って強制的にバイナリモードにすることもできます。 その場合データの変換はされません。 このフラグを使用するには、'b'
または't'
をmode
引数の最後に追加してください。デフォルトの変換モードは
'b'
です。 plain-text ファイルを使用する場合には't'
モードを指定できますし、 改行に\n
を使用すると、 古いバージョンのメモ帳のようなアプリケーションで読めることを期待できます。 それ以外のケースでは'b'
を使うべきです。バイナリファイルを扱っている際に
't'
フラグを指定した場合、 画像ファイルが壊れたり、\r\n
キャラクタがおかしくなる等の問題を抱えてしまうでしょう。
注意:
互換性維持のために、
't'
モードを使用または依存しているコードを書き直し、 正しい改行コードと'b'
モードを代わりに使用することが、 強く推奨されます。
注意: php://output, php://input, php://stdin, php://stdout, php://stderr, php://fd ストリームラッパーについては、
mode
は無視されます。
use_include_path
オプションの3番目の引数use_include_path
に'1'又は
true
を設定することにより、include_path
のファイルの検索も行うこともできます。
context
ストリームコンテキストリソース
成功した場合にファイルポインタリソース、
失敗した場合に false
を返します
失敗したときは E_WARNING
が発生します。
バージョン | 説明 |
---|---|
7.0.16, 7.1.2 |
'e' が追加されました。
|
例1 fopen() の例
<?php
$handle = fopen("/home/rasmus/file.txt", "r");
$handle = fopen("/home/rasmus/file.gif", "wb");
$handle = fopen("http://www.example.com/", "r");
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
?>
IIS のような、いくつかの標準に
対応してない Web サーバーは、PHP に警告を発生させるような手順でデータを送信します。
このようなサーバーを使用する場合は、
error_reporting を警告を発生しないレベルまで小さくする必要があります。
PHP では、https://
ラッパーでストリームをオープンする際に
バグがある IIS サーバーソフトウエアを検出することができ、この警告を抑制することができます。
あなたが ssl://
ソケットを作成するために fsockopen() を使用している場合、
自らこの警告を検出し、抑制する必要があります。
注意:
ファイルの読みこみ・書きこみ時に問題が発生し、 サーバーモジュール版のPHPを使用している場合、 使用するファイル・ディレクトリがサーバープロセスからアクセス可能かどうかを確認してください。
注意:
この関数は、
filename
がディレクトリの場合でも成功することがあります。filename
がファイルなのかディレクトリなのかがはっきりしない場合は、 まず is_dir() を使ってから fopen() を呼ぶようにしましょう。