Définir un délai d'attente sur socket_read
Je me demandais comment puis-je définir un délai d'attente sur un socket_read
appel? La première fois qu'il appelle socket_read
, il attend jusqu'les données sont envoyées, et si aucune donnée n'est envoyée dans les 5 secondes, je veux fermer la connexion. Toute Aide? J'ai déjà essayé SO_RCVTIMEO
avec pas de chance.
Je suis de la création d'un socket avec socket_create()
et à l'écoute pour les connexions, puis lorsqu'il est connecté j'écoute pour les données et de faire quelque chose avec elle. Lorsque le délai d'attente frappe, je veux courir socket_shutdown()
et puis socket_close()
.
Veuillez prendre à noter que l'API Windows Sockets ne fonctionne pas avec les délais d'attente moins de 500 ms. Vous pouvez définir délai de beaucoup plus petite quantité de temps, mais pendant que vous serez sur la plateforme Windows, vous devez savoir que cela ne fonctionnera probablement pas comme vous le souhaitiez. Référence: microsoft.com/mspress/books/WW/sampchap/4287d.aspx .
OriginalL'auteur James Hartig | 2008-12-23
Vous devez vous connecter pour publier un commentaire.
cet ensemble de 5 secondes délai d'attente de la prise.
après quelques tests - cela semble être la durée de vie de l'ensemble de la socket - pas seulement les socket_read
Observation intéressante: si vous utilisez PHP_NORMAL_READ au lieu de PHP_BINARY_READ (par défaut) comme troisième argument de socket_read(), il ignore le délai défini à l'aide de socket_set_option() et va bloquer indéfiniment jusqu'à ce que quelque chose est envoyé... (observé avec PHP 5.5.9)
Une autre observation intéressante: Il ne fonctionne pas si vous retirez ` usec` partir de la matrice
OriginalL'auteur Nick
Avez-vous essayé socket_set_option avec SO_RCVTIMEO
Valeur de délai d'expiration pour les opérations d'entrée.
Génial! Qui a résolu pour moi. J'ai maintenant un
socket_read()
que les temps pour moi.OriginalL'auteur OIS
J'ai fait un socket_listen et puis j'ai fait un manuel de délai d'attente avec time()+2 et une boucle while avec nonblock ensemble et socket_read() à l'intérieur. Semble fonctionner ok. Des alternatives?
Mise à JOUR: j'ai trouvé que le réglage de la douille comme non bloquante et puis, à l'aide de socket_listen à condition que le délai dont j'avais besoin.
OriginalL'auteur James Hartig
OriginalL'auteur Konstantin Ermolaev