2017-09-08 5 views
0

私たちが知っているように、PHPは「何も共有しない」という考え方で動作します。 したがって、パフォーマンスに重大な制限があります。同じPHP実行インスタンスを使用して複数のリクエストを処理するにはどうすればよいですか?

コンパイルされたスクリプトはいくつかのキャッシング拡張で高速化できますが、非常に重い初期化を避けることはできません(たとえば、Webサービスがあり、すべての呼び出しで少なくともDTOスキーマの解析とブートストラッピング、データベース(永続的なmysql接続は、その観点からは本当に汚いです)、別のリモートサービスを開くなど)。

また、この問題はReactPHPフレームワークによって解決されるようですが、軽量で非フレームワークなソリューションは存在しますか?ハッキングの方法から、1ファイルの例から、軽量ライブラリ(フレームワークではない)までが認められています。 複雑なWebサーバーの再作成機能は必要ありません。単純なPOST要求を処理するだけで十分です。

<offtopic>

タスク自体はPHPは、まだこのアウトオブボックスを提供していないなぜかしら...

</offtopic>

+0

opcacheとallを使用すると、これは大きな影響を与えません。ほとんどのフレームワークは、現在のタスクを処理するために必要なモジュールのみをロードします。私はHTTP POSTについてはわかりませんが、ソケットは機能します。 – Salketer

+0

モジュールローディングがボトルネックではなく、セットアップリソースを共有する必要がある初期化を想定します。 ReactPHP(そのような唯一のフレームワークですか?)はそれを解決しますが、それを使用することは、それほど高いサポートがない複雑なフレームワークへの依存を意味します。このような単純な作業にはあまりにも危険です。 –

+0

本当にそんなにシンプルな仕事だったら、他の解決策もあると思いませんか? PHPのすべてがステートレスです。 exec()でステートフルなリソースを使用し、PHPを非常にスリムにしない限り、それは難しいでしょう。しかし、私は本当にこの "ボトルネック"がFacebookに問題がない間、あなたに害を及ぼしているのではないかと疑う。 – Salketer

答えて

1

それを行うための一つの細かい方法そう不可欠です通常のJava/nodeJSサーバーのように動作するCLIスクリプトを持っています。また、軽いPHPゲートウェイを使用してHTTPリクエストを受信し、ソケットからCLIから必要な情報を要求します。

興味深い読み取りがhttp://liveforeverbook.info/blog/2008/01/31/persistent-web-apps-in-php/

あり、このための鍵は、CLIスクリプトが(Javaサービスのような)メモリ内のメッセージストア を保ち、およびWebベースを通じてクライアント と通信していることですPHPの "ゲートウェイ"。

IRCサーバ< - > PHPゲートウェイ< - >クライアントのゲートウェイのステップは、実際に必要 ではありませんが、IRCサーバがネットに直接接続されていた場合を通じて を来るかもしれないごみをフィルタリングするのに役立ちます。

コンソールからスクリプトとして実行しているIRCサーバを起動し(ph server.php)、実行したままにします。 CLIスクリプトにタイムアウトがないため、手動でオフにするまで が実行され続けます。

1

軽量なフレームワーク以外のソリューションはありますか?ハッキングの方法から、1ファイルの例から、軽量ライブラリ(フレームワークではない)までが認められています。

あなたが探しているものによって異なります。何らかのイベントループ/スケジューラが必要です。ほとんどはamphp/amp/react/event-loopです。コールバックで死ぬことを望まない場合は、amphp/amp/react/promiseで提供されるいくつかの有望な実装が必要です。

フレームワークとしてこれらのパーツを見て、それらのパーツを使用したくない場合は、自分で書き込むことができます。しかし、もう一度、安定したソフトウェアを探しています。これらのソフトウェアは、広く普及しており、バグが報告され、修正されているため、独自の実装よりも安定しています。

これらの基本の上にあるものはすべてライブラリです。あなたはそれらを使用するか、自分で書くことができます。ソケットサーバーが必要なだけの場合は、PHPのエッジケースを可能な限り扱っているライブラリを使用しないでください。

複雑なWebサーバーの再作成機能は必要ありません。単純なPOST要求を処理するだけで十分です。

ああ、複雑なWebサーバーは何ですか?単純なPOST要求を処理する "ちょっと"?あなたは、パイプラインリクエストを正しく処理し、チャンクエンコードを解読するHTTPプロトコルパーサー、アップロードされたファイルを扱う場合はマルチパートパーサーなどが必要です。

単一のPHPで複数のリクエスト私はPHP-PMを見てみることをお勧めしますが、この時点では生産準備ができていません。

関連する問題