4

PHPの内部動作を理解するのに助けが必要です。

昔は、TSR(Terminate and Stay Resident)ルーチン(Windows以前の時代)を作成していたことを覚えていますか?そのプログラムが実行されると、それはメモリに残り、いくつかのホットキー(altキーまたはctrlキーの組み合わせ)によって再実行できます。

Webサーバー/アプリケーションでも同様の概念を使用したいと思います。たとえば、そのapache / phpサーバーで実行されているすべてのWebアプリケーションに共通の関数(Generate_City_Combo()、Check_Permission()、Generate_User_Permission_list()など)で構成されるcommon_functions.phpがあります。

すべてのモジュールまたはアプリケーションのphpファイルで、次のように記述できます
。require_once(common_functions.php);

これは、すべてのモジュールとアプリケーションにその共通ファイルを含み、正常に機能します。

私の質問は:phpはこれを内部的にどのように処理するのですか?
私が持っていると言う:2つのアプリケーションAppOneとAppTwo。
AppOneには2つのメニューオプションAppOne_Menu_PQRとAppOne_Menu_XYZがあります
AppTwoには2つのメニューオプションAppTwo_Menu_ABCとAPPTwo_Menu_DEFがあります

これらの4つのメニュー項目はすべて、common_functions.phpから関数{Generate_City_Combo()、Check_Permission()、Generate_User_Permission_list()など}を呼び出します。

次に、次のシナリオを検討します。A)ユーザーXXXがログインし、パーソナライズされたダッシュボードからAppOne_Menu_PQRをクリックしてから、すべての画面と手順に従います。これは一連の8〜10ページのリクエスト(画面)であり、インタラクティブです。これが終わった後、ユーザーXXXは自分のパーソナライズされたダッシュボードからAppTwo_Menu_DEFをクリックし、以前と同様にすべての画面と手順(約8〜10ページ/画面)を実行します。次に、ユーザーXXXがログオフします。

B)ユーザーXXXがログインし、シナリオAで説明されていることを実行します。同時に、ユーザーYYYも(他のクライアントマシンから)ログインし、シナリオAで説明されているのと同様のことを実行します。

シナリオAの場合、同じセッションです。シナリオBの場合、2つの異なるセッションがあります。

すべてのメニューオプションがGenerate_User_Permission_list()およびGenerate_Footer()を呼び出すか、多くのメニューオプションがGenerate_City_Combo()を呼び出すと想定します。

では、PHPはページリクエストごとにcommon_functions.phpを何回実行/インクルードしますか?セッションごと?またはPHPの起動/シャットダウンごとに?私の理解では、common_functions.phpは、ページのリクエスト/サイクル/ロード/画面ごとに1回実行されますよね?基本的に、すべてのインタラクションに対して1回です。

Generate_City_Combo()やGenerate_Footer()のような関数は、誰がいつ呼び出しているかに関係なく、同じ出力を生成するか、同じことを実行することを忘れないでください。

これをアプリケーションの起動とシャットダウンごとに1回に制限したいと思います。

これらは単なる例です。私の実際の問題はもっと複雑で複雑です。私のアプリケーションでは、Application_Startup()ルーチンを一度だけ呼び出して、理想的な環境(すべてのルックアップおよび参照データ構造、読み取り専用データ、セキュリティマトリックス、メニューオプション、コンテキスト依存のビジネス実行ロジックなど)を作成したいと思います。 。)。その後、サーバーに送信されるすべての要求は、環境を作成するために時間やリソースを費やす必要はありませんが、「作成済みの環境」を即座に参照できます。

これはPHPで実行可能なものですか?どのように?PHPの内部動作を説明している場所や本を教えていただけますか?

前もって感謝します。

4

4 に答える 4

2

PHPは、完全に別個の実行フレームで各HTTP要求を処理します。これらすべてにサービスを提供するために、永続的なプロセスが実行されることはありません。(Webサーバーは実行されていますが、PHPページをロードするたびに、PHPインタープリターの個別のインスタンスが呼び出されます。)

目的の永続領域の生成にかかる時間が長い場合は、それらのスクリプトからの出力をディスクにキャッシュし、キャッシュされたバージョンが利用可能な場合は最初にロードすることを検討してください(古くなっていない場合)。

于 2010-02-27T04:29:45.650 に答える
1

PHP(ほとんどすべての場合)はページ指向です。HTTPリクエスト間で状態を維持するApplication_Startup()はありません。

データベースまたは$_SESSIONからシリアル化されたデータをロード/アンロードすることでこれをエミュレートできる場合がありますが、オーバーヘッドが伴います。また、memcachedサーバーがこれを最適化できる場合もありますが、通常、cPanelなどの一般的な仮想ホスティングサービスでは使用できません。

あなたが話しているようなアプリを作成する必要がある場合は、ユーザーの選択をセッションにシリアル化し、セッション間で保持する必要があるものをデータベースに保存します。

データベースへのオブジェクトのシリアル化を簡素化するDoctrineのようなPHP用のORMモジュールがいくつかあります。

于 2010-02-27T04:32:46.940 に答える
1

あなたは時期尚早に最適化していると思いますが、希望はあります。

リクエストごとの安定性が必要なため、コンパイルされたコードの複数のコピーがメモリに必要になることがよくあります。同じメモリスペースで個別のリクエストが動作し、競合状態やデータ破損のリスクが発生することは望ましくありません。

とは言うものの、PHPコードをプリコンパイルするPHPアクセラレーターは数多くあり、includeとrequireの呼び出しを大幅に高速化します。

于 2010-02-27T04:34:12.723 に答える
0

私はネクロマンシングを行っていますが、PThread の出現により、事実上、「いいえ、あなたはできるPHPでそれをしないでください。」

基本的には、CLI ツール、socket_* 関数、および PThreads を使用するだけで、PHP で独自のマルチスレッド Web サーバーを作成できます。ポート 80 でリッスンし、リクエストをリクエスト キューに追加し、いくつかのワーカー スレッドを起動してキューを処理するだけです。

ワーカーの数は、リクエスト キューの長さとオペレーティング システムの実行キューの長さに基づいて管理できます。数秒ごとに、メイン スレッドは関数を通過してワーカー プールのサイズを管理できます。Web リクエスト キューの長さがオペレーティング システムの実行キューの長さの定数倍よりも大きく、ワーカーの数が構成された最大数よりも少ない場合、別のワーカー スレッドをインスタンス化する可能性がありました。Web 要求キューの長さが、OS の実行キューの長さの他の (より低い) 定数倍よりも短く、ワーカーの数が構成された最小値よりも大きい場合、現在の要求を終了するときにワーカー スレッドの 1 つに終了するように指示できます。次に、定数と構成値を調整して、サーバーのすべてのスループットを最大化することができます。そんな感じ。

独自の uri 解析をすべて行う必要があり、HTTP 応答を自分でつなぎ合わせる必要がありますが、ワーカー スレッドは Threaded を拡張するオブジェクトをインスタンス化するか、以前にインスタンス化された Threaded オブジェクトを再利用できます。

出来上がり - PHP TomCat。

于 2014-10-06T19:52:28.127 に答える