2013-01-10 17 views
5

PHPを使用して通知サービスサーバーとの永続的なソケット接続を作成したいのですが、問題が発生する前にどれくらいのApache/PHPスレッドを同時に使用できるのでしょうか。私はこれでいくつかのテストを行ったが、問題は発生していないようだ。永続的なPHPソケットを同時に使用する


編集

私はこのようなソケットを使用しています:

$fh = pfsockopen('127.0.0.1', '1338'); 
fwrite($fh,$data); 

すべてのPHPのスレッドがfsockopenと同じ永続的なソケット

+0

あなたは私はあなたが何を想像するのに役立つコード例を提供してもらえますか? –

+0

あなたはあなたの帯域幅/メモリが許す限り多くのものを作成することができますが、私は仮定します... – crush

+0

どうやってスレッド間でソケットを共有していますか? pthreads? – glomad

答えて

23

制限を共有する最大量でありますシステムのカーネル設定で定義されているオープンファイル記述子の数。 pfsockopenがうまく実装されている場合は、1つのソケット接続のみを使用する必要があります。つまり、1つのファイル記述子)を1つだけ使用することを意味します。

これをテストする必要があります。

$fd = pfsockopen('173.194.44.24', 80); 
echo $fd; 

この意志出力ファイルディスクリプタのID:Resource id #1

オープンは、このページに数回、Webブラウザでとリロード - あなたは同じソケット接続を使用している同じIDを毎回表示されるはずです。あなたはおそらくランダムにn個の異なるIDSの中で最も可能性の高い結果がを巡回します別のフォークプロセスに送信されmod_phpのセットアップ、nは

  • のApacheの設定に依存しながら - デフォルトのApacheのprefork MPMでは

    MinSpareServers(< = N pConnections)

  • MaxSpareServers(> = N pConnections)
  • MaxRequestsPerChild(tMaxの)

MaxRequestsPerChildに達すると、プロセスは終了し、この子の永続的な接続も終了します。

LighttpdやNginxのような他のfastcgi対応Webサーバーでは、PHP-FPMやPHP-cgi + fastcgiと組み合わせて、Webサーバーではなくphpプロセスによって引き起こされるのと同じ動作を期待しています。上述したApacheの設定と並行して

、関連する設定は、(= N pConnections>)

  • pm.min_spare_servers(< = N pConnections)
  • pm.max_spare_servers

    PHP-FPMであります

  • pm.max_requests(tMax)

のFastCGI

    PHP_FCGI_CHILDREN
  • 永続的な接続の最大寿命がそれによって処理要求の量で(すべての構成において(= N pConnections)
  • PHP_FCGI_MAX_REQUESTS(tMaxの)

プロセス)tMax、並列永続接続の最大量n pConnections

はAcually Iが第2の制限を言及するのを忘れコマンドライン(PHP-CLI)

# php -a 
Interactive shell       # in a webserver environment this is the equivalent of one child 

php > $fd1 = fsockopen('google.de', 80); # open non-persistent connection 
php > echo $fd1 . "\n"; 
Resource id #1 
php > $fd2 = fsockopen('google.de', 80); # open another one 
php > echo $fd2 . "\n"; 
Resource id #2        # new fd, new connection 

php > $pd1 = pfsockopen('google.de', 80); # persistent connection 
php > echo $pd1 . "\n"; 
Resource id #3        # first persistent fd 
php > $pd2 = pfsockopen('google.de', 80); 
php > echo $pd2 . "\n";       
Resource id #3        # uses the same connection 

php > exit         # simulating MaxRequestsPerChild threshold 
# php -a 
Interactive shell 

php > $pd3 = pfsockopen('google.de', 80); # persistent connection, same host 
php > echo $pd3 . "\n"; 
Resource id #1        # resource id reused because all old connections are gone 

EDIT

でこれをシミュレート。 接続はサーバー自体でいつでも閉じることができます。 これは、使用しているサーバーの設定とプロトコルによって大きく異なります。

ほとんどのサーバーは、n秒の無音と、接続時間の合計がx秒後に接続を閉じます。

pconnectこれを静かに処理しますが、古いものがなくなると新しい接続が開きます。

再びCLIでこれをシミュレート:

# php -a 
Interactive shell 

php > $pd1 = pfsockopen('127.0.0.1', 80); 
php > echo $pd1 . "\n"; 
Resource id #1 
php > $pd1 = pfsockopen('127.0.0.1', 80); 
php > echo $pd1 . "\n"; 
Resource id #1 

(restarting my webserver on the another console /etc/init.d/nginx restart) 

php > $pd1 = pfsockopen('127.0.0.1', 80); 
php > echo $pd1 . "\n"; 
Resource id #2 
+2

これは非常に徹底的でよくフォーマットされた説明でした。私はその答えは基本的にはそれが期待されていたが、私は私のテストの結果が不明だった。ありがとうございました! – nathanjosiah

+0

よろしくお願いいたします。 –

関連する問題