Zend FrameworkとQuercus PHPの互換性調査

caucho-white 私は長い間、JavaとPHPの世界を、特に素晴らしいQuercus PHP製品(Javaのライブラリと一緒にPHPインタープリターのポート)を組み合わせることに興味を持っています。 そして今、ブラウザベースのオンラインゲーム用のエンジンのほぼ完成したアーキテクチャレイアウトをもう一度見ると、細部がずれていることに気付きました。 結局のところ、人気のある強力なZend Frameworkを使用して、もちろんQuercusPHPの上で実行するつもりでした(新しい年の後にエンジンのアーキテクチャについて詳しく説明し始めます)。 そして、ご存知のように、彼はさまざまな拡張機能とモジュールを非常に要求しています-1つのプロジェクトで、私が今やっていること、Zend_Search_Luceneのみを使用して、以前使用していない拡張機能を接続する必要性に会いました そのため、このプラットフォームでは、Zend Frameworkが機能するために必要なすべての機能がサポートされない可能性があります。 互換性に関するGoogleのレビューでは明確なものは得られなかったため、数時間を自分の研究に費やすことにしました。



まずZend Frameworkについて。 マニュアルの特別なセクションには、すべての必要なモジュールがリストされ、モジュールとフレームワークのクラス間の特定の依存関係が示されています。 依存関係には2つのタイプがあります:ハード(一部のクラスまたはフレームワーク全体が拡張機能に厳密に依存しており、拡張機能なしでは機能しない場合)と、拡張機能がパフォーマンスを向上させるためにのみ使用される場合(機能が利用できない場合はPHPコードを使用してエミュレートされる)



リスト全体を手動で確認した後、Oracleデータベースサポートなどの非常に特殊なモジュールを除くすべてのモジュールを選択し、テストスクリプトの配列に入れました。



はい、互換性を確認するために、QuercusPHP環境で実行され、利用可能な機能とインストールされたモジュールに関するすべての情報を収集し、ZFに必要なリストと比較するテストスクリプトを使用することにしました。



get_defined_functions PHP関数を使用して、実装されたPHP関数の完全なリストを最初に取得しました。これは、Quercusで1342でした。いくつかのユーティリティと特定の機能(たとえば、Javaと樹脂プレフィックス付きのいくつか、およびQuercusモジュール)がありました。 ところで、同じ方法で、同じモジュールでPHPを収集し、すべての機能の実装の完全性を確認する必要がありますが、これは次のテストのタスクです。



次に、関数とモジュールを手動で照合することは、他のことを行うため、環境に実装されているモジュール(拡張機能)の正確なリストを取得する必要がありました。 マニュアルには、関数get_loaded_extensionsがあり、上記の関数と同様に、スクリプトで使用可能なモジュールの配列を表示します。 QuercusPHPの拡張機能のリストは非常に大きく、31モジュールであることがわかりました。 実装された拡張機能に関する公式ドキュメントは一般的な用語でのみ書かれているため、完全なリスト(最新バージョンの3.2.1)を提供します。



mcrypt、SPL、curl、gd、mysqli、mhash、gettext、json、apc、mbstring、tokenizer、pgsql、memcache、zip、標準、ハッシュ、XMLWriter、ctype、xml、bcmath、postgres、PDO、pcre、zlib、session、 SimpleXML、Reflection、ereg、iconv、oci8、mysql



私はまだ各モジュールのすべての機能の実装の程度について詳細な調査を行っていませんが、おそらくこれは次のテストになるでしょうが、一見すると、SPLモジュールに混乱しました。 したがって、このモジュールの完全な実装の質問はまだ開いています(執筆中に、ソースコードを調査することにしました。質問は削除されました-すべての機能が実装されているようです)。 APCキャッシュが「箱から出して」すぐに実装されたことを嬉しく思いましたが、これは特にサイトで強調されました(EHCacheやJBossキャッシュなどの分散キャッシュと永続キャッシュのサポートを導入したいと思います)。 mb_stringモジュールがありますが、実用的な価値はあるように思えますが、通常のPHPとは異なり、QuercusPHPは最初は内部でUTFを完全にサポートしているため、この場合はPHP 6で期待されるものを既に実装しています。有効にするには、設定でオプションを設定する必要があります(より正確には、unicode.semanticsおよびscript-encoding)。 モジュールのリストにMemcached拡張機能があるのは嬉しかったですが、詳細に見てみると、関数のリストがありませんでした-APIがソースコードに含まれているため、実装されたメソッドのリストを取得する機能自体が奇妙である可能性があります



Zend Frameworkの依存関係のリストに何があり、何が欠けているのかを調べることは今でも残っています。 テストスクリプトには、2つの配列があります。1つはQuercusPHPにあるモジュールのリスト、もう1つはZFに必要なモジュールのリストです。 彼らのビジネスを比較するのは簡単であり、出力では欠落している5つのモジュールを取得します。



したがって、これらすべてに基づいて、Dom / libxmlのみに存在する重大な障害のうち、残りはフレームワーク自体によって自動的にバイパスされるか、Javaクラスを直接操作する機会があるため、より高度なアナログに置き換えることができると結論付けることができます。 まず、Zend_Search_Luceneを捨ててJava Luceneから直接APIを使用することをお勧めします。または、ZFからインターフェイスを実装するコンポーネントを作成し、内部でJava Luceneを使用します。 しかし、これは大変な作業であり、Solrのようなものを使用した方がよい場合もあります。



原則として、Zend Frameworkのような強力で複雑なサードパーティ製アプリケーションやフレームワークをQuercusPHPで実行することは不可能ではありませんが、バランスの取れたアプローチと依存関係の分析が必要です。 QuercusPHPのソースコードに夢中になって、Javaの平凡な知識を持っている私でさえ、必要に応じてAPIを拡張することは非常に簡単であるという結論に達しました。



次の調査では、関数の完全な実装を詳しく調べ、QuercusPHPとPHP 5.2.8のバイナリバージョンを同じ拡張機能セットと比較します。



All Articles