接続プール-phpページ間でオブジェクトを共有する方法はありますか?
私はphpを初めて使用しますが、他のWebテクノロジーでは、ページインスタンス間でオブジェクトを共有できます。たとえば、java jspページでは、サーバーインスタンス全体の静的クラスとして存在するクラスを簡単に作成できます。 PHPでこれを行う方法は?
私はセッション変数を参照していません(少なくとも私はそうは思いません)。これは、リソースプーリング(おそらく共有するソケット、またはデータベース接続など)を目的としています。したがって、セッションに格納できるいくつかのプリミティブ変数だけでなく、クラス全体を後続のロード間で共有する必要があります。
phpシングルトンクラスの実行も検討しましたが、クラスは同じページ内でのみ共有され、ページ間では共有されないと思います。
さらに明確にするために、たとえば、connectSocket.phpページのサーバーに接続されたソケットを共有して、そのページをロードするすべてのユーザーが同じソケットを使用するようにするのに役立つものを探しています。新しいものを開かないでください。
答え :
解決策:
これは少し難しい答えであり、あなたが探しているものと正確に一致しない可能性があります。
PHPは、「シェアードナッシング」アーキテクチャに基づいて構築されています。アプリケーション全体で何らかのタイプの状態が必要な場合は、他の方法でこれを行う必要があります。
まず、問題の核心を調べることをお勧めします。本当に必要ですか? PHPアプリケーションが死ぬ(そして状態を失う)可能性があると仮定した場合、データを失っても大丈夫ですか?
アプリケーションが停止した後などでも状態を維持する必要がある場合は、データを配置するのにおそらく最適な場所はMySQLであると想定する必要があります。 PHPは、ビジネスロジックの薄い層として意図されているため、これを強くお勧めします。
再起動後にデータが失われることを気にしない場合、探している問題のドメインはおそらくキャッシュです。 memcached を調べることをお勧めします。単一のマシンを使用している場合は、apc。 APCは、単一のマシン上のApacheで確実に機能しますが、データが失われる可能性があると想定して、アプリケーションをコーディングする必要があります。
基盤となるデータストア(MySQL)が遅すぎるのではないかと心配しているが、再起動後もデータを維持する必要がある場合は、これら2つのシステムの組み合わせを調べる必要があります。データはいつでもキャッシュからプッシュおよびプルできますが、更新された場合にのみMysqlに送信されます。
データが純粋にユーザーまたはセッションにバインドされている場合は、セッションシステムを調べたいだけです。
私はかなり大規模なマルチテナントアプリケーションを個人的に開発しました。そのアプリケーションはかなり複雑ですが、あなたが探している真の状態は必要ありませんでした。
更新:申し訳ありませんが、ソケットの共有に関するメモを読みませんでした。これを処理するには、別のデーモンが必要になります。おそらく、問題をさらに説明できる場合は、他のアプローチがある可能性があります。これはどのタイプのソケットですか?
答え :
解決策:
WebサービスのJavaと、PHPやPerlなどのWebサービスのインタプリタ言語には根本的な違いがあります。 Javaでは、Webサーバーには状態を維持するオペレーティング環境(Tomcatなど)があります。インタプリタ言語を使用すると、通常、Webサーバーへのリクエストによって新しいWebサーバースレッドが生成され、そのスレッドの新しいオペレーティング環境(この場合はPHP環境)が読み込まれます。
したがって、PHPにはページインスタンスの概念はありません。 Webサーバーへのすべての要求は、新たなスタートです。すべてのクラスが再ロードされるため、外部で実装されない限り、クラス共有の概念も、リソースプーリングの概念もありません。
したがって、Webリクエスト間でソケットを共有することは実際には不可能です。
答え :
解決策:
ほとんどのPHPデータベースライブラリは、すでに接続プールを使用しています。たとえば、新しい接続を要求しているかのようにpg_connectを呼び出しますが、接続文字列が既存の接続と同じである場合は、代わりに確立された接続を取得します。データベースアクセスのプーリングのみに関心がある場合は、使用しているdbライブラリにそれが存在することを確認できます。
答え :
解決策:
他の恐ろしい解決策は、オブジェクトのデータを任意の$ _SESSION変数にロードしてから、それを他のページのオブジェクトに戻すことです。 実際、これは、より良いものが得られるまで、プロジェクトで従うソリューションです。
よろしく!
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。