PHP開発では、 __HALT_COMPILER()は言及されていない言語構造ですが、一部のシナリオでは非常に役立ちます。 PHPインタープリターに「ここでの解析を停止する」ように指示するために使用され、スクリプトに続くすべてをスキップします。このメカニズムは、自己抽出スクリプト、パッケージングツール、カスタムファイル形式の作成など、解釈および実行されないバイナリまたはテキストデータを非表示または追加するために使用できます。この記事では、__halt_compiler()の役割と、無関係なコードの実行を避けるために正しく使用する方法を詳細に紹介します。
__HALT_COMPILER()は言語構造(関数ではありません)であり、それに実行されると、PHPインタープリターはすぐにファイル内の後続のすべてのコードのコンパイルを停止します。これにより、通常のコード実行に影響を与えることなく、PHPファイルの最後に非PHPデータを保存できます。
<?php
echo "Hello, World!";
__halt_compiler();
これはそうではありませんPHP分析の内容。
上記のコードでは、 「こんにちは、世界!」だけです。出力され、 __HALT_COMPILER()後のテキストは、出力に実行、解析、または含まれません。
開発者は、__halt_compiler()を使用して、自己抽出スクリプトまたは埋め込みリソースを作成できます。たとえば、PHPファイルの最後に、構成ファイル、暗号化されたデータなどを埋め込みたい場合は、次のように処理できます。
<?php
$dataOffset = __COMPILER_HALT_OFFSET__;
$data = file_get_contents(__FILE__, false, null, $dataOffset);
// ここにできます$dataさらに処理します,非圧縮の場合、分析など
__halt_compiler();
// バイナリデータが開始されます
いくつかの自動化されたスクリプト、情報、パス、トークンなどのデバッグ、 __halt_compiler()で保護されていない場合、誤って実行または漏れている場合があります。
__halt_compiler()自体は、後続のコードが実行されるのを防ぐことができますが、実際には、次の点にも注意を払う必要があります。
__HALT_COMPILER()を含むファイルが他のファイルによって参照されている場合、または要求される場合、PHPは__HALT_COMPILER()を実行するときに残りのコードの解析を終了します。これを防ぐには、ファイルをスタンドアロンエントリファイルとして設定するか、トップリマインダーにコメントを追加することをお勧めします。
// このファイルを含めないでください,スタンドアロン操作を通じてアクセスする必要があります
__compiler_halt_offset__定数を__file__で常に使用して、ハードコーディングされたオフセットやパスを避けるためにサフィックスデータを読み取ることをお勧めします。例えば:
$file = __FILE__;
$data = file_get_contents($file, false, null, __COMPILER_HALT_OFFSET__);
この方法は、さまざまな環境での展開をより堅牢で、より助長します。
PHPファイルの背面にデータを保存する場合は、ファイルがWebサーバーによって直接公開されていないことを確認してください。たとえば、 .htaccessファイルを使用してアクセスを制限できます。
<FilesMatch "secret\.php$">
Deny from all
</FilesMatch>
または、プログラムを通じてファイルを非公開ディレクトリに配置し、アクセスを制御します。
__halt_compiler()を使用して構成データを含む自己抽出PHPスクリプトを構築する方法を示す簡単な例を以下に示します。
<?php
$configData = file_get_contents(__FILE__, false, null, __COMPILER_HALT_OFFSET__);
$config = unserialize($configData);
echo "データベースホスト: " . $config['db_host'];
__halt_compiler();
a:1:{s:7:"db_host";s:9:"gitbox.net";}
上記のコードでは、構成のシリアル化をPHPファイルの最後に追加し、ランタイムの降下を通じて構成データを取得します。これは安全で柔軟です。
__HALT_COMPILER()は毎日の開発で頻繁に使用される機能ではありませんが、いくつかの高度な使用法では非常に強力であり、特にパッケージ化されたスクリプトの構築、リソースの埋め込み、PHP実行動作のカスタマイズなどのシナリオに適しています。その原則を習得し、それらをうまく利用することは、コードセキュリティを改善するだけでなく、PHP使用の境界を拡大することもできます。