PHP の動作モデルと動作メカニズム_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:33:43
オリジナル
848 人が閲覧しました

PHP の作業モデルは非常に特殊です。 PHP と、ASP、ASP.NET、JSP/サーブレットなどの一般的な Web テクノロジとの間には、ある程度、本質的な違いがあります。

Web アプリケーションの分野では、Java には Java Servlet と JSP (Java Server Page) という 2 つのテクノロジがあります。 Java サーブレットは、Web サーバーから送信されたリクエストを処理し、関連するインターフェイスを実装することによって対応する作業を完了する特別なタイプの Java プログラムです。 JSP は形式的には PHP に似たスクリプトですが、実際には最終的にはサーブレットにコンパイルされます。つまり、Java ソリューションでは、JSP とサーブレットは独立した Java アプリケーションとして実行され、初期化後にメモリ内に常駐し、特定のインターフェイスを介して Web サーバーと通信して、対応する作業を完了します。明示的に再起動しない限り終了しません。したがって、データベース接続プーリングなどのさまざまなキャッシュ手法を JSP やサーブレットで使用できます。

ASP.NETの仕組みもこれと似ています。 ASP に関しては、これもインタープリタ言語ですが、アプリケーション レベルのグローバル変数を格納するための Application オブジェクトを提供します。これは、ASP インタープリタが IIS に常駐するプロセスに依存しており、アプリケーションの存続期間全体にわたって有効です。

PHP は、サーバー側で実行でき、HTML を埋め込むことができる純粋に解釈されたスクリプト言語であり、Web アプリケーションの開発に特に適しています。 PHP スクリプトが要求されると、PHP はスクリプトを読み取り、実行されるコードのバイナリ表現である Zend オペコードにコンパイルします。このオペコードは PHP によって実行され、破棄されます。 PHP スクリプトは解釈されるたびに初期化され、解釈が完了すると終了します。この操作は互いに独立しています。各リクエストは、対応するページ ファイルを解釈するための個別のプロセスまたはスレッドを作成します。ページによって作成された変数およびその他のオブジェクトは、現在のページ内でのみ表示され、ページをまたがってアクセスすることはできません。実行が終了すると、ページ内で申請され、コードによって明示的に解放されなかった外部リソース (メモリ、データベース接続、ファイル ハンドル、ソケット接続など) が強制的に解放されます。つまり、PHP は言語レベルでページ全体の変数に直接アクセスしたり、メモリ常駐オブジェクトを作成したりすることはできません。

リーリー

この例では、StaticVarTester という名前のクラスが定義されています。このクラスには、0 に初期化されたパブリック静的メンバー $StaticVar が 1 つだけあります。次に、TestStaticVar() 関数で、StaticVarTester::$StaticVar に対して累積演算を実行し、出力します。

Java または C++ に詳しい開発者は、この例に精通しているはずです。 StaticVarTester クラスの静的メンバーである $StaticVar は、クラスがロードされたときにのみ初期化されます。StaticVarTester クラスが何度インスタンス化されても、$StaticVar のインスタンスは 1 つだけであり、複数回初期化されることはありません。したがって、TestStaticVar() 関数が初めて呼び出されるとき、$StaticVar が累積され、値は 1 になり、保存されます。 TestStaticVar() 関数が 2 回目に呼び出されるとき、$StaticVar の値は 2 です。

印刷結果は期待どおりです:

リーリー

ただし、ブラウザがページを更新してこのコードを再度実行すると、別の状況が発生します。 Java または C++ では、$StaticVar の値が保存され、次の結果が表示されます。 リーリー

しかし、PHPでは上記の仕組みにより、現在のページを解釈するたびにプログラムの初期化と終了の処理が行われます。つまり、StaticVarTester はアクセスされるたびに再ロードされ、次の行の public static $StaticVar = 0; も繰り返し実行されます。ページの実行が完了すると、すべてのメモリ領域が再利用され、$StaticVar 変数は (StaticVarTester クラス全体とともに) 存在しなくなります。したがって、ページが何回更新されても、$StaticVar 変数は開始点に戻ります。最初は 0 に初期化され、次に TestStaticVar() 関数呼び出しで累積されます。したがって、表示される結果は常に次のようになります:

リーリー

PHP のこのユニークな作業モデルの利点は、基本的に厄介なリソース リークの問題を解決できることです。 Web アプリケーションは短期間に大量の同時処理が行われるという特徴があり、さまざまなリソースの適用と解放が非常に頻繁に行われるため、リークやクラッシュが発生しやすくなります。 PHP の動作メカニズムは、従来のクラッシュの問題がないと判断されており (せいぜい接続タイムアウト スクリプトが実行を停止する程度)、PHP は比較的安定した Web アプリケーションであると言えます。ただし、このメカニズムの欠点も非常に明らかです。最も直接的な結果は、PHP が言語レベルでクロスページ バッファリング メカニズムを実装できないことです。このバッファリングメカニズムの欠如によって引き起こされる影響は、次の 2 つの側面に分けられます。

1 つはオブジェクトのバッファリングです。ご存知のとおり、多くのデザイン パターンはオブジェクトのバッファリング メカニズムに依存しています。オブジェクトの作成にはメモリ リソースやその他のリソースを取得する必要があるため、これは特に時間がかかります。大量の同時実行に頻繁に対処するため。したがって、オブジェクトのバッファリングがないと、理論的には速度が大幅に低下します。サービス プログラムの効率を向上させるには、オブジェクトの作成と破棄の回数をできる限り減らす必要があります。PHP は現在マルチスレッドをサポートしていないため、Java のようにスレッド プールのスケジューリングによってこの欠点を補うことはできません。 ; ただし、Memcachd などのサードパーティ ソフトウェアを使用して、PHP のオブジェクト バッファリング メカニズムを実装し、オブジェクトの作成と破棄の時間を短縮し、サービス プログラムの効率を向上させることができます。 Memcachd は、PHP でコンパイルされたオペコードをキャッシュし、このオペコードをメモリに保存して、次回ページが呼び出されるときに再利用するため、時間を大幅に節約できます。より一般的に使用されるキャッシュは eAccelerator です。eAccelerator のもう 1 つの一般的な代替キャッシュは Alternative PHP Cache (APC) です。

2 つ目は、データベース接続のバッファリングです。 MySQL の場合、PHP は組み込みのデータベース バッファリング メカニズムを提供します。これは、mysql_connect() の代わりに mysql_pconnect() を使用してデータベースを開きます。 PHP は、放棄されたデータベース接続を自動的にリサイクルして再利用します。実際のアプリケーションでは、この種の永続的なデータベース接続はデータベース接続の疑似リークを引き起こすことがよくあります。つまり、ある時点で同時データベース接続が多すぎて、MySQL 接続の最大数を超え、新しいプロセスが接続できなくなります。データベース。しかし、しばらくして同時実行数が減少すると、PHP はいくつかの接続を解放し、Web サイトは通常の状態に戻ります。この現象の原因は、pconnect を使用する場合、Apache の httpd プロセスの数が mysql 接続の最大数を超えると、接続が失敗するためです。したがって、Apache の httpd プロセス数が MySQL の最大接続数を超えないように、Apache と Mysql の構成を慎重に調整する必要があります。実践後、作者は PHP5 と Oracle10g 間の接続において、データベース接続が頻繁に行われるため、データベース接続が失われる場合があることに気付きました (Oracle は公式に PHP 用の拡張パッケージを用意していますが、それがこの問題を解決できるかどうかはわかりません) 、試したことはありません)。

PHP の作業モデルには、本質的に、欠点と利点の両方があります。これが PHP のユニークな点です。

FastCGI モードで php を実行する場合、php.ini の解析、すべての拡張機能のロード、およびすべてのデータ構造の再初期化は、プロセスの開始時に 1 回だけ行われます。さらに、永続的なデータベース接続が機能するという利点もあります。 Nginx+PHP (FastCGI) は良い選択です。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/752422.html技術記事 PHP の作業モデルは非常に特殊です。 PHP と、ASP、ASP.NET、JSP/サーブレットなどの一般的な Web テクノロジとの間には、ある程度、本質的な違いがあります。 Java を例に挙げると、Web アプリケーションの分野では、Java...
関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!