2


0

phpのfsockopenが返されるのはなぜですか(リソースが一時的に利用不可)。

私はこのような非常に単純なサーバーPHPコードを持っています

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);
      }
 }
 +
それから私はこれを行う非常に単純なクライアントを持っています
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のbacklogパラメータを増やすと、300〜500程度に少し良くなりました。 どうやってこれを克服するのですか?

毎秒たくさんの着信接続を受け付けるようにphpサーバーソケットを構築する方法は何ですか(持続)

ありがとうございます。

完全なエラー:

_ PHP警告:fsockopen():22行目のtest.phpで、unix:/// tmp / mysock:0(リソースが一時的に利用不可)に接続できません _

2 Answer


1


`+ ulimit `を確認してください。 ファイル記述子テーブルがあふれていませんか。 + + 編集: ` accept()+`にあるバックログ値は偽です。 ほとんどのOSは、数千ではなく数十の規模の最大着信接続キューサイズを持っています。


0


私はちょうどこの問題を見てきました(Googleを通してここに来ました)、そして私はエラーを取り除くための解決策を見つけました:

PHP警告:fsockopen():22行目のtest.phpで、unix:/// tmp / mysock:0(リソースが一時的に利用不可)に接続できません
.is to not use fsockopen() in the writer thread; try something like

これは代わりに:

if(! ($ cSock = socket_create(AF_UNIX、SOCK_STREAM、0))){exit( "ソケットの作成に失敗しました");持続する;そうでなければ(! socket_connect($ cSock、IPC_SOCK)){exit( "ソケットに接続できませんでした"); else {$ bw = socket_write($ cSock、$ msg);} if($ bw === false){exit( "ソケットの書き込みに失敗しました、%s"、array(socket_strerror(socket_last_error()))); } else {exit( "ソケットに$ bwバイトを書いた"); socket_shutdown($ cSock); socket_close($ cSock);

決して遅刻しない方がいいですか? ;-)