[PHP] [転送] PHP の原則とオペコードの深い理解
PHP 原則のオペコードの深い理解 · 著者: laruence( http://www.laruence.com/)
· この記事の URL: http://www.laruence.com/2008/06/18/221.html
私は最近、Yahoo の同僚に PHP と Apache の内部メカニズムについて講義をしなければなりませんでしたこの記事は、Sara Golemon の OPcode の理解に基づいています
オペコードは、Java の ByteCode や と同じように、PHP スクリプトによってコンパイルされる中間言語です。 NET の MSL など。 たとえば、次の PHP コードを記述した場合:
echo "Hello World"; $a = 1 + 1; echo $a;
PHP は、このコードを実行するために次の 4 つの手順を実行します (正確には、 PHP Zend の言語エンジン)
1. スキャン (レクシング)、PHP コードを言語フラグメント (トークン) に変換します
2. 解析、トークンを単純で意味のある式に変換します
3. コンパイル、式を Opocdes にコンパイルします
4. 実行。オペコードを一度に 1 つずつ順番に実行し、PHP スクリプトの機能を実現します。
注: APC などの一部のキャッシュでは、PHP がオペコードをキャッシュできるようになりました。これにより、リクエストが届くたびに最初の 3 つの手順を繰り返す必要がなくなり、PHP の実行速度が大幅に向上します。
それでは、Lexing とは何でしょうか? コンパイルの原理を学習した学生は、Lex は字句分析の基礎テーブルであることを理解しているはずです。 Zend/zend_ language_scanner.c は、Zend/zend_ language_scanner.l (Lex ファイル) を元に入力された PHP コードを字句解析し、「単語」を 1 つずつ取得する機能です。 PHP コードの一部をスキャンしてトークンに変換することについて
この関数を使用して最初に説明した PHP コードを処理すると、次の結果が得られます:
Array( [0] => Array ( [0] => 367 [1] => Array ( [0] => 316 [1] => echo ) [2] => Array ( [0] => 370 [1] => ) [3] => Array ( [0] => 315 [1] => "Hello World" ) [4] => ; [5] => Array ( [0] => 370 [1] => ) [6] => = [7] => Array ( [0] => 370 [1] => ) [8] => Array ( [0] => 305 [1] => 1 ) [9] => Array ( [0] => 370 [1] => ) [10] => + [11] => Array ( [0] => 370 [1] => ) [12] => Array ( [0] => 305 [1] => 1 ) [13] => ; [14] => Array ( [0] => 370 [1] => ) [15] => Array ( [0] => 316 [1] => echo ) [16] => Array ( [0] => 370 [1] => ) [17] => ;)
この返された結果を分析すると、次のことがわかります。ソースコード内の文字列、文字とスペースは変更されずに返されます。各ソース コード内の文字は、対応する順序で表示されます。ただし、タグ、演算子、ステートメントなどの他の項目は、トークン ID (つまり、T_ECHO、T_STRING など、Zend 内のトークンを変更するための対応するコード) と元のコードの 2 つの部分を含む配列に変換されます。ソースコード。
次に、解析段階になります。解析では、まずトークン配列内の余分なスペースが破棄され、次に残りのトークンが 1 つずつ単純な式に変換されます
1. 定数文字列をエコーします
2. 2 つの数値を加算します
3. 前の式の結果を変数に保存します
4. 変数をエコーします
次に、コンパイルステージが変更され、各 op_arrayd には次の 5 つの部分が含まれます。 o 1. オペコード番号の識別。ADD、Echo
など、各 OP_ARAY の操作のタイプを示します。 2. 結果 OPCODE の結果を保存します
3. 操作 1 から OPCODE
オペランド 2
5. 拡張値。オーバーロードされた演算子を区別するために使用される 1 つの整数
たとえば、PHP コードは次のように解析されます:
ZEND_ECHO 'Hello World' ZEND_ADD ~0 1 1 ZEND_ASSIGN !0 ~0 ZEND_ECHO !0
はは、$ はどこに行ったのか疑問に思うかもしれません。前?これを導入する操作の数が必要です。各操作は以下の 2 つの部分で構成されます:A) OP_TYPE: IS_CONST、is_tmp_var、is_var、is_unused、または is_cv
b) u、コンソーシアムによると異なるOP_TYPE、演算数の値(const)または左の値(var) op_array の結果このタイプのオペランドの u は、変数テーブルを指すハンドル (整数) を格納します ( ~0 など)。変数内の未知の一時変数 0 を表します。 table
IS_VAR これは変数の一般的な意味であり、$
で始まります
IS_CV は、ZE2.1/PHP5.1 以降のコンパイラで使用されるキャッシュ機構を表します。この変数は、変数が初めて参照されるときに CVd されるため、その変数のアドレスが格納されます。今後この変数を参照するためにアクティブなシンボル テーブルを再度検索するには、CV 変数が! で始まります。始まりはそれを示しています。
$a は参照されていないため、!0 に最適化されているようです。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











多くの場合、キーワードと追跡パラメーターで散らかった長いURLは、訪問者を阻止できます。 URL短縮スクリプトはソリューションを提供し、ソーシャルメディアやその他のプラットフォームに最適な簡潔なリンクを作成します。 これらのスクリプトは、個々のWebサイトにとって価値があります

2012年のFacebookによる有名な買収に続いて、Instagramはサードパーティの使用のために2セットのAPIを採用しました。これらはInstagramグラフAPIとInstagram Basic Display APIです。

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

2025 PHP Landscape Surveyは、現在のPHP開発動向を調査しています。 開発者や企業に洞察を提供することを目的とした、フレームワークの使用、展開方法、および課題を調査します。 この調査では、現代のPHP Versioの成長が予想されています
