2009-05-28 6 views
1

J'ai un code serveur php très simple comme celui-ciPourquoi le fsockopen de php revient-il (ressource momentanément indisponible)?

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); 
     } 
} 


J'ai un client très simple qui fait cela

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); 
    } 
} 

Pour une raison quelconque, après un nombre aléatoire de connexions (autour 300-500) fsockopen retournera avec une ressource d'avertissement temporairement indisponible. Au début, je recevais l'avertissement à environ 20-30 connexions. Mais une fois que j'ai augmenté le paramètre de backlog dans socket_listen, il est un peu mieux à environ 300-500. Comment puis-je surmonter cela? Quelle est la façon de construire un socket serveur PHP pour accepter un grand nombre de connexions entrantes par seconde (soutenue).

Merci!

L'erreur complète:

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

Répondre

1

Vérifiez votre ulimit. Êtes-vous débordant votre table de descripteur de fichier?

EDIT: la valeur de backlog que vous avez dans accept() est fausse. La plupart des systèmes d'exploitation ont la taille maximale de la file d'attente de connexion entrante sur l'échelle de dizaines, pas de milliers.

+0

Il est actuellement défini sur "unlimited"; – erotsppa

+0

J'aurais dû être plus clair. Vérifiez la limite de fichiers ouverts (option -n, ou -a pour toutes les limites.) –

+0

open -n est défini sur 1024, mais l'ouverture multiple du même socket utilise-t-elle cette limite? Surtout après avoir fermé chacun d'eux après en avoir ouvert un autre? – erotsppa

0

Je viens examiner cette question (suis arrivé ici grâce à Google) et je l'ai trouvé qu'une solution pour se débarrasser de l'erreur:

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

..est de ne pas utiliser fsockopen() dans le fil de l'écrivain; essayez quelque chose comme ceci:

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); 

Mieux vaut tard que jamais? ;-)

+1

où se connecte ce code? Vous ne spécifiez pas le point de terminaison n'importe où! (/ tmp/mysock) – dwery

Questions connexes