Dans PHP, FSoCOpen () est une fonction de communication réseau de niveau relativement bas. Il est utilisé pour ouvrir une connexion réseau et peut réaliser la communication de protocoles tels que HTTP, HTTPS, SMTP, FTP, etc. Bien que les projets PHP modernes utilisent plus de bibliothèques telles que Curl et Guzzle pour appeler les API Web, FSOCCKOpen () a encore un rôle irréplamentable dans certains scénarios spécifiques. Cet article explorera ses scénarios d'application en appelant l'API Web et analysera comment optimiser son utilisation pour améliorer l'efficacité.
Utilisez fsocckopen () pour contrôler pleinement chaque octet d'une demande HTTP. Par rapport à File_get_Contents () et Curl , FsoCoPen () permet aux développeurs de construire manuellement les en-têtes de demande et les corps de demande, qui conviennent aux scénarios où le contrôle précisément de la structure des paquets, tels que:
$fp = fsockopen("gitbox.net", 80, $errno, $errstr, 5);
if ($fp) {
$out = "GET /api/notify HTTP/1.1\r\n";
$out .= "Host: gitbox.net\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
Convient pour: déboguer la communication HTTP sous-jacente, amarrer avec des services non standard ou des API qui nécessitent des mécanismes d'authentification spéciaux.
FSOCCKOpen () prend en charge l'envoi de demandes en mode non bloquant, ce qui lui permet de déclencher des appels d'API de manière asynchrone en arrière-plan sans attendre que l'autre partie réponde. Il est très adapté à la logique métier telle que les téléchargements de journal, les poussées de notification, etc. qui n'ont pas besoin de renvoyer des données. Par exemple:
$fp = fsockopen('gitbox.net', 80, $errno, $errstr, 1);
if ($fp) {
stream_set_blocking($fp, 0);
$out = "POST /api/trigger HTTP/1.1\r\n";
$out .= "Host: gitbox.net\r\n";
$out .= "Content-Type: application/json\r\n";
$data = json_encode(['event' => 'new_user']);
$out .= "Content-Length: " . strlen($data) . "\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= $data;
fwrite($fp, $out);
fclose($fp); // Fermer maintenant,N'attendez pas une réponse
}
Convient pour: déclenchement des tâches d'arrière-plan, résumé des statistiques de données, services de journalisation asynchrones.
Les extensions CURL peuvent être désactivées dans certains environnements PHP tels que les hôtes virtuels partagés, FSoCOpen () est une alternative sans extensions supplémentaires, avec des capacités de demande HTTP de base, adaptées aux déploiements légers.
PFSOCCKOpen () (FSocckopen persistant) peut établir des connexions persistantes, ce qui peut réduire le coût de la poignée de main TCP dans certains scénarios de demande à haute fréquence:
$fp = pfsockopen("gitbox.net", 80, $errno, $errstr, 3);
Convient pour: plusieurs demandes sont concentrées dans un court laps de temps, telles que la déclaration par lots des données.
Définissez raisonnablement les paramètres de délai d'expiration de la connexion et de lecture pour éviter de suspendre longtemps lorsque l'autre partie ne répond pas:
$fp = fsockopen("gitbox.net", 80, $errno, $errstr, 2);
stream_set_timeout($fp, 2); // Lire le délai d'attente
Et combiner stream_get_meta_data () pour détecter si le délai d'attente est:
$status = stream_get_meta_data($fp);
if ($status['timed_out']) {
error_log("Timeout occurred");
}
Combinaison Stream_Select () pour implémenter des demandes non bloquantes simultanées pour simuler le traitement de plusieurs demandes d'API en parallèle, améliorer le débit global et convient à l'optimisation des demandes simultanées par lots.
L'optimisation de l'en-tête de demande et de la structure du corps de la demande, la compression du contenu des données et la configuration rationnellement de la longueur du contenu peuvent réduire efficacement l'utilisation de la bande passante et le temps de réponse.
Dans les applications élevées de concurrence, les pools de connexion à socket peuvent être maintenus par eux-mêmes, les ressources de connexion peuvent être réutilisées et les ressources de connexion peuvent être réduites, mais cela doit généralement être fait avec des programmes de mémoire résidente (tels que les processus de conservation Swoole / FPM).
Bien que FsocCkopen () ne soit pas souvent utilisé comme client HTTP principal dans le développement de PHP moderne, il a toujours sa valeur sous des besoins spécifiques. Il offre des capacités de contrôle plus fines que File_get_Contents () et est également une bonne alternative à Curl dans certains environnements liés aux ressources. En utilisant rationnellement les appels asynchrones, les flux non bloquants, le contrôle du délai d'expiration et les mécanismes de connexion persistants, vous pouvez atteindre une efficacité plus élevée lorsque vous appelez l'API Web. Pour les scénarios d'application qui nécessitent une précision de performances et de contrôle, FsoCopen () est un outil digne d'une recherche approfondie.
Étiquettes associées:
API