今回はPHPでWeb上にあるファイルを読み込む4つの方法について解説します。
PHPはWebアプリケーション開発によく使われる言語ですので、Web上に存在するファイルにアクセスしなければいけない場面がよくあります。用途に応じた4つの方法がありますので、しっかり学んでプログラム開発に役立ててください。
ざっくりPHP入門(初心者〜中級者向け)目次
今回の目的
今回の目的はPHPで用意されている関数を使って、Web上のファイルを読み込むことにあります。以下のHTMLファイル(index.htmlというファイル名で保存したとします)をWebサーバーに置いているという前提で以降の説明をしたいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PHP Test</title> </head> <body> <h1>Hello PHP!</h1> </body> </html> |
file_get_contentsで一括で読み込む
file_get_contents関数はたった1行でWeb上のファイルを全文を文字列として読み込むことができます。以下が例となります。(ドメイン名を省略して「…」と表記しています)
1 2 |
$html = file_get_contents("http://.../index.html"); echo $html ."\n"; |
出力結果は以下の通り、index.htmlのソースコードを出力することができました。
1 2 3 4 5 6 7 8 9 10 11 12 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PHP Test</title> </head> <body> <h1>Hello PHP!</h1> </body> </html> |
file関数で1行ごと配列化する
file関数はファイルの中身を1行ごと配列化してくれる関数です。出力する場合はforeach処理を使います。
1 2 3 4 |
$lines = file("http://.../index.html"); foreach($lines as $line) { echo($line); } |
出力結果は以下の通りです。file_get_contentsのようにファイルの中身をすべて文字列化するのに対しfile関数では行ごとに分解されているので、例えば特定の文字列を探す際に効果的です。
1 2 3 4 5 6 7 8 9 10 11 12 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PHP Test</title> </head> <body> <h1>Hello PHP!</h1> </body> </html> |
fgets関数で1行ごと読み込む
fgets関数の使用例は以下のとおりです。fgets関数はfile関数同様1行ごとにファイルを読み込んでくれます。同じく行ごとに文字検索などの処理をさせるのに有利です。
1 2 3 4 5 |
$fp = fopen("http://.../index.html", 'r'); while (($line = fgets($fp))) { echo $line; } fclose($fp); |
出力結果は以下のとおりです。行単位でファイルにアクセスするのでアクセス回数が多いことが欠点ですが、行ごとに変数に格納するためメモリ消費量を抑えられるという利点があります。
1 2 3 4 5 6 7 8 9 10 11 12 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PHP Test</title> </head> <body> <h1>Hello PHP!</h1> </body> </html> |
例えば以下のように「title」という文字列が含まれていたら処理を中断するような場合は、その行までしかファイルを読み込みません。
1 2 3 4 5 6 7 |
$fp = fopen("http://.../index.html", 'r'); while (($line = fgets($fp))) { //title行があったら読み込み中断 if(preg_match('/title/',$line)) break; echo $line; } fclose($fp); |
出力結果は以下のとおりです。全文読み込む必要のないケースではfgets関数が有利になる場合があります。
1 2 3 4 5 6 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
readfile関数で出力までを1行で行う
最後にreadfile関数を紹介します。ファイル読み込みから出力まで以下のように1行で実現できます。
1 |
readfile("http://.../index.html"); |
結果はご覧のとおりです。readfile関数の利点は変数に格納しない分メモリ消費量が少なくて済みます。しかし何の処理もなく出力してしまうreadfile関数にどんな用途があるのでしょうか。
1 2 3 4 5 6 7 8 9 10 11 12 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PHP Test</title> </head> <body> <h1>Hello PHP!</h1> </body> </html> |
一般的に使われるのはファイルダウンロードです。ダウンロードは巨大なファイルを扱う場合が多いのでその中身を変数に入れるようなことは禁じ手です。以下のようにzipファイルを指定することで変数を介さずともダウンロードが可能になるわけです。
1 |
readfile("http://.../file.zip"); |
但し、readfile関数を使ったダウンロードを行う場合は、出力バッファリングを無効化する処理が必要となります。今回の趣旨からは外れるので説明は省略しますがファイルダウンロードを実装する場合は覚えておいてください。
まとめ
いかがでしょうか。今回はPHPでWeb上にあるファイルを読み込む4つの方法について解説しました。
PHPはWebアプリケーション開発によく使われる言語ですので、外部サーバー上のファイルを読み込むケースはよくあります。今回4つの方法について解説しましたが、用途に応じて使い分け効率的なプログラム開発を目指してください。