PHPのfopen関数はファイルやWebページにアクセスするために必要な関数ですが、その内容を取り出す関数ではありません。ファイルストリームを作成するための関数です。そのため使い方が難しいのでは、と思われる方もいるでしょう。
そこで今回はPHPでファイルやWebページにアクセスするストリームを開くための関数、fopenについて解説します。
目次
fopenはストリームを作る関数
PHPでファイルを扱うためには、最初にfopenを使用します。では、fopenとはどのような関数でしょうか。PHPの公式ドキュメントには、「fopen() は、filename で指定されたリソースをストリームに結び付けます。」と書かれています。
PHP: fopen – Manual
なんだか難しい表現だと思いませんか。この説明では分からない方に、まずはプログラムでファイルを扱う場合の考え方について解説します。
そもそもストリームとは
C言語では、ファイルにアクセスする場合、ファイルからデータを取り出したり書き込んだりするための抽象的なインターフェースを使います。この抽象的なインターフェースがストリームです。
PHPはC言語の影響を大きく受けたプログラム言語であり、ファイルにアクセスする処理もC言語と同じような仕組みを採用しています。そのためPHPでファイルにアクセスする際に利用する抽象的なインターフェースを使用しており、それがストリームです。
つまりfopenは、アクセスする際に利用する抽象的なインターフェースであるストリームを作るための関数です。
なおC言語とは、1972年に登場してから使われて続けている歴史の長いプログラム言語の1つ。そのため、専門学校などで教えられていますが、難解な言語としても有名です。C言語について知りたい方はこちらの記事も参照してください。
プログラミング言語の人気を分析!2020年終盤に学ぶべき言語ストリームはファイルポインタとも言う
C言語では、先ほど紹介したストリームのことをファイルポインタとも呼びます。なおファイルポインタとは、ファイルに格納されているデータの位置を表現する抽象的な変数です。C言語ではメモリーの位置を表現する変数のことをポインターと呼びますが、ファイルに対する同じような抽象的な変数ということでファイルポインタと呼びます。
具体的には、fopen関数でファイルにアクセスできるようになった状態では、ファイルポインタはファイルの先頭のデータを指します。そして、順にデータを読み込んでいくとファイルポインタも先に進み、最終的にファイルの終端まで進みます。
なおPHPには、fopen関数で作成したファイルポインタの指す位置を移動するための関数も用意されています。
fopenとfcloseをセットで使う
fopen関数でファイルを開いたら、そのままにしてはいけません。開いたファイルを閉じる必要があります。そしてfopen関数で開いたファイルを閉じるための関数がfclose関数です。
なおfclose関数では、fopen関数で作成したストリームを指定することで、そのファイルを閉じる関数です。PHPのプログラムでは、fopen関数とfclose関数をセットで利用してください。
fopen関数の基本
先ほど説明したように、PHPのプログラムでファイルを扱う際、fopen関数でストリームを作成し、それを使用してファイルの読み取りや書き込みを実施します。ただしfopen関数は独特のオプションがあり、それを正しく指定しないと使えないので注意が必要です。
次からfopen関数の基本について紹介します。
fopen関数の基本的な使い方
通常fopen関数でファイルにアクセスするためのストリームを作成するには、ファイル名のパス名と、アクセスするモードの2つを指定します。なお、アクセスするモードを正しく指定しないとエラーになるので注意してください。
fopenの基本的な使い方
ストリーム = fopen( ファイル名, アクセスするモード );
2番目の引数であるアクセスするモードは、C言語のfopen関数で使われるモードがベースになっており、PHP独自に拡張されたモードもありますが、基本的なモードは次の3つです。
- r:読み込みのみでオープンする。
- w:書き込みのみでオープンし、ファイルの先頭から上書きで書き込みます。
- a:書き込みのみでオープンし、ファイルの終端から追加で書き込みます。
ファイルを読み込む例
PHPのfopen関数を利用してテキストファイルを読み込む場合、ファイル名と読み込みモードの「r」を指定します。次にその例を紹介するので参考にしてください。
PHPでテキストファイルを読み込む例
1 2 3 4 5 6 7 8 9 |
<?php $fp = fopen("list.txt", "r"); if($fp) { while(($buffer = fgets($fp, 4096)) !== false) { echo $buffer; } fclose($fp); } ?> |
この例は、テキストファイル「list.txt」を読み込みモードで開き、fopen関数でストリーム$fpを作成。それをfgets関数で利用して1行ずつ読み込み、同時に表示するプログラムです。さらに最後まで表示させたらfclose関数でファイルを閉じています。
ファイルを書き出す例
PHPのfopen関数を利用してデータをファイルに書き出す場合、ファイル名と上書きで書き込むモードの「w」を指定します。次にその例を紹介するので参考にしてください。
なお、既にあるファイルの末尾にデータを追加する場合は、「a」モードを使います。「w」モードと「a」モードをうまく使い分けましょう。
PHPでテキストファイルを書き込む例
1 2 3 4 5 6 7 8 |
<?php $data = "これはphpによって書き込まれたテキストファイルです。\n"; $fp = fopen("out.txt", "w"); if($fp) { fwrite($fp, $data); fclose($fp); } ?> |
これは「out.txt」というファイルに上書きするモードでストリームを作成し、fwrite関数で$dataの文字列をファイルに書き込む例です。もし、「w」モードの代わりに「a」を指定すると、ファイルの末尾に$dataの内容を追加します。
fopenでWebサイトにアクセスする
PHPのfopen関数は、ファイルの代わりにURLを指定することでWebページのHTMLをダウンロードし、それをプログラムで処理することが可能です。なお使い方は簡単で、ファイルのパス名の代わりにURLを指定します。
次からfopen関数を用いてWebページをPHPのプログラムで処理する方法を紹介するので参考にしてください。
fopenでURLを指定する
先ほど紹介したようにfopen関数でオープンできるのがファイルだけではありません。パス名の代わりにURLを指定すればそのWebページのHTMLをプログラムに取り込むことが可能です。
しかも使い方はファイルをオープンするのと同じで、fopenの1番目の引数にURLを指定するだけ。これだけで、fopen内部で読み込み先を切り替えて指定されたWebページのHTMLを読み込みます。例えば、次の例を見てください。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php $url = "https;//webkatsu.com"; $fp = fopen($url, "r"); if($fp) { while(($buffer = fgets($fp, 4096)) !== false) { if(strpos($buffr, "<title>") !== false ) { echo $buffer; } } fclose($fp); } ?> |
ただし、URLを「w」や「a」といった書き込みモードでオープンすることはできません。Webサイトにファイル転送する場合は、別の方法を利用してください。
ftpもオープンできるものの注意が必要
先ほどfopenでURLを指定できると解説しましたが、この場合fopen内部でファイルストリームをhttpプロトコルによるアクセスに切り替えて接続しています。では他にこのような切り替え可能なプロトコルがあるのでしょうか。
fopenはhttpの他にftpプロトコルもサポートしています。しかし、ftpは暗号化されておらず、セキュリティに問題を抱えたプロトコルです。そのため、ほとんどのWebブラウザでftpプロトコルは非推奨扱いになりました。
fopenでは「ftp:」で始まるURL利用しないようにし、安全な別の方法を検討してください。
まとめ
今回紹介したfopen関数はファイルにアクセスする際に利用するストリームを作る関数です。そしてfopen関数で作成したストリームを使い、fgetsやfwriteなどのファイルをアクセスする関数で指定し、ファイルの読み書きを実施します。なおfopen関数で作ったストリームは必ずfclose関数で閉じてください。
さらにfopen関数でファイルのパスの代わりにURLを指定するとWebページのHTMLをプログラムに取り込むことも可能です。このようにfopen関数はWebサーバーに置いたファイルや外部のサイトを利用するプログラムで活用できます。PHPを利用したWebシステム構築の際には、ぜひ利用してください。