phpDaemonとrunkit:新しいレベル

今日は、runkit PHPモジュールによって提供されるものを含む、新しいおいしいphpDaemonの利点について説明します。



phpDaemonのコードスタイルは、過酷なエイリアンだけでなく、ほとんどの地上プログラマーの好みに適合していることを報告できてうれしいです。 このサイレントローチをありがとう。 また、コードのスタイルと読みやすさに関するコメントが適切に認識されるようになりました。





ランキットストーリー



PECL / runkitは非常に注目に値するPHPモジュールであり、その物語は2005年8月に女性プログラマーのサラゴレモンによって作成されました。 その目的は、スクリプトの実行プロセスで定数を変更し、関数とクラスを再定義し、ブラックマジックに似たPHPで他の操作を実行できるようにすることです。

ただし、このプロジェクトは非常に粗雑で、バグを修正して新しいバージョンのPHPとの互換性を維持するのに長い時間がかかりました。 そして、推理しかできない理由で、プロジェクトの開発に興味を失いました。 しかし、彼女は主なことをした-これがすべて可能であることを示した-技術の問題。 その後、pajoye、johannes、sfox、sebastian、mlivelyなどが変更を加えました。 しかし、たとえば、2007年全体でコミットは4回しかなかったため、モジュールは引き続きバグが多く、メインのPHPブランチよりも遅れていました。 サードパーティの開発者によるいくつかのフォークの試みがありましたが、私の意見では1つだけが成功しました。

私たちの同胞Dmitry Zenovich( dzenovich )は、彼に新しい人生を与えました。github.com / zenovich / runkit :動作するランキットです!



その場でコードを更新する



以前は、phpDaemonに--auto-reload = 5sオプションを含めると、デーモンは接続されているすべてのPHPファイルの変更日を5秒ごとにチェックし、変更するとスムーズに再起動しました。 --auto-reimportを有効にするだけで、スムーズな再起動の代わりに、変更されたファイルがライブプロセスに直接インポートされます。 これにより、人生が大幅に簡素化されます。 Dmitry Zenovichに感謝します! (そして手探りのために私に少し)。



Runkit_sandbox



クラス、定数、および関数の操作に加えて、runkitではサンドボックスを作成できます。 次のようになります。



$sandbox = new Runkit_Sandbox(array( 'safe_mode' => TRUE, .... 'output_handler' => array($this,'out') )); $sandbox->call_user_func(function() { echo "Hello World!"; });
      
      







同時に、サンドボックスで実行されるコードは生成コンテキストに影響を与えることができず、致命的エラー/解析エラーによってメインスクリプトがクラッシュすることはありません。 サンドボックスのiniオプションを設定することもできます。



ネイティブPHP関数のオーバーライド



Runkitを使用すると、ユーザー定義だけでなく、ネイティブPHP関数も再定義できます。 現在、phpDaemonはheader()およびregister_shutdown_function()をオーバーロードし、現在のリクエストの対応するメソッドへの呼び出しを指示しています。



create_function()関数には別のストーリーがあります。 おそらく誰かがこの機能の背景を知らないかもしれませんが、実際にはこれです:

 function create_function($args,$code) { static $c = 0; $name = "\x00lambda_".$c++; eval('function '.$name.'('.$args.') {'.$code.'}'); return $name; }
      
      





つまり、最も普通の関数と通常の関数を作成し、その名前を文字列として返します。 もちろん、不要なラムダ関数を削除しても問題はありません。それらはスクリプトが終了するまで存続します。 私自身はこの問題に注意を払いませんでした 私は長い間create_functionを使用していませんが、彼の記事 (PHPのTrue FastCGI-移行とテスト)のIlya Kantor( algo )はこれに注意を引き、リクエストの実行中に作成されたすべてのラムダ関数の名前を覚えて、最終的にクリアすることを提案しました。 このソリューションはそのタスクに適していますが、一般的にphpDaemonには明らかな理由で受け入れられません。

したがって、私は別の解決策を思いつきました。私の意見では、よりエレガントで普遍的なものです。 create_function()は、DestructableLambdaオブジェクトを返します。このオブジェクトのラムダ関数は、runkitを介して削除されます。 さらに、最も一般的にコンパイルされるラムダ関数を格納するLRUキャッシュがあり、コンパイルのコストを削減します。 ソースコード



他の機能の改善点についてご意見がありましたら、お気軽にお問い合わせください。



終わり



まあ、おそらくそれだけです。 ご清聴ありがとうございました。



Github: kakserpom / phpdaemon

ホームページ: http : //phpdaemon.net

グループ: groups.google.com/group/phpdaemon



All Articles