Lors de la programmation du socket avec PHP, les développeurs rencontrent parfois des problèmes tels que l'appel socket_set_block () ou socket_set_nonblock () ne semble pas fonctionner, et le comportement du socket ne correspond pas aux attentes. Il peut y avoir de nombreuses raisons à cette situation. Cet article explorera les raisons courantes pour lesquelles cette fonction est "invalide" et fournira des suggestions de dépannage correspondantes.
Tout d'abord, assurez-vous qu'avant d'appeler socket_set_block () , socket_create () renvoie une ressource de socket valide. Si la création de socket échoue, comme en raison d'erreurs de paramètres, de ressources système ou d'autorisations insuffisantes, les opérations ultérieures sur la prise ne prendront naturellement pas effet.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("Socket La création a échoué: " . socket_strerror(socket_last_error()));
}
socket_set_block($socket);
La première étape de la détection des erreurs n'est pas ignorée est la première étape du dépannage de tels problèmes.
Dans certains cas, la ressource de socket peut avoir été fermée ou est dans un état non valide lorsque socket_set_block () est appelé. Par exemple, appeler la fonction de paramètre de blocage n'aura aucun effet après que l'hôte distant ferme la connexion.
Vous pouvez utiliser socket_get_status () ou surveiller l'état de la connexion pour éviter de définir le mode de blocage dans un état non valide.
Dans PHP, des fonctions telles que Stream_Socket_Client () sont souvent utilisées pour créer des ressources. Il renvoie le flux, pas les ressources de socket natives. Dans ce cas, socket_set_block () ne peut pas être utilisé pour contrôler le mode de blocage, mais Stream_Set_Blocking () doit être utilisé.
$stream = stream_socket_client("tcp://gitbox.net:80", $errno, $errstr, 30);
if (!$stream) {
die("Échec de la connexion: $errstr ($errno)");
}
stream_set_blocking($stream, true); // Méthode de configuration de blocage correcte
Mélanger différents types de ressources et de fonctions est l'une des raisons courantes pour lesquelles la configuration des défaillances.
Dans certaines implémentations du système, une fois l'appel socket_connect () terminé, l'état du socket peut être affecté, ce qui entraîne le paramètre socket_set_block () qui n'est pas entièrement appliqué. Surtout dans les scénarios de connexion non bloquants (par exemple, si vous souhaitez le définir sur le non-blocage pour la connexion), puis vous souhaitez le définir sur Block, il peut ne pas prendre effet immédiatement.
Il est recommandé de s'assurer que les paramètres de blocage / non bloquant sont terminés avant d'appeler socket_connect () , ou de réévaluer la logique d'établissement de connexion.
Certains systèmes ont des traitements spéciaux sur le comportement de blocage des douilles, en particulier dans des environnements sécurisés tels que certains conteneurs restreints, les paramètres de Selinux ou les restrictions Open_Basedir, ce qui peut empêcher certains comportements de paramètres de socket. L'utilisation de socket_last_error () et de surveillance du journal peuvent aider à confirmer ces problèmes.
Si vous rencontrez des paramètres de blocage non valides lorsque vous utilisez des extensions multithread (telles que des PTHreads) ou des cadres Coroutine (tels que Swoole), il est probable que le cadre résume le modèle d'E / S sous-jacent et le natif socket_set_block () ne peut pas prendre effet. À l'heure actuelle, reportez-vous à la méthode de contrôle d'E / S fournie par le cadre.
Par exemple, il est recommandé d'utiliser $ socket-> setBlocking (true) au lieu de la fonction de socket native PHP.