file_get_contents関数の基本構文
ファイルやURLで指定した内容を全て変数に格納します。
一気にメモリ内に全行格納するため、行数が多い場合の処理は高速で時間はかからないですがメモリ消費が大きくなる可能性があります。
fopen/fcloseなどのファイル操作は不要で便利ですが、ファイルのロックはされないので注意してください。
複数人が任意のタイミングで同時に書き込むようなファイルの読み込み処理の場合は読み込み時に書かれてしまい、破損したファイルを読み込む可能性があるのでfile_get_contentsの使用は避けた方がよいでしょう。
読み込み中は書かせない等のロックをかける必要があるのでfreadを使って自分で開閉(fopen/fclose)とロック管理(flock)した方がよいです。
file_get_contents ( string $filename , bool $use_include_path = false , resource $context = ? , int $offset = 0 , int $length = ? ) : string|false
パラメータ
型 | 名前 | 初期値 | 説明 |
string | $filename | ファイルの名前やパス。https://などのスキームから始まるURLも入力できる。 | |
bool | $use_include_path | false | 指定されたファイルの検索にphpの設定の中のinclude_pathに設定されているディレクトリを参照するかどうか。 |
resource | $context | stream_context_create() で作成したコンテキストリソース。未使用の場合はnull | |
int | $offset | 0 | 読み込み開始オフセット位置。 |
int | $length | 読み込み最大バイト数 |
返り値(戻り値)
型 | 説明 | 例 |
string|false | 読み込んだデータを返す。失敗時はfalse |
失敗の内容によってはE_WARNINGが発生します。
file_get_contents関数の使い方
ファイルから中身のテキストを一気に読み込み変数に格納するサンプルソースコード
//=======================================================
// ファイルから中身のテキストを一気に読み込み変数に格納するサンプル
//=======================================================
$read_file = 'input/line-100.csv'; //読み込みファイル
$data = file_get_contents($read_file);
print_r($data);
exit;
ファイルのテキストを一気に読み込みその後行ごとに処理するサンプルソースコード
//=======================================================
// ファイルのテキストを一気に読み込みその後行ごとに処理するサンプル
//=======================================================
$read_file = 'input/line-100.csv'; //読み込みファイル
$data = file_get_contents($read_file);
$lines = preg_split("/\r*\n/", $data); //テキストを改行で分割
foreach($lines as $line){
if(trim($line) == null){
continue; //空行はスキップ
}
echo $line . PHP_EOL;
}
【応用】URL,ファイルどちらからでも読み込めてエラー処理もするサンプルソースコード
//=======================================================
// URL,ファイルどちらからでも読み込めてエラー処理もあるサンプル
//=======================================================
//コンテンツ取得先
$url_or_file = "https://trios.pro/test-page/"; //URLの場合
//$url_or_file = "https://trios.pro/notfound/"; //URLの場合(404エラー)
//$url_or_file = 'input/line-100.csv'; //ファイルの場合
//$url_or_file = 'notfound/line-100.csv'; //ファイルの場合(存在しないファイル)
$is_url = false; //読み込み元がURLかどうか
$context = null; //HTTP通信の場合のストリームのコンテキスト
try{
//与えられたデータ読み込み元がURLかどうか
if(preg_match("|^https?://|", $url_or_file) > 0){
$is_url = true;
//リクエストヘッダの内容を設定
$opts = array(
'https' => array(
'method'=> "GET",
'header'=> "Content-Type: text/html; charset=UTF-8\r\n"
. "Accept-Encoding: gzip, deflate, br\r\n"
. "Cookie: test_cookie1=abc; test_dookie2=def\r\n"
)
);
$context = stream_context_create($opts); //ストリームのコンテキスト作成
}
//ファイルまたはURLのデータの内容取得
echo "データ読み込み: {$url_or_file}" . PHP_EOL;
$data = file_get_contents($url_or_file, false , $context);
//正常にデータが取得できた
if($data !== false){
echo "読み込んだバイト数: " . strlen($data) . PHP_EOL;
//$dataと使ってここに成功した時の処理をかく
//異常終了
}else{
//URLから取得する場合
if($is_url === true){
//レスポンスがある場合
if(isset($http_response_header[0])){
//「$http_response_header[0]」にはステータスコードがセットされている
$response = explode(' ', $http_response_header[0]); //「$status_code[1]」にステータスコードの数字だけが入る
$response_code = $response[1];
//レスポンスコードが 1**, 2**, 3**なら成功とする
if(preg_match("/^[123][0-9][0-9]$/", $response_code) > 0){
echo "データを正常取得 レスポンスコード: {$response_code}" . PHP_EOL;
}else{
throw new Exception("HTTPエラーが発生しました。 レスポンスコード: {$response_code}");
}
//レスポンスがない場合は失敗
}else{
throw new Exception("URL: {$url_or_file}のデータを取得できませんでした(HTTP通信失敗)");
}
//ファイルから取得する場合
}else{
throw new Exception("ファイル: {$url_or_file}のデータを取得できませんでした");
}
}
if(is_array($http_response_header)){
print_r($http_response_header);
}
echo "正常終了" . PHP_EOL;
}catch(Exception $ex) {
echo "エラー終了します。" . PHP_EOL . $ex->getMessage() . PHP_EOL;
}finally{
//初期化
if(is_array($http_response_header)){
$http_response_header = null;
}
}
関連するファイルシステム関数
ファイル入出力関数の特徴まとめ
関数 | 利用シーン | 機能 | 処理単位 | ハンドル の管理 | ロック | 速度 | メモリ節約 | 安全性 | エラー時 |
fgetc | 1文字ずつ処理する | 読み | 1文字ずつ | 別途 | 別途 | × | ○ | △自前 | 終端でfalse |
fgets | 1行ずつ処理する | 読み | 1行ずつ | 別途 | 別途 | △ | ○ | △自前 | 終端かエラー でfalse |
fread | 固定バイトごとに 処理する | 読み | 指定バイト | 別途 | 別途 | ○一括 ×分割 | ×一括 ○分割 | △自前 | エラーでfalse |
fgetcsv | CSVファイルを 1行ずつ読み込む | 読み | 1行ずつ | 別途 | 別途 | × | ○ | △自前 | エラーで0かnull |
file | ロック不要のファイル を行ごとに高速処理 &同時アクセスが少ない | 読み | データ全部 | 不要 | ロックなし | ○ | × | × | エラーでfalseや E_WARNING |
file_get_contents | ロック不要のファイル の文字列全体を高速取得 &同時アクセスが少ない | 読み | データ全部 | 不要 | ロックなし | ○ | × | × | エラーでfalseや E_WARNING |
fwrite fputs | ハンドル利用時の 書込処理全般 | 書き | 指定バイト | 別途 | 別途 | ○一括 ×分割 | ×一括 ○分割 | △自前 | エラーでfalse |
fputcsv | CSVを1行ずつ書込時 | 書き | 1行ずつ | 別途 | 別途 | × | ○ | △自前 | エラーでfalse |
file_put_contents | 1~数回だけ書込する時。 繰り返しは非常に遅い。 | 書き | データ全部 | 不要 | ロック指定可能 | ○一括 ×分割 | ×一括 ○分割 | △フラグ指定 | エラーでfalse |
コメント