2009-05-28 2 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에서 backlog 매개 변수를 늘리면 300-500 정도가 될 것입니다. 어떻게 이것을 극복 할 수 있습니까?

초당 많은 수신 연결을 허용하는 PHP 서버 소켓을 만드는 방법은 무엇입니까?

감사합니다.

전체 오류 :

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

답변

1

ulimit을 확인합니다. 파일 설명자 테이블이 오버플로 되었습니까?

EDIT : accept()에있는 백 로그 값이 가짜입니다. 대부분의 OS-es는 최대 수신 연결 대기열 크기가 수천이 아니라 수십 단위로 있습니다. 난 그냥이 문제에서 찾고 있었어요

+0

현재 "무제한"으로 설정되어 있습니다. – erotsppa

+0

나는 더 분명해야했습니다. 열린 파일 제한 (-n 옵션 또는 모든 제한에 대해 -a)을 확인하십시오. –

+0

open -n이 1024로 설정되었지만 동일한 파일 소켓을 여러 번 열 때이 제한이 사용됩니까? 특히 다른 하나를 연 후에 각각을 닫은 후에? – erotsppa

0

가 (Google을 통해 여기있어) 내가 솔루션 오류를 제거하는 것으로 나타났습니다 :

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

관련 문제