ホームページ >バックエンド開発 >PHPチュートリアル >PHP のコンパイルと実行の分離の実装 (コンパイルと実行の分離_PHP チュートリアル)
私はちょうど PHP グループの全員とチャットし、QA が煙に巻いているこの機会を利用して、PHP ソース コードの暗号化を実装する方法について全員が記事を書くことに同意しました。 ZE(Zendエンジン)がPHPスクリプトを実行する際、コンパイル→実行となりますが、実行のたびにPHPファイルを再コンパイルすることを前回の記事で紹介しました。コンパイルと実行は分離されていません。 ZE のコンパイルと実行フェーズには、2 つの重要な機能があります: ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle、int型 TSRMLS_DC); と ZEND_API void (*zend_execute)(zend_op_array *op_array TSRMLS_DC); zend_compile_file は、実行されるスクリプト ファイルを ZE の基本的な命令シーケンスで構成される操作コードにコンパイルする役割を果たし、その後、その操作コードを zend_execute に渡して実行し、スクリプトの結果を取得します。 したがって、デフォルトの zend_complie_file と zend_execute を変更することで、PHP の実行とコンパイルを完全に分離できます。さらに、これに基づいてスクリプトの暗号化と復号化も実装できます。 この関数は PHP 拡張モジュールを通じて実装します。まず、モジュールを初期化する必要があります。
{
{ } static void my_execute(zend_op_array *op_array TSRMLS_DC) old_execute(op_array TSRMLS_DC); //デフォルトの実行関数のままにします。
暗号化方法については、どの方法を使用するかを自問する必要がありますが、元に戻せる必要があることを覚えておいてください~~^_^。
old_compile_file = zend_compile_file; //シーンを保存
old_execute = zend_execute;
zend_compile_file = my_compile_file; //インターセプト
zend_execute = my_execute;
return SUCCESS;
}
If(strstr(file_handle->filename, ".ze") != NULL){//これはコンパイルされたファイルです。内容 ファイルの内容を直接戻します。}
zend_op_array *op_array;
op_array = old_compile_file (file_handle, type TSRMLS_CC); // デフォルトのコンパイルを呼び出し、出力をインターセプトします
if(op_array){
return op_array;
}
このようにして、コンパイルされたファイルとファイルのコンパイルのサポートを実現しました。
次に、実行関数を記述する必要があります:
おそらく、将来的に実行関数をラップする必要があるのはなぜかと聞きたいかもしれません。笑、私が説明したいのは、その方法の 1 つはこれをインターセプトすることです。用途は何ですか?この方法でどのような要件を実現できるかは読者次第です:)。
これを書くと、ファイルを暗号化したい場合は、暗号化されたファイルの種類 (*.zec など) を定義し、my_compile_file でファイルの種類を判断し、暗号化されたファイルの場合は復号化を実行することが理解できると思います。へー、単純ですよね?
www.bkjia.com