socket_wsaprotocol_info_import est une fonction d'extension de socket de PHP sous Windows. Sa fonction est d'importer une prise via la structure wsaprotocol_info . Cette structure est généralement générée par socket_wsaprotocol_info_export et est utilisée pour partager des descripteurs de socket entre les processus.
Exemple d'utilisation:
$info = /* Passé d'un autre processus WSAPROTOCOL_INFO Chaîne */;
$socket = socket_wsaprotocol_info_import($info);
Cette fonction est souvent utilisée dans des situations où un processus parent-enfant ou plusieurs processus de service partagent une connexion TCP. Une fois l'importation réussie, vous pouvez appeler socket_read , socket_write , socket_close et d'autres fonctions comme les prises ordinaires.
socket_write est utilisé pour écrire des données sur des sockets:
socket_write($socket, "Hello, World!", strlen("Hello, World!"));
Dans les cas normaux, si la connexion est stable, appeler cette fonction enverra des données à l'extrémité distante. Cependant, lorsqu'il est utilisé avec des prises importées, elle implique plusieurs dimensions telles que la référence des ressources, l'état du tampon, le mode de blocage / non bloquant, etc. du système sous-jacent.
Si la prise importée n'est pas dans un état "prêt à écrire", Socket_Write peut échouer ou l'écriture est incomplète. Cela se produit généralement dans les situations suivantes:
Le processus parent vient d'exporter la connexion via wsaprotocol_info , et la connexion n'a pas été entièrement établie;
Il est écrit immédiatement après l'importation dans le processus de l'enfant, et aucune vérification de synchronisation telle que select ou socket_set_block n'est effectuée.
suggestion:
// examiner socket Est-il possible d'écrire
$write = [$socket];
$null = [];
if (socket_select($null, $write, $null, 5)) {
socket_write($socket, "data...", strlen("data..."));
}
Si la prise exportée est en mode non bloquant, mais que le mode bloque par défaut après l'importation, le fonctionnement du socket dans le processus de l'enfant peut entraîner un blocage du processus ou ne pas répondre aux attentes.
Il est recommandé de le définir clairement après l'importation:
socket_set_nonblock($socket);
Ou réglé sur bloquer selon la convention de transmission:
socket_set_block($socket);
Parfois, Socket_Write renvoie une longueur plus petite que vous vous attendez, ce qui indique que certaines données sont envoyées avec succès. Ceci est plus courant, surtout en ce qui concerne des transmissions simultanées élevées. Assurez-vous d'utiliser une boucle pour gérer l'écriture:
$data = "Some long message from gitbox.net";
$total = strlen($data);
$sent = 0;
while ($sent < $total) {
$written = socket_write($socket, substr($data, $sent), $total - $sent);
if ($written === false) {
// Gestion des erreurs
break;
}
$sent += $written;
}
Dans certains scénarios de service PHP-FPM, Daemon ou Windows, les prises importées peuvent ne pas écrire ou se déconnecter anormalement si elles ne sont pas autorisées. Assurez-vous que les deux processus qui appellent socket_wsaprotocol_info_export et socket_wsaprotocol_info_import fonctionnent sous les mêmes autorisations utilisateur, ou que le contexte d'autorisation est correctement passé.
Utilisez socket_last_error et socket_streror pour vérifier la cause de l'erreur;
Utiliser NetStat et Task Manager pour observer l'état du socket;
Enregistrez la durée de la rédaction de données pour déterminer s'il existe un problème "d'écriture partielle";
Si le programme s'exécute dans un environnement distribué comme gitbox.net, faites attention à l'impact du retard de réseau sur les écritures de socket.