PHPでは、ローカルファイルのコンテンツを読むことは一般的な操作です。 file_get_contents()は、ファイルのコンテンツを文字列に直接読み取ることができる非常に便利な機能です。この関数は、ローカルファイルを読み取るだけでなく、ネットワーク上のファイル、またはリモートファイルを読み取ることもできます。この記事では、file_get_contents()を使用してローカルファイルのコンテンツを読み取り、いくつかの一般的な用途と予防策を紹介する方法について説明します。
file_get_contents()は、ファイルの内容を読み取り、ファイルの内容を文字列として返すことができるphpビルトイン関数です。関数の基本的な構文は次のとおりです。
<span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$filename</span></span><span> [, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$flags</span></span><span> = </span><span><span class="hljs-number">0</span></span><span> [, resource </span><span><span class="hljs-variable">$context</span></span><span> = </span><span><span class="hljs-literal">NULL</span></span><span> [, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$offset</span></span><span> = -</span><span><span class="hljs-number">1</span></span><span> [, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$maxlen</span></span><span> = </span><span><span class="hljs-literal">NULL</span></span><span> ]]] )
</span></span>$ filename :読み取るファイル名は、相対パスまたは絶対パスをサポートします。
$ flags :いくつかの読み取りオプションを設定するオプションパラメーター(たとえば、 file_use_include_pathまたはfile_binaryに設定できます)。
$コンテキスト:ストリームのコンテキストを指定する有効なstream_contextリソース、デフォルトはnullです。
$ offset :ファイルの開始位置が読み取り、デフォルトは-1であり、ファイルの開始位置から読み取られることを示します。
$ maxlen :読み取る最大バイト数、デフォルトはnullです。これはファイル全体を読み取ることを意味します。
それを使用する最も簡単な方法は、ファイルパスをパラメーターとして直接渡すことです。例は次のとおりです。
<span><span><span class="hljs-variable">$file_content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file_content</span></span><span>;
</span></span>上記のコードは、 example.txtファイルの内容を読み取り、ページに出力します。ファイルが存在する場合、ファイルの内容は文字列として返されます。ファイルが存在しない場合、関数はfalseを返し、可能なエラーに対処する必要があります。
通常、ファイルの読み取りに失敗した後にエラーを回避するためにファイルが存在するかどうかを判断する必要があります。 file_exists()またはis_file()関数を使用して、ファイルが存在するかどうかを確認できます。
<span><span><span class="hljs-variable">$file_path</span></span><span> = </span><span><span class="hljs-string">'example.txt'</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$file_path</span></span><span>)) {
</span><span><span class="hljs-variable">$file_content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$file_path</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file_content</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'ファイルは存在しません'</span></span><span>;
}
</span></span>または、 @エラーサプレッサーを使用して、エラーメッセージの出力を防ぐこともできます。
<span><span><span class="hljs-variable">$file_content</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$file_content</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'ファイルの読み取りが失敗しました'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file_content</span></span><span>;
}
</span></span>ただし、他のエラーをマスクする可能性があるため、 @をあまり使用することはお勧めしません。
file_get_contents()は、デフォルトでファイル全体を読み取ります。ファイルが非常に大きい場合、これによりメモリの使用が過度に使用され、プログラムがクラッシュする可能性があります。ファイルの一部のみを読む必要がある場合、またはブロックごとにファイルを読みたい場合は、 $ offsetと$ maxlenパラメーターを使用できます。
たとえば、ファイルの先頭から100バイトを読み取ります。
<span><span><span class="hljs-variable">$file_content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>, </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">100</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file_content</span></span><span>;
</span></span>file_get_contents()は、ファイルの読み取りのコンテキストの設定もサポートし、ファイルのアクセス方法を制御できるようにします(たとえば、プロキシ、タイムアウトなど)。コンテキストを設定する必要がある場合は、 stream_context_create()関数を使用してコンテキストリソースを作成できます。
例:タイムアウト制限を設定します
<span><span><span class="hljs-variable">$options</span></span><span> = [
</span><span><span class="hljs-string">'http'</span></span><span> => [
</span><span><span class="hljs-string">'timeout'</span></span><span> => </span><span><span class="hljs-number">5</span></span><span> </span><span><span class="hljs-comment">// にタイムアウトを設定します 5 2番</span></span><span>
]
];
</span><span><span class="hljs-variable">$context</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>(</span><span><span class="hljs-variable">$options</span></span><span>);
</span><span><span class="hljs-variable">$file_content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>, </span><span><span class="hljs-variable">$context</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file_content</span></span><span>;
</span></span>file_get_contents()は、ローカルファイルだけでなくリモートファイルも読み取りをサポートしています。 URLアドレスを提供する必要があります。たとえば、Webページのコンテンツを読む:
<span><span><span class="hljs-variable">$url</span></span><span> = </span><span><span class="hljs-string">'https://www.example.com'</span></span><span>;
</span><span><span class="hljs-variable">$html_content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$url</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$html_content</span></span><span>;
</span></span>リモートファイルを読み取る必要がある場合は、PHP構成のAlow_url_fopenオプションが有効になっていることを確認してください。有効になっていない場合は、 PHP.ini構成ファイルを介して有効にできます。
パフォーマンスの問題:ファイルが非常に大きい場合、 file_get_contents()を使用してファイル全体を一度に読み取ると、メモリが過度に使用される可能性があります。 fopen() 、 fgets() 、またはfread()関数を使用して、行またはブロックごとにファイルコンテンツを読み取ることを検討できます。
エラー処理:ファイルの読み取りが失敗した場合、 file_get_contents()はfalseを返します。したがって、それを使用する場合は、予測不可能なエラーを避けるために、返品値を確認してください。
ファイル許可:特にプロダクション環境では、PHPプロセスがファイルに十分な権限があることを確認してください。
file_get_contents()は、非常にシンプルなファイル読み取り機能であり、小さなファイルを読み取り、ファイルの全体的なコンテンツを読み取るのに適しています。大きなファイルの場合、メモリを保存するためにオンデマンドの読み取り値を考慮する必要があります。コンテキストを設定することにより、ファイル読み取りの動作を柔軟に制御し、 file_get_contents()のアプリケーションシナリオを強化することもできます。
行ごとの読み取りや大きなファイルの処理など、より複雑なファイル読み取り要件がある場合は、 Fopen() 、 Fread() 、 File()などの他のファイル操作関数を使用することを検討できます。
関連タグ:
file_get_contents