現在の位置: ホーム> 最新記事一覧> file_get_contentsを使用してzipなどの圧縮ファイルを読み取る方法は?実現可能性と方法分析

file_get_contentsを使用してzipなどの圧縮ファイルを読み取る方法は?実現可能性と方法分析

gitbox 2025-08-11

file_get_contents()はどのように機能しますか

file_get_contents()は単純なファイル読み取り関数であり、その基本機能はファイル全体の内容を読み取り、返すことです。通常、テキストファイルの読み取りに使用され、小さなバイナリファイルにも非常に適しています。ただし、大きなファイルまたは圧縮ファイルの場合、この関数の効率と適用性は制限される場合があります。

PHPでは、 file_get_contents()がファイルをメモリに直接ロードします。したがって、ファイルが大きい場合、メモリの使用量が高くなり、メモリオーバーフローが発生する可能性があります。圧縮ファイルの場合、 file_get_contents()はバイナリデータを読み取るだけで、その内容を直接解凍または読み取ることはできません。


zipファイルを直接読み取るという課題

zipファイルは、基本的に複数のファイルまたはディレクトリを含むバイナリ形式の圧縮ファイルです。 file_get_contents()は、圧縮ファイル全体の元のバイナリデータを読み取ります。つまり、zipファイルを直接読み取ると、減圧コンテンツの代わりに圧縮バイナリストリームが取得されます。

したがって、zipファイルからファイルの内容を抽出する場合、 file_get_contents()はこのタスクを直接完了できません。その中のファイルを読み取ることができるようにするには、zipファイルの内容を解凍する必要があります。


解決策:PHPを使用したzip拡張機能

file_get_contents()自体はzipファイルの特定のコンテンツを直接読み取ることはできませんが、phpの内蔵ziparchiveクラスを使用してzipファイルを操作できます。このクラスを使用すると、ZIPファイルを開き、読み取り、減圧できます。以下は、 ziparchiveを使用してzipファイルの内容を読み取る例です。

サンプルコード:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$zipFile</span></span><span> = </span><span><span class="hljs-string">'example.zip'</span></span><span>;  </span><span><span class="hljs-comment">// ZIP ファイルパス</span></span><span>
</span><span><span class="hljs-variable">$zip</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">ZipArchive</span></span><span>;

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">open</span></span><span>(</span><span><span class="hljs-variable">$zipFile</span></span><span>) === </span><span><span class="hljs-literal">TRUE</span></span><span>) {
    </span><span><span class="hljs-comment">// 得る ZIP ファイル内の最初のファイル名</span></span><span>
    </span><span><span class="hljs-variable">$fileName</span></span><span> = </span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getNameIndex</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>);  </span><span><span class="hljs-comment">// 得る第一个書類的名称</span></span><span>

    </span><span><span class="hljs-comment">// ファイルの内容をお読みください</span></span><span>
    </span><span><span class="hljs-variable">$fileContent</span></span><span> = </span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getFromName</span></span><span>(</span><span><span class="hljs-variable">$fileName</span></span><span>);

    </span><span><span class="hljs-comment">// 出力ファイルコンテンツ</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$fileContent</span></span><span>;

    </span><span><span class="hljs-comment">// 閉鎖 ZIP 書類</span></span><span>
    </span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</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">'開くことができません ZIP 書類!'</span></span><span>;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

この例では、最初にZiparchiveクラスを使用してZIPファイルを開き、次にgetFromName()メソッドを使用してZIPファイルの最初のファイルの内容を読み取ります。このようにして、圧縮ファイル全体のバイナリデータを直接読み取る代わりに、圧縮パッケージ内のファイルを簡単に抽出できます。


ziparchivefile_get_contents()を使用します

file_get_contents()自体はzipファイルを解凍できませんが、 file_get_contents()を使用してzipファイルの元のバイナリコンテンツを読み取り、減圧のためにziparchiveクラスに渡すことができます。このようにして、 file_get_contents()はファイルを読むための前提条件となり、実際の減圧操作はziparchiveによって完了します。

サンプルコード:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$zipFile</span></span><span> = </span><span><span class="hljs-string">'example.zip'</span></span><span>;  </span><span><span class="hljs-comment">// ZIP ファイルパス</span></span><span>

</span><span><span class="hljs-comment">// 読む ZIP 書類的原始内容</span></span><span>
</span><span><span class="hljs-variable">$zipData</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$zipFile</span></span><span>);

</span><span><span class="hljs-comment">// 将読む到的二进制数据传递给 ZipArchive 減圧</span></span><span>
</span><span><span class="hljs-variable">$zip</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">ZipArchive</span></span><span>;
</span><span><span class="hljs-variable">$tmpFile</span></span><span> = </span><span><span class="hljs-title function_ invoke__">tempnam</span></span><span>(</span><span><span class="hljs-title function_ invoke__">sys_get_temp_dir</span></span><span>(), </span><span><span class="hljs-string">'zip'</span></span><span>);  </span><span><span class="hljs-comment">// 创建一个临时書類</span></span><span>

</span><span><span class="hljs-title function_ invoke__">file_put_contents</span></span><span>(</span><span><span class="hljs-variable">$tmpFile</span></span><span>, </span><span><span class="hljs-variable">$zipData</span></span><span>);  </span><span><span class="hljs-comment">// 将読む的二进制数据写入临时書類</span></span><span>

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">open</span></span><span>(</span><span><span class="hljs-variable">$tmpFile</span></span><span>) === </span><span><span class="hljs-literal">TRUE</span></span><span>) {
    </span><span><span class="hljs-comment">// 得る ZIP ファイル内の最初のファイル名</span></span><span>
    </span><span><span class="hljs-variable">$fileName</span></span><span> = </span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getNameIndex</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>);  </span><span><span class="hljs-comment">// 得る第一个書類的名称</span></span><span>

    </span><span><span class="hljs-comment">// ファイルの内容をお読みください</span></span><span>
    </span><span><span class="hljs-variable">$fileContent</span></span><span> = </span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getFromName</span></span><span>(</span><span><span class="hljs-variable">$fileName</span></span><span>);

    </span><span><span class="hljs-comment">// 出力ファイルコンテンツ</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$fileContent</span></span><span>;

    </span><span><span class="hljs-comment">// 閉鎖 ZIP 書類</span></span><span>
    </span><span><span class="hljs-variable">$zip</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();

    </span><span><span class="hljs-comment">// 删除临时書類</span></span><span>
    </span><span><span class="hljs-title function_ invoke__">unlink</span></span><span>(</span><span><span class="hljs-variable">$tmpFile</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">'開くことができません ZIP 書類!'</span></span><span>;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

この例では、最初にfile_get_contents()を介してzipファイルのバイナリデータを読み取り、次にデータを一時ファイルに書き込みます。次に、 Ziparchiveクラスを使用して、この一時的なファイルを開き、その中の内容を読み取ります。このようにして、 file_get_contents()は生データを読むためのツールになり、減圧操作はまだ完了のためにziparchiveに引き渡されます。