問題タブ [php-opcode]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - PHP オペコードは、実際に実行されたバイナリ コードとどのように関連していますか?
プレーンテキストとしての test.php:
オペコードとしてのtest.php:
バイナリ表現としての test.php:
(test.php のエコー出力をスキップ)
ここで、オペコードがバイナリ表現にどのように変換されるかについて詳しく知りたいと思います。
編集され明確化された質問:
オペコードはどのようにバイナリ バージョンに変換されますか? 'a' から !0 への ASSIGN が表示されているのがわかりますか? ECHOステートメントとそれが出力するものはどこかにありますか?
オペコードの行ごとの表現を暗示するバイナリ バージョンのパターンはほとんど見つかりませんでした。
(「2f726f6f742f746573742e706870」は「/root/test.php」の 16 進数表現です)
編集:
行の長さを 4 バイトに設定し、異なるプログラム間で比較すると、16 進表現でパターンが明らかになります。
しかし、仮想マシンがそのようなレベルでどのように機能するかについての私の知識は、それを適切に分析して C コードにリンクすることができないほど貧弱です。
編集:
php - PHP 文字列リテラルとコンパイラの最適化
変数を含まない"
文字列を定義するときに sを使用すると、追加の解析が実行されない場合と比較して、PHP コードのパフォーマンスが低下するかどうか疑問に思っています。'
たとえば、PHP は、 で定義されているが で定義されて"
いない文字列内の変数を解析しようとします'
。
私の質問は、これまでずっと次のようなコードを書いてきたということです。
サイクルを無駄にしていませんか?または、PHP は、私が本当に意図したことを知るのに十分スマート/最適化されています:
?
php - インクルード中のPHPオペコードメモリの占有?
サイトのメモリを最適化する際に、特定の目的のために多数のPHPクラスファイル(600以上)を含めると、メモリ消費量が急増することに気付きました。分解すると、PHPファイルを含める(したがって、おそらくオペコードにコンパイルする)と、ディスク上のファイルサイズの約50倍のメモリが必要になることに気付きました。
私の場合、ディスク上のファイルのサイズは合計で約800 kBです(インデントとコメント、純粋なクラス宣言、多くの文字列は含まれていません)が、すべてを含めた後、メモリ消費量は約40MB高くなりました。
私はこのように測定しました(PHP 5.3.6):
600ファイルを超えるループ内で、メモリ消費量が基本的にゼロから40MBに増加するのを見ることができます。(追加のクラスをロードするオートローダー、またはすぐに実行されるグローバルコードやコンストラクターコードはありません。実際には純粋なインクルードのみです。)
これは正常な動作ですか?オペコードは純粋なソースコードよりもコンパクトだと思いました(すべてのスペースとコメントを削除するか、たとえば「foreach」文字列の代わりに1つまたは2つの命令バイトを使用するなど)。
これが正常な場合、それを最適化する方法はありますか?(オペコードキャッシュを使用すると、実際のメモリ消費量ではなく、コンパイル時間を節約できると思いますか?)
php - AWS EB PHP サーバーに Opcache をインストールした後の無効な UTF8 文字
CakePHP 2.4.2 を使用して、RDS データベースを備えた Amazon Elastic Beanstalk サーバーで CMS サイトを実行しています。昨夜から、ログにエラーが表示され、特定のページが読み込まれません (500 エラー)。
同じ 'utf8' 文字のセットが表示されることがありますが、エラー ログにはさまざまな文字列が多数記録されているため、毎回同じエラーですが、同じ悪い文字列ではありません。ログにある他の文字列の一部を次に示します。
昨夜仕事を離れる前に、ebextension 構成をプッシュして、Zend Opcode Caching をサーバーにインストールしました。これがエラーの原因であるという証拠はありませんが、エラーを引き起こす可能性のあるサーバーに対して行った唯一の変更のようです。エラーが発生する前に行われた最後の変更でした。午後 5 時頃にコードをプッシュすると、午後 6 時頃にログにエラーが表示されるようになりました。
参考までに、opcache を有効にするために使用した構成を次に示します。
同じ設定で問題なく動作しているopcacheパッケージなしで、実稼働環境に複数のサーバーがあり、ローカルのテストボックスでもそのようなエラーを再現できませんでした。
opcache である種のあいまいなバグを見つけた可能性がありますか、それとも私が見ているものについてもっと論理的な結論がありますか? これらのエラーは私のコードの奥深くで発生しているため、どうすればデバッグできるのか途方に暮れています。私は自分のコードを検索して、コード自体に悪い文字がないことを確認しましたが、それを超えて、私は暗闇の中でちょっと突っついています.
アップデート:
これが UTF8 文字列の不適切な strtolower() 変換によって引き起こされているかどうかを調べましたが、関連するクエリの 1 つにユーザーが入力した値が含まれておらず、どの条件も UTF8 文字列を使用していないため、それが可能であるとは思えませんそれに追跡されます。失敗しているクエリの 1 つは、ログイン コントローラーで利用可能なすべてのリージョンのルックアップです。
php - PHP vld はオペコードの代わりにファイル出力を表示します
vld を使用して、php ファイルのオペコードを表示しようとしています
準備
vld を次のようにインストールしました。
VLD に慣れるために、php ファイル (echo1 と echo2) と比較しようとしています。
echo1.php
echo2.php
phpinfo() は、vld が有効になっているように見えることを示しています。
問題
PHPファイルを実行すると、オペコードの代わりに出力が表示されます
明らかに私は何かが欠けています:)
実行中のバージョン
PHPバージョン
Apache 2.2.22 を使用して Virtualbox で Debian を実行する
php - EXT_NOP および EXT_STMT、PHP オペコードとは
実装に対してネイティブのphp関数を実行するだけで、より深くphpの内部を理解しようとしています。
しかし、すべてのオペコード ダンプで、次の 2 つのオペコードが表示されます。
EXT_NOP
: http://php.net/manual/tr/internals2.opcodes.ext-nop.php
EXT_STMT
: http://php.net/manual/tr/internals2.opcodes.ext-stmt.php
docs にあるように、詳細な説明はありません。
ドキュメントで指定された次の例でも、私のダンプはドキュメントの仕様とは異なります。なぜこれらの2つのスタンドがすべてのダンプにあるのか本当に知りたいですか? それらの機能は何ですか?
環境仕様:
OpCode ダンプ: