ホームページ バックエンド開発 PHPチュートリアル PHPのコンパイルと実行の分離の実装(コンパイルと実行の分離)

PHPのコンパイルと実行の分離の実装(コンパイルと実行の分離)

Jun 13, 2016 pm 01:19 PM
array compile execute file zend

PHPのコンパイルと実行分離の実装(コンパイルと実行の分離)

PHP グループの全員とチャットし、PHP ソース コードの暗号化を実装する方法について全員が記事を書くことに同意しました。今回の QA スモークを利用して、この問題に関するいくつかのアイデアを書き留めておきます。
ZE(Zendエンジン)はPHPスクリプトを実行する際、コンパイル→実行を経るのですが、実行のたびにPHPファイルを再コンパイルすることを前回の記事で紹介しました。コンパイルと実行は分離されていません。
ZE のコンパイルと実行フェーズには、2 つの重要な関数があります:
ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type 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 拡張モジュールを通じて実装します。まず、モジュールを初期化する必要があります。
PHP_MINIT_FUNCTION(sample)
{
?old_compile_file = zend_compile_file; //シーンを保存します。 old_execute = zend_execute;
?zend_compile_file = my_compile_file; //Intercept
?zend_execute = my_execute;
?return SUCCESS;
}
my_compile_file で、ファイルがコンパイル済みファイルであるかどうかを判断します。サフィックスは *.ze です。
static zend_op_array *my_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC)
{
?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) ){
?? //Save op_array;
?}
?return op_array;
}
このようにして、コンパイルされたファイルのサポートとファイルのコンパイルのサポートを実現しました。
次に、実行関数を記述する必要があります。
static void my_execute(zend_op_array *op_array TSRMLS_DC)
{
?old_execute(op_array TSRMLS_DC) //デフォルトの実行関数による単純な実行。
}
おそらく、将来の実行関数をパッケージ化する必要がある理由を尋ねたいと思います。笑、私は、これをインターセプトする 1 つの方法があることを説明したいだけです。何の役に立つの?この方法でどのような要件を実現できるかは読者次第です:)。
これを書くと、ファイルを暗号化したい場合は、*.zec などの暗号化ファイルの種類を定義し、my_compile_file でファイルの種類を決定し、暗号化ファイルの場合は実行することが理解できると思います。復号化、簡単ですか?
暗号化する方法については、どのような方法を使用するかを自問する必要がありますが、元に戻せる必要があることを覚えておいてください~~^_^。

?

元のアドレス: http://www.wangchao.net.cn/bbsdetail_1887829.html

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JavaのFile.length()関数を使用してファイルのサイズを取得します。 JavaのFile.length()関数を使用してファイルのサイズを取得します。 Jul 24, 2023 am 08:36 AM

ファイルのサイズを取得するには、Java の File.length() 関数を使用します。ファイル操作を扱うとき、ファイル サイズは非常に一般的な要件です。Java では、ファイルのサイズを取得するための非常に便利な方法、つまり length( ) File クラスのメソッド。この記事では、このメソッドを使用してファイルのサイズを取得する方法と、対応するコード例を紹介します。まず、サイズを取得したいファイルを表す File オブジェクトを作成する必要があります。 File オブジェクトを作成する方法は次のとおりです: Filef

紅夢ネイティブアプリケーションのランダムな詩 紅夢ネイティブアプリケーションのランダムな詩 Feb 19, 2024 pm 01:36 PM

オープン ソースの詳細については、次のサイトを参照してください。 51CTO Honmeng 開発者コミュニティ https://ost.51cto.com 実行環境 DAYU200:4.0.10.16SDK: 4.0.10.15IDE: 4.0.600 1. アプリケーションを作成するには、[ファイル] をクリックします。 >新しいファイル ->プロジェクトの作成。テンプレートを選択します: [OpenHarmony] EmptyAbility: プロジェクト名 shici、アプリケーション パッケージ名 com.nut.shici、およびアプリケーションの保存場所 XXX (中国語、特殊文字、スペースは含まれません) を入力します。 CompileSDK10、モデル: ステージ。デバイス

PHP BLOBをファイルに変換する方法 PHP BLOBをファイルに変換する方法 Mar 16, 2023 am 10:47 AM

PHP BLOB をファイルに変換する方法: 1. PHP サンプル ファイルを作成します; 2. 「function blobToFile(blob) {return new File([blob], 'screenshot.png', { type: 'image/jpeg' })」を通じて} 」メソッドを使用して、Blob をファイルに変換できます。

JavaのFile.renameTo()関数を使用してファイルの名前を変更する JavaのFile.renameTo()関数を使用してファイルの名前を変更する Jul 25, 2023 pm 03:45 PM

Java の File.renameTo() 関数を使用してファイルの名前を変更する Java プログラミングでは、ファイルの名前を変更する必要がよくあります。 Java には、ファイル操作を処理するための File クラスが用意されており、その renameTo() 関数でファイルの名前を簡単に変更できます。この記事では、Java の File.renameTo() 関数を使用してファイルの名前を変更する方法と、対応するコード例を紹介します。 File.renameTo() 関数は、File クラスのメソッドです。

JavaのFile.getParent()関数を使用してファイルの親パスを取得します。 JavaのFile.getParent()関数を使用してファイルの親パスを取得します。 Jul 24, 2023 pm 01:40 PM

ファイルの親パスを取得するには、Java の File.getParent() 関数を使用します Java プログラミングでは、ファイルやフォルダーを操作する必要がよくあります。場合によっては、ファイルの親パス、つまりファイルが存在するフォルダーのパスを取得する必要があることがあります。 Java の File クラスには、ファイルまたはフォルダーの親パスを取得する getParent() メソッドが用意されています。 File クラスは、ファイルとフォルダーを Java で抽象表現したもので、ファイルとフォルダーを操作するための一連のメソッドを提供します。その中で、手に入れてください

JavaのFile.getParentFile()関数を使用してファイルの親ディレクトリを取得します。 JavaのFile.getParentFile()関数を使用してファイルの親ディレクトリを取得します。 Jul 27, 2023 am 11:45 AM

ファイルの親ディレクトリを取得するには、Java の File.getParentFile() 関数を使用します Java プログラミングでは、ファイルやフォルダーを操作する必要がよくあります。ファイルの親ディレクトリを取得する必要がある場合は、Java が提供する File.getParentFile() 関数を使用できます。この記事では、この関数の使用方法とコード例を説明します。 Java の File クラスは、ファイルやフォルダーを操作するために使用される主なクラスです。ファイルのプロパティを取得および操作するための多くのメソッドを提供します

C# の Array.Sort 関数を使用して配列を並べ替える C# の Array.Sort 関数を使用して配列を並べ替える Nov 18, 2023 am 10:37 AM

タイトル: Array.Sort 関数を使用して C# で配列を並べ替える例 本文: C# では、配列は一般的に使用されるデータ構造であり、多くの場合、配列を並べ替える必要があります。 C# には Array クラスが用意されており、このクラスには配列を簡単に並べ替えるための Sort メソッドがあります。この記事では、C# で Array.Sort 関数を使用して配列を並べ替える方法を示し、具体的なコード例を示します。まず、Array.Sort 関数の基本的な使用法を理解する必要があります。 Array.So

更新実行と実行の違い 更新実行と実行の違い Dec 12, 2023 pm 02:01 PM

executeupdateとexecuteの違い: 1. 目的と戻り値、2. パラメータ、3. 実行時間、4. 例外処理、5. パフォーマンスに関する考慮事項、6. データベース対話。詳細な紹介: 1. 目的と戻り値: 「executeUpdate()」メソッドは主に、INSERT、UPDATE、DELETE 操作などのデータを変更する SQL ステートメントを実行するために使用されます。xecute() メソッドはより一般的で、次の目的で使用できます。データのクエリやデータの変更など、あらゆるタイプの SQL ステートメントを実行します。

See all articles