2009-05-28 26 views
1

私はこのなぜphpのfsockopenが戻っていますか(リソースは一時的に利用できません)?

function listenForClients() 
{ 
     $this->serviceConnection = socket_create(AF_UNIX, SOCK_STREAM, 0); 
     socket_bind($this->serviceConnection, "\tmp\mysock", 0); 
     socket_listen($this->serviceConnection, 10000000); 

     while($clientSocket = socket_accept($this->serviceConnection)) 
     { 
      $clientMessage = socket_read($clientSocket, 1024); 
      socket_close($clientSocket); 
     } 
} 


のような非常に単純なサーバーのPHPコードは、その後、私は周りの接続の乱数(後に、何らかの理由でこの

for ($counter = 0; $counter <= 1000; $counter ++) {  
    $fp = fsockopen("unix///tmp/mysock", 0, $errno, $errstr); 

    if (!$fp){ 
     echo "Error: Could not open socket connection at " . $counter . "\n"; 
     exit; 
    }else{  
     fputs ($fp, "hello", strlen("hello")); 
     fclose($fp); 
    } 
} 

を行い、非常に単純なクライアントを持ってい300〜500)fsockopenは警告リソースを一時的に使用できない状態で戻ります。当初、私は約20〜30回の接続で警告を受けていました。しかし、socket_listenのバックログパラメータを増やしてしまえば、300-500程度に改善しました。どのように私はこれを克服するのですか?

1秒間に多数の着信接続を受け入れるために、PHPサーバソケットを構築する方法は何ですか?

ありがとうございます!

フルエラー:

PHP Warning: fsockopen(): unable to connect to unix:///tmp/mysock:0 (Resource temporarily unavailable) in test.php on line 22

答えて

1

はあなたulimitを確認してください。ファイルディスクリプタテーブルがあふれていますか?

編集:accept()にあるバックログ値は偽です。ほとんどのOSは接続キューの最大サイズを数千ではなく数十の規模にしています。

私はこの問題を見てきました(グーグルを通じてここに着いた)、私は解決策は、エラーを取り除くためには検出されませんでした
+0

現在、「無制限」に設定されています。 – erotsppa

+0

私はより明確にすべきだった。開いているファイルの制限(-nオプション、またはすべての制限について-a)を確認してください。 –

+0

open -nは1024に設定されていますが、同じファイルソケットを複数回開くとこの制限が使用されますか?特に私は別のものを開いた後、それぞれを閉じた後に?興味深い。 – erotsppa

0

PHP Warning: fsockopen(): unable to connect to unix:///tmp/mysock:0 (Resource temporarily unavailable) in test.php on line 22 

は..is fsockopenの使用しないように()ライターのスレッドで。次のように試してみてください。

if (! ($cSock = socket_create(AF_UNIX, SOCK_STREAM, 0))) { 
    exit("Failed to create socket"); 
    continue; 
} else if (! socket_connect($cSock, IPC_SOCK)) { 
    exit("Failed to connect socket"); 
} else { 
    $bw = socket_write($cSock, $msg); 
    if ($bw === false) { 
     exit("Socket write failed, %s", array(socket_strerror(socket_last_error()))); 
    } else { 
     exit("Wrote $bw bytes to socket"); 
    } 
} 
socket_shutdown($cSock); 
socket_close($cSock); 

;-)

+1

このコードはどこに接続していますか?エンドポイントはどこにも指定しないでください! (/ tmp/mysock) – dwery

関連する問題