12

私は php を初めて使用しますが、他の Web テクノロジでは、ページ インスタンス間でオブジェクトを共有できます。たとえば、Java jsp ページでは、サーバー インスタンス全体の静的クラスとして存在するクラスを簡単に作成できます。phpでこれを行う方法は?

私はセッション変数について言及していません (少なくとも私はそうは思いません)。これは、リソースのプール (おそらく共有するソケット、またはデータベース接続など) を目的としています。したがって、セッションに保存できるいくつかのプリミティブ変数だけでなく、クラス全体を後続のロード間で共有する必要があります。

私はphpシングルトンクラスも調べましたが、クラスは同じページ内でのみ共有され、ページ間では共有されないと思います。

さらに明確にするために、たとえば、connectSocket.php ページのサーバーに接続されたソケットを共有して、そのページをロードするすべてのユーザーが同じソケットを使用し、新しいもの。

4

5 に答える 5

15

これは少し難しい答えであり、まさにあなたが探しているものではないかもしれません.

PHP は、「シェアード ナッシング」アーキテクチャに基づいて構築されています。アプリケーション全体である種の状態が必要な場合は、他の方法でこれを行う必要があります。

最初に、問題の核心を調べることをお勧めします。本当に必要ですか? PHP アプリケーションが死ぬ (そして状態を失う) 可能性があると仮定した場合、データを失っても大丈夫ですか?

アプリケーションが停止した後でも状態を維持する必要がある場合は、データを配置するのにおそらく最適な場所は MySQL であると想定する必要があります。PHP はビジネス ロジックの薄い層として意図されているため、これを強くお勧めします。

再起動後にデータが失われることを気にしない場合、探している問題のドメインはおそらくキャッシュです。memcachedを調べることをお勧めします。単一のマシンを使用している場合は、apc . APC は 1 台のマシンで Apache を使用することで確実に機能しますが、データが失われる可能性があることを前提としてアプリケーションをコーディングする必要があります。

基礎となるデータストア (MySQL) が遅すぎることを心配しているが、再起動後もデータを維持する必要がある場合は、これら 2 つのシステムの組み合わせを検討する必要があります。いつでもキャッシュからデータをプッシュおよびプルできますが、更新時にのみ Mysql にデータを送信します。

データが純粋にユーザーまたはセッションにバインドされている場合は、おそらくセッション システムを調べたいだけでしょう。

私はかなり大規模なマルチテナント アプリケーションを個人的に開発しました。かなり複雑なアプリケーションですが、あなたが探している真の状態を必要としたことはありません。

更新: 申し訳ありませんが、ソケットの共有に関するメモを読んでいませんでした。これを処理するには別のデーモンが必要になります。おそらく問題をさらに説明できる場合は、他のアプローチがあるかもしれません。このソケットは何型ですか?

于 2009-05-25T21:46:22.100 に答える
13

Web で提供される Java と、PHP や Perl などの Web で提供されるインタープリター言語との間には根本的な違いがあります。Java では、Web サーバーには状態を維持する動作環境 (Tomcat など) があります。インタープリター言語では、通常、Web サーバーへのリクエストによって新しい Web サーバー スレッドが生成され、そのスレッドがそのスレッドの新しい動作環境 (この場合は PHP 環境) をロードします。

したがって、PHP にはページ インスタンスの概念はありません。Web サーバーへのすべての要求は、新たなスタートです。すべてのクラスが再ロードされるため、外部で実装されない限り、クラス共有の概念もリソース プーリングの概念もありません。

したがって、Web リクエスト間でソケットを共有することは実際には不可能です。

于 2009-05-25T21:56:28.337 に答える
3

これはおそらく部分的な答えですが、クラスのインスタンスをセッション変数に保存して、別のときにアクセスできます。

于 2009-05-25T21:55:27.217 に答える
1

ほとんどの PHP データベース ライブラリは、既に接続プールを使用しています。たとえば、あたかも新しい接続を要求しているかのように pg_connect を呼び出しますが、接続文字列が既に存在する接続と同じである場合は、代わりに確立された接続が返されます。データベース アクセスのプーリングのみに関心がある場合は、使用している db ライブラリにプーリングが存在することを確認できます。

于 2009-05-25T21:54:42.240 に答える
0

別の恐ろしい解決策は、オブジェクトのデータを任意の $_SESSION 変数にロードし、それを別のページのオブジェクトに戻すことです。実際、これは、より良いソリューションが得られるまで、私のプロジェクトで使用するソリューションです。

よろしく!

于 2010-04-14T16:33:02.937 に答える