【PHP8.x】Phar::compressFiles()メソッドの使い方
compressFilesメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
compressFilesメソッドは、PHPのPhar拡張機能において、Pharアーカイブ内に含まれる全てのファイルを指定された圧縮形式で圧縮を実行するメソッドです。このメソッドを利用することで、アプリケーションの配布サイズを効率的に削減し、ディスク容量の節約や転送速度の向上に役立てることができます。
圧縮形式は、Phar::GZ または Phar::BZ2 のいずれかの定数を引数として指定します。Phar::GZ はgzip形式、Phar::BZ2 はbzip2形式の圧縮を適用します。これらの圧縮形式を利用するには、それぞれPHPにzlib拡張またはbzip2拡張がロードされている必要がありますので、事前にサーバー環境を確認しておくことが重要です。
また、既に圧縮されているPharアーカイブ内のファイルの圧縮を解除したい場合は、引数に Phar::NONE を指定することで、全てのファイルの圧縮状態を元に戻すことが可能です。このメソッドはPharアーカイブ内部の個々のファイルの圧縮を制御するものであり、Phar::ZIP はこのメソッドでは指定できませんのでご注意ください。
メソッドが正常にファイルの圧縮または解除を完了した場合は true を返しますが、指定された圧縮形式が認識できない場合や、必要な拡張機能がロードされていない場合など、問題が発生した際には PharException がスローされることがあります。そのため、このメソッドを使用する際には、適切なエラーハンドリングの実装を検討することをお勧めします。
構文(syntax)
1<?php 2$phar = new Phar('my_archive.phar'); 3$phar->compressFiles(Phar::GZ);
引数(parameters)
int $compression
- int $compression: Pharアーカイブの圧縮方式を指定する整数。
Phar::GZまたはPhar::BZ2を指定します。
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHP Phar::compressFiles で内部ファイルを圧縮する
1<?php 2 3/** 4 * PHP Phar::compressFiles Example 5 * 6 * This script demonstrates how to create a Phar archive and then 7 * compress all individual files within that archive using the `Phar::compressFiles` method. 8 * 9 * For system engineers and beginners: 10 * A Phar (PHP Archive) file allows you to package an entire PHP application 11 * into a single file, simplifying distribution and deployment. 12 * 13 * The `Phar::compressFiles($compression)` method takes an integer constant 14 * (e.g., `Phar::GZ` for Gzip or `Phar::BZ2` for Bzip2) to specify the compression 15 * algorithm. It iterates through and compresses the *individual files* that 16 * have been added to the Phar archive. 17 * 18 * IMPORTANT DISTINCTION: 19 * - `Phar::compressFiles()`: Compresses files *inside* the archive. The archive itself 20 * (the .phar file) does not get a new extension like .gz or .bz2. 21 * - `Phar::compress()`: Compresses the *entire Phar archive* file, typically resulting 22 * in a new file with a `.phar.gz` or `.phar.bz2` extension. 23 * 24 * Note: To create or modify Phar archives, your `php.ini` must have `phar.readonly = 0`. 25 * Otherwise, a `PharException` will be thrown. 26 */ 27 28// Define constants for file names and directories 29const PHAR_FILE_NAME = 'my_application.phar'; 30const TEMP_DIR = 'temp_phar_files_to_compress'; 31 32/** 33 * Recursively deletes a directory and its contents. 34 * 35 * @param string $dir Path to the directory to delete. 36 */ 37function deleteDirectory(string $dir): void 38{ 39 if (!is_dir($dir)) { 40 return; 41 } 42 $files = array_diff(scandir($dir), ['.', '..']); 43 foreach ($files as $file) { 44 (is_dir("$dir/$file")) ? deleteDirectory("$dir/$file") : unlink("$dir/$file"); 45 } 46 rmdir($dir); 47} 48 49// --- Setup: Create temporary files and directory for the Phar archive --- 50try { 51 // Ensure cleanup from previous runs to prevent conflicts 52 if (file_exists(PHAR_FILE_NAME)) { 53 Phar::unlinkArchive(PHAR_FILE_NAME); 54 } 55 deleteDirectory(TEMP_DIR); 56 57 // Create the temporary directory and a subdirectory 58 if (!mkdir(TEMP_DIR, 0777, true)) { 59 throw new Exception("Failed to create temporary directory: " . TEMP_DIR); 60 } 61 if (!mkdir(TEMP_DIR . '/sub', 0777, true)) { 62 throw new Exception("Failed to create subdirectory: " . TEMP_DIR . '/sub'); 63 } 64 65 // Create some dummy PHP files to be included in the archive 66 file_put_contents(TEMP_DIR . '/index.php', '<?php echo "Hello from index.php!";'); 67 file_put_contents(TEMP_DIR . '/config.php', '<?php return ["app_name" => "My App", "version" => "1.0"];'); 68 file_put_contents(TEMP_DIR . '/sub/helper.php', '<?php function sayHello() { return "Hello from helper!"; }'); 69 70 echo "Temporary files and directory created for Phar archive preparation.\n\n"; 71 72 // --- Create the Phar archive --- 73 echo "Creating Phar archive: " . PHAR_FILE_NAME . "\n"; 74 $phar = new Phar(PHAR_FILE_NAME); 75 // Start buffering changes for better performance when adding multiple files 76 $phar->startBuffering(); 77 78 // Add all files from the temporary directory to the Phar archive 79 $phar->buildFromDirectory(TEMP_DIR); 80 81 // Set a default stub: the code that executes when the Phar file is run 82 // It's good practice to have an index file as the entry point. 83 $phar->setStub($phar->createDefaultStub('index.php')); 84 85 // Stop buffering and write all changes to the disk 86 $phar->stopBuffering(); 87 echo "Phar archive '" . PHAR_FILE_NAME . "' created successfully.\n"; 88 echo "Initial size of '" . PHAR_FILE_NAME . "': " . filesize(PHAR_FILE_NAME) . " bytes\n\n"; 89 90 // --- Compress files within the Phar archive --- 91 echo "Compressing all individual files inside '" . PHAR_FILE_NAME . "' using GZIP...\n"; 92 // The compressFiles method applies GZIP compression to each file stored within the Phar. 93 // Phar::GZ is an integer constant representing the Gzip compression algorithm. 94 $phar->compressFiles(Phar::GZ); // Alternatively, use Phar::BZ2 for Bzip2 compression 95 96 echo "Files inside '" . PHAR_FILE_NAME . "' have been compressed with GZIP.\n"; 97 // Note: The overall .phar file size might not drastically change visible externally 98 // immediately after compressFiles() due to internal Phar structure overhead or 99 // if the original files were very small. This method targets individual file content compression. 100 echo "Size of '" . PHAR_FILE_NAME . "' after internal file compression: " . filesize(PHAR_FILE_NAME) . " bytes\n"; 101 102 echo "\nPhar operation completed successfully.\n"; 103 104} catch (Exception $e) { 105 // Catch and report any exceptions during the process 106 echo "An error occurred: " . $e->getMessage() . "\n"; 107} finally { 108 // --- Cleanup: Remove temporary files and the created Phar archive --- 109 echo "\nPerforming cleanup...\n"; 110 if (file_exists(PHAR_FILE_NAME)) { 111 try { 112 Phar::unlinkArchive(PHAR_FILE_NAME); 113 echo "Phar archive '" . PHAR_FILE_NAME . "' deleted.\n"; 114 } catch (Exception $e) { 115 // This might fail if the phar archive is still "open" or locked by the system. 116 // For a simple script, it usually works, but it's good to catch. 117 echo "Warning: Could not delete Phar archive '" . PHAR_FILE_NAME . "': " . $e->getMessage() . "\n"; 118 } 119 } 120 deleteDirectory(TEMP_DIR); 121 echo "Temporary directory '" . TEMP_DIR . "' and its contents deleted.\n"; 122 echo "Cleanup complete.\n"; 123}
PHPのPharクラスは、複数のPHPファイルや関連ファイルを一つにまとめて配布・実行可能なアーカイブ(Pharファイル)を作成する機能を提供します。このPhar::compressFilesメソッドは、作成したPharアーカイブ内に含まれる「個々のファイル」を圧縮するために使用されます。
引数$compressionには、どの圧縮形式を使用するかを整数定数で指定します。例えば、Phar::GZを指定するとGzip形式で、Phar::BZ2を指定するとBzip2形式で、アーカイブ内の各ファイルが圧縮されます。このメソッドはアーカイブの内部的なファイルを圧縮する処理を行い、結果を直接返さないため、戻り値はありません。
注意点として、Phar::compressFilesはアーカイブ内の各ファイルを圧縮するのに対し、Phar::compressメソッドはPharアーカイブファイル全体を、例えば.phar.gzのような圧縮された単一ファイルとして出力します。これらは異なる目的を持つため、混同しないよう注意が必要です。Pharアーカイブの作成や変更には、php.iniファイルでphar.readonly = 0を設定しておく必要があります。このサンプルコードでは、一時ファイルをPharアーカイブに含め、Phar::compressFiles(Phar::GZ)でその内部ファイルをGzip圧縮する一連の流れを実演しています。
Phar::compressFiles()は、Pharアーカイブ内の個々のファイルを圧縮する際に使用し、圧縮アルゴリズムをPhar::GZやPhar::BZ2といった定数で指定します。このメソッドは、アーカイブ「内部の」ファイルを圧縮するため、アーカイブ「全体」を圧縮するPhar::compress()とは動作が異なります。そのため、アーカイブファイルの拡張子が.phar.gzのように変わるわけではありませんのでご注意ください。Pharアーカイブの作成や変更には、php.iniでphar.readonly = 0の設定が必須であり、設定がないとエラーが発生します。サンプルコードでは、一時ファイルの作成からアーカイブの削除まで、安全な運用に必要なクリーンアップ処理も含めています。
Phar::compressFilesでファイルを圧縮する
1<?php 2 3// ini_setでphar.readonlyを一時的に無効にします。 4// Pharアーカイブを作成・変更するために必要な設定です。 5ini_set('phar.readonly', 0); 6 7/** 8 * 指定されたファイルをPharアーカイブに追加し、アーカイブ内のファイルをGZIP形式で圧縮するサンプル関数。 9 * 10 * この関数は、`Phar::compressFiles` メソッドの基本的な使用方法を示します。 11 * `Phar` アーカイブは、複数のファイルを1つのアーカイブファイルにまとめるのに使用されます。 12 * `compressFiles` は、そのアーカイブ内の個々のファイルを指定された形式(例: GZIP, BZIP2)で圧縮します。 13 * 14 * @param string $archiveName 作成するPharアーカイブの名前 (例: 'my_archive.phar')。 15 * @param array $filesToAdd アーカイブに追加するファイルのパスの配列。 16 * @return void 17 */ 18function compressFilesInPharArchive(string $archiveName, array $filesToAdd): void 19{ 20 $pharPath = __DIR__ . '/' . $archiveName; 21 22 // 既存のPharアーカイブがあれば削除します(テスト実行のため)。 23 if (file_exists($pharPath)) { 24 unlink($pharPath); 25 } 26 27 echo "Pharアーカイブを作成します: {$pharPath}\n"; 28 29 try { 30 // 新しいPharアーカイブを作成します。 31 $phar = new Phar($pharPath); 32 33 // バッファリングを開始し、ファイル追加処理を効率化します。 34 $phar->startBuffering(); 35 36 // ファイルをPharアーカイブに追加します。 37 echo "ファイルをアーカイブに追加中...\n"; 38 foreach ($filesToAdd as $filePath) { 39 if (file_exists($filePath)) { 40 // アーカイブ内のパスは元のファイル名のみにする例です。 41 $phar->addFile($filePath, basename($filePath)); 42 echo " - 追加: " . basename($filePath) . "\n"; 43 } else { 44 echo " - 警告: ファイルが見つかりません: {$filePath}\n"; 45 } 46 } 47 48 // バッファリングを終了し、変更をPharファイルに書き込みます。 49 $phar->stopBuffering(); 50 51 // Pharオブジェクトが閉じられた後に、圧縮前のファイルサイズを取得します。 52 // これにより、ファイルが完全にディスクに書き込まれた状態のサイズが測定されます。 53 $initialSize = filesize($pharPath); 54 echo "圧縮前のPharアーカイブサイズ: " . round($initialSize / 1024, 2) . " KB\n"; 55 56 // 既存のPharアーカイブを再度開いて圧縮操作を行います。 57 // `compressFiles` は既存のアーカイブに対して適用されるため、再オープンが適切です。 58 $phar = new Phar($pharPath); 59 60 // Pharアーカイブ内のファイルをGZIP形式で圧縮します。 61 // 引数には `Phar::GZ` または `Phar::BZ2` を指定可能です。 62 echo "Pharアーカイブ内のファイルをGZIP圧縮中...\n"; 63 $phar->compressFiles(Phar::GZ); 64 echo "圧縮完了。\n"; 65 66 // 圧縮後のPharアーカイブのサイズを取得します。 67 $finalSize = filesize($pharPath); 68 echo "圧縮後のPharアーカイブサイズ: " . round($finalSize / 1024, 2) . " KB\n"; 69 70 // 圧縮率の表示 71 if ($initialSize > 0) { 72 $compressionRatio = (1 - ($finalSize / $initialSize)) * 100; 73 echo "圧縮率: " . round($compressionRatio, 2) . "%\n"; 74 } 75 76 } catch (Exception $e) { 77 echo "エラーが発生しました: " . $e->getMessage() . "\n"; 78 } finally { 79 // 後処理: 作成したPharアーカイブを削除します。 80 // 注意: Windows環境では、PHPプロセスがPharファイルをロックしている間は削除できないことがあります。 81 // その場合、スクリプト終了後に手動で削除する必要があるかもしれません。 82 if (file_exists($pharPath)) { 83 echo "完了。作成されたPharアーカイブ: {$pharPath} はこのスクリプトでは自動削除されません。手動で削除してください。\n"; 84 } 85 } 86} 87 88// --- サンプルコードの実行 --- 89 90// 1. ダミーの画像ファイルを作成します(簡単なPNG画像)。 91$dummyImageFileName = 'dummy_image.png'; 92$dummyImagePath = __DIR__ . '/' . $dummyImageFileName; 93 94echo "ダミー画像ファイルを作成中: {$dummyImagePath}\n"; 95$image = imagecreatetruecolor(10, 10); // 10x10ピクセルの画像を作成 96imagesavealpha($image, true); // 透明度を有効にする 97$trans_colour = imagecolorallocatealpha($image, 0, 0, 0, 127); // 透明な背景色 98imagefill($image, 0, 0, $trans_colour); // 画像を透明色で塗りつぶす 99imagepng($image, $dummyImagePath); // PNG形式で保存 100imagedestroy($image); // メモリを解放する 101echo "ダミー画像ファイル作成完了。\n"; 102 103// 2. 別のダミーテキストファイルを作成します(圧縮効果を見るため、ある程度のサイズにします)。 104$dummyTextFileName = 'dummy_text.txt'; 105$dummyTextPath = __DIR__ . '/' . $dummyTextFileName; 106echo "ダミーテキストファイルを作成中: {$dummyTextPath}\n"; 107// 繰り返し文字列を書き込み、ファイルサイズを大きくして圧縮効果を分かりやすくします。 108file_put_contents($dummyTextPath, str_repeat('This is a test line for compression example in a Phar archive. ', 1000)); 109echo "ダミーテキストファイル作成完了。\n"; 110 111// Pharアーカイブに含めるファイル 112$filesToArchive = [ 113 $dummyImagePath, 114 $dummyTextPath, 115]; 116 117// 関数を実行してPharアーカイブを作成・圧縮します。 118compressFilesInPharArchive('my_archive.phar', $filesToArchive); 119 120// 後処理: 作成したダミーファイルを削除します。 121echo "\nダミーファイルを削除中...\n"; 122if (file_exists($dummyImagePath)) { 123 unlink($dummyImagePath); 124 echo " - 削除: {$dummyImageFileName}\n"; 125} 126if (file_exists($dummyTextPath)) { 127 unlink($dummyTextPath); 128 echo " - 削除: {$dummyTextFileName}\n"; 129} 130echo "ダミーファイル削除完了。\n";
PHPのPhar::compressFilesメソッドは、Pharアーカイブに格納されている複数のファイルを指定した圧縮形式で一括して圧縮するために利用されます。Pharアーカイブは、関連するPHPファイルやその他のリソースファイルを一つの実行可能なファイルにまとめる特殊な形式です。
このメソッドは$compressionという整数型の引数を一つ受け取ります。この引数には、Phar::GZを指定するとGZIP形式で、Phar::BZ2を指定するとBZIP2形式でファイルを圧縮するよう指示します。メソッド自体には戻り値がありませんが、実行後にはPharアーカイブ内のファイルが指定された形式で圧縮され、アーカイブ全体のファイルサイズが削減されます。
提供されたサンプルコードでは、まずダミーの画像ファイルとテキストファイルを作成し、それらをmy_archive.pharというPharアーカイブに格納しています。その後、$phar->compressFiles(Phar::GZ)を実行することで、アーカイブ内の各ファイルをGZIP形式で圧縮しています。これにより、圧縮前後のアーカイブのファイルサイズが比較され、実際に容量が削減される様子を確認できます。画像データやテキストデータなど、圧縮可能な内容を含むアーカイブのサイズを効率的に削減し、アプリケーションの配布や転送を最適化する際に役立ちます。
このサンプルコードは、Pharアーカイブの作成や変更に必須のini_set('phar.readonly', 0);設定から始まります。この設定がないとアーカイブの変更はできませんのでご注意ください。Phar::compressFilesメソッドは、作成済みのPharアーカイブ内のファイルを指定形式(Phar::GZなど)で圧縮します。メソッドに戻り値はありませんが、圧縮後のファイルサイズで効果を確認できます。Windows環境では、PharファイルがPHPプロセスによりロックされ、スクリプト終了時に自動削除できない場合がありますので、手動削除が必要になる可能性を考慮してください。エラー処理としてtry-catchを活用し、安全なコード記述を心がけましょう。