0

最近のPHPバージョン(> 5.3)stream_socket_client()で、関連するものが適切なスレッドセーフであるかどうかがわかりません。fsockopen()

私は主にLinuxのApache上のPHPに興味があります。また、Apache MPM-preforkが違いを生むかどうか、そして知識が存在する場合、これがすべてNginxなどのfastCGIに当てはまるかどうかにも影響します。

簡単なテストでは、各フォークが独自のソケットファイルを作成することが示されていますが、これはより多くの同時接続にも当てはまりますか?これは、Apacheのフォーク、Unixのソケットアーキテクチャ、またはPHP自体の性質によるものですか?これらの金属に近い問題に関しては、私はかなり無知です。

または:ソースの読み取りと書き込みを行うときに、stream_socket_client()異なる接続で衝突することはないと想定しても安全ですか?

4

2 に答える 2

2

pthreadに関して:

この時点でのPHPのアーキテクチャは固いものになっています-PHP6について読んでください-したがって、現在または将来PHPとして認識しているものをスレッド化できる唯一の方法は、PECL拡張機能を使用することですが、それがあなたを先延ばしにするべきではありません-それがコアの一部ではないという理由だけであなたのネットワークからAPCの能力を放棄することはありません。私はpthreadの唯一の作成者であるため、少し偏見があるかもしれませんが、ブードゥーや呪文を使用したことはありません。使用したのは、TSRMと明らかに拡張APIを組み合わせたObjectsAPIです。何年にもわたって作成されており、数十億時間の実世界でのテストが行​​われています。つまり、pthreadが本番環境に対応しているとは限りません。確かにそうではありませんが、いつかはそうなるでしょう。

pthreadがリソースを共有することはおそらくないでしょう。私はこれを詳しく実験し、それを機能させるための複数の方法を見つけましたが、満足できるものはありません。PHPはほとんどが拡張機能であり(標準ライブラリも拡張機能として実装されています。これは機能を追加する最も効果的な方法です)、オブジェクトレベルのマルチスレッド環境ではすべて準備が整っていません。非常に多くの理由から、PHPはマルチスレッドネットワークアプリケーションの候補としては適していません。非線形の方法で考えるとき、なぜリソースを共有したいのですか(ソケットは別として-より適切なものを使用してください)リソースは、解析のビジネスに取り掛かっている間、まったく異なるスレッドで作成および操作できますテンプレートやjson、またはアプリケーションが行うことは何でも。

于 2012-11-02T00:48:01.407 に答える
0

PHP自体はスレッドをほとんどサポートしていません。「スレッドセーフ」な関数については約束する場合としない場合がありますが、インタプリタ自体がスレッドが存在しないふりをする場合は、ほとんど違いはありません。*

ただし、mpm_preforkに関する限り、それは問題ではありません。Prefork MPMは、すべてフォークに関するものです(そのため名前が付けられています)。スレッドを気にしないので、PHPのスレッドセーフの問題は実際には発生しません。

FastCGI(特に古いCGIとの違い)についてはよくわかりませんが、インタープリターからの特別なサポートが必要でない限り、マルチスレッドモデルではなくマルチプロセスモデルも使用します。各インタプリタには独自のプロセスがあり、PHPによるスレッドのサポートはほとんど関係ありません。

* PHPにpthreadを使用する方法を提供するPECLモジュールがありますが、それはコアの一部ではありません。スレッドが機能するようになると、すべてが地獄に落ちる拡張機能がたくさんあると思います。私は、PHPでのスレッド化は、本番環境で使用するには十分に成熟していないと考えており、PHP自体がスレッドを作成する方法を提供するまで、おそらくそのように感じ続けるでしょう。

于 2012-10-29T17:35:08.710 に答える