fopen

ファイルまたは URL をオープンする

説明

resourcefalse fopen(
    string $filename,
    string $mode,
    bool $use_include_path = false,
    resourcenull $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 は、 そのストリームに要するアクセス形式を指定します。 この指定は、下表のうちのどれかとなります。

fopen で使用可能な 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_pathtrue を設定することにより、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 を呼ぶようにしましょう。

参考