php fsockopen解决方法
php fsockopen解决办法
最近研究php多线程的问题,发现中文资源少的可怜,仅有的几篇文章被转了又转,但文中内容价值有限。搜索过程中发现国外很多网站引用的一篇文章写的不错,所以翻译过来。
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://blog.iyi.cn/start/
问题:
有没有办法在php中实现多线程呢?
假设你正在写一个基于多台服务器的php应用,理想的情况时同时向多台服务器发送请求,而不是一台接一台。
可以实现吗?
回答:
当有人想要实现并发功能时,他们通常会想到用fork或者spawn threads,但是当他们发现php不支持多线程的时候,大概会转换思路去用一些不够好的语言,比如perl。
其实的是大多数情况下,你大可不必使用fork或者线程,并且你会得到比用fork或thread更好的性能。
假设你要建立一个服务来检查正在运行的n台服务器,以确定他们还在正常运转。你可能会写下面这样的代码:
?
<?php $hosts = array("host1.sample.com", "host2.sample.com", "host3.sample.com"); $timeout = 15; $status = array(); foreach ($hosts as $host) { ??? $errno = 0; ??? $errstr = ""; ??? $s = fsockopen($host, 80, $errno, $errstr, $timeout); ??? if ($s) { ??????? $status[$host] = "Connectedn"; ??????? fwrite($s, "HEAD / HTTP/1.0rnHost: $hostrnrn"); ??????? do { ??????????? $data = fread($s, 8192); ??????????? if (strlen($data) == 0) { break; }? ? ? ? ? ? $status[$host] .= $data; ??????? } while (true); fclose($s); ??? } else { ??????? $status[$host] = "Connection failed: $errno $errstrn"; ??? } } print_r($status); ?>
它运行的很好,但是在fsockopen()分析完hostname并且建立一个成功的连接(或者延时$timeout秒)之前,扩充这段代码来管理大量服务器将耗费很长时间。
因此我们必须放弃这段代码;我们可以建立异步连接-不需要等待fsockopen返回连接状态。PHP仍然需要解析hostname(所以直接使用ip更加明智),不过将在打开一个连接之后立刻返回,继而我们就可以连接下一台服务器。
有两种方法可以实现;PHP5中可以使用新增的stream_socket_client()函数直接替换掉fsocketopen()。PHP5之前的版本,你需要自己动手,用sockets扩展解决问题。
下面是PHP5中的解决方法:
<?php $hosts = array("host1.sample.com", "host2.sample.com", "host3.sample.com"); $timeout = 15; $status = array(); $sockets = array(); foreach ($hosts as $id => $host) { ??? $s = stream_socket_client("$host:80", $errno, $errstr, $timeout,STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT); ??? if ($s) { ??????? $sockets[$id] = $s; ??????? $status[$id] = "in progress"; ??? } else { ??????? $status[$id] = "failed, $errno $errstr"; ??? } } while (count($sockets)) { ??? $read = $write = $sockets; ??? $n = stream_select($read, $write, $e = null, $timeout); ??? if ($n > 0) { ??????? foreach ($read as $r) { ??????????? $id = array_search($r, $sockets); ??????????? $data = fread($r, 8192); ??????????? if (strlen($data) == 0) { ??????????????? if ($status[$id] == "in progress") { ??????????????????? $status[$id] = "failed to connect"; ??????????????? }??????????? ??????????????? fclose($r); ??????????????? unset($sockets[$id]); ??????????? } else { ??????????????? $status[$id] .= $data; ??????????? } ??????? } ??????? foreach ($write as $w) { ??????????? $id = array_search($w, $sockets); ??????????? fwrite($w, "HEAD / HTTP/1.0rnHost: " . $hosts[$id] . "rnrn"); ??????????? $status[$id] = "waiting for response"; ??????? } ??? } else { ??????? foreach ($sockets as $id => $s) { ??????????? $status[$id] = "timed out " . $status[$id]; ??????? } ??????? break; ??? } } foreach ($hosts as $id => $host) { ??? echo "Host: $hostn"; echo "Status: " . $status[$id] . "nn"; } ?>
我们用stream_select()等待sockets打开的连接事件。stream_select()调用系统的select(2)函数来工作:前面三个参数是你要使用的streams的数组;你可以对其读取,写入和获取异常(分别针对三个参数)。stream_select()可以通过设置$timeout(秒)参数来等待事件发生-事件发生时,相应的sockets数据将写入你传入的参数。
下面是PHP4.1.0之后版本的实现,如果你已经在编译PHP时包含了sockets(ext/sockets)支持,你可以使用根上面类似的代码,只是需要将上面的streams/filesystem函数的功能用ext/sockets函数实现。主要的不同在于我们用下面的函数代替 stream_socket_client()来建立连接:
<?php // This value is correct for Linux, other systems have other values define('EINPROGRESS', 115); function non_blocking_connect($host, $port, &$errno, &$errstr, $timeout) { ??? $ip = gethostbyname($host); ??? $s = socket_create(AF_INET, SOCK_STREAM, 0); ??? if (socket_set_nonblock($s)) { ??????? $r = @socket_connect($s, $ip, $port); ??????? if ($r || socket_last_error() == EINPROGRESS) { ??????????? $errno = EINPROGRESS; return $s; ??????? } ??? } ??? $errno = socket_last_error($s); ??? $errstr = socket_strerror($errno); ??? socket_close($s); ??? return false; } ?>
现在用socket_select()替换掉stream_select(),用socket_read()替换掉fread(),用 socket_write()替换掉fwrite(),用socket_close()替换掉fclose()就可以执行脚本了!
PHP5的先进之处在于,你可以用stream_select()处理几乎所有的stream-例如你可以通过include STDIN用它接收键盘输入并保存进数组,你还可以接收通过proc_open()打开的管道中的数据。
如果你想让PHP4.3.x自身拥有处理streams的功能,我已经为你准备了一个让fsockopen可以异步工作的patch。不赞成使用该补丁,该补丁不会出现在官方发布的PHP版本中,我在补丁中附带了stream_socket_client()函数的实现,通过它,你可以让你的脚本兼容 PHP5。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Récemment, de nombreux utilisateurs de Win11 ont signalé que lors de l'arrêt, ils sont invités à indiquer que l'hôte de la tâche taskhostwindow exécute la tâche d'arrêt. Alors, que se passe-t-il ? Les utilisateurs peuvent accéder au dossier Bureau sous l'éditeur de registre local, puis sélectionner AutoEndTasks dans la fenêtre de droite pour le définir. Laissez ce site présenter soigneusement aux utilisateurs la solution à ce problème lors de la fermeture. L'arrêt de Windows 11 indique que l'hôte de la tâche taskhostwindow exécute la tâche d'arrêt. Solution 1. Utilisez la combinaison de touches win key + r key, entrez « regedit » et appuyez sur Entrée, comme indiqué dans la figure ci-dessous. 2. Recherchez [HKEY

Lorsque nous lançons le Gestionnaire des tâches pour terminer une tâche ou arrêter une application, nous trouvons généralement un grand nombre de processus en cours d'exécution. C'est tout à fait normal. Cependant, nous voyons parfois des programmes qui utilisent des ressources système dont nous ignorons complètement l’existence. L'un de ces processus est l'agrégateur host.exe, qui a récemment semé une certaine confusion parmi les utilisateurs. Certains de ces processus peuvent être des exigences légitimes de Windows, mais d'autres peuvent être des programmes malveillants s'exécutant en arrière-plan et causant des problèmes à l'insu ou sans le consentement de l'utilisateur. Après avoir vu les cinq façons de lancer le Gestionnaire des tâches dans Windows 11, nous vous montrerons comment vérifier si l'agrégateur host.exe est sûr ou s'il s'agit d'un virus. continuez

Les solutions « pas de route vers l'hôte » incluent la vérification de la connexion réseau, la vérification de l'adresse IP et du port, la vérification de la configuration du pare-feu, la vérification de la configuration du routage, la vérification de la configuration du périphérique réseau, la vérification de l'état du service réseau, la vérification de la configuration réseau et la prise de contact. l'administrateur du réseau. Introduction détaillée : 1. Vérifiez la connexion réseau pour vous assurer que la connexion réseau entre le client et l'hôte cible est normale. Vous pouvez essayer de tester la connectivité réseau via la commande ping ou d'autres outils réseau, et vérifier si les périphériques matériels tels que les câbles réseau. , les réseaux sans fil et les routeurs fonctionnent correctement. Assurez-vous que la connexion réseau est stable, etc.

Les différences entre le maître et l'hôte sont les suivantes : 1. L'hôte peut jouer le rôle de client ou de serveur, tandis que le maître est le serveur central chargé de coordonner et de gérer les autres serveurs esclaves dans un système distribué. 2. L'hôte est un périphérique informatique ordinaire et le maître ; a généralement une puissance de traitement plus élevée et les ressources sont utilisées pour traiter et distribuer les tâches, gérer les données et maintenir la stabilité de l'ensemble du système 3. L'hôte est un nœud du réseau et le maître est le serveur qui joue un rôle central dans le système distribué.

Le processus WMIProviderHost joue un rôle essentiel dans Windows 11. Il permet à d'autres applications de demander des informations sur votre ordinateur. Les processus liés à WMIProviderHost s’exécutent généralement en arrière-plan ; ils ne consomment donc généralement pas de grandes quantités de ressources système. Cependant, il a été signalé que le service utilise parfois plus de 50 % de la puissance du processeur à cause d'autres applications. Il est inquiétant de faire fonctionner le processeur de votre ordinateur à sa capacité presque maximale pendant une période prolongée, car cela peut entraîner une surchauffe et endommager les composants du système. Dans le didacticiel d'aujourd'hui, nous verrons pourquoi WMIProviderHost fonctionne en C sous Windows 11

1. Programmation de socket basée sur le protocole TCP 1. Le flux de travail du socket commence par le côté serveur. Le serveur initialise d'abord le Socket, puis se lie au port, écoute le port, appelle accepter pour bloquer et attend que le client se connecte. A ce moment, si un client initialise un Socket puis se connecte au serveur (connect), si la connexion réussit, la connexion entre le client et le serveur est établie. Le client envoie une demande de données, le serveur reçoit la demande et traite la demande, puis envoie les données de réponse au client, le client lit les données et ferme enfin la connexion. Utilisez le code Python suivant pour l'implémenter. : importations

La première étape du côté de SpringBoot consiste à introduire les dépendances. Nous devons d'abord introduire les dépendances requises pour WebSocket, ainsi que les dépendances pour le traitement du format de sortie com.alibabafastjson1.2.73org.springframework.bootspring-boot-starter-websocket. La deuxième étape consiste à créer la classe de configuration WebSocket importorg springframework.context.annotation.Bean;importorg.springframework.context.annotation.Config.

Cet article vous apporte des connaissances pertinentes sur php+socket, qui présente principalement le multiplexage IO et comment php+socket implémente le serveur Web ? Les amis intéressés peuvent jeter un œil ci-dessous. J'espère que cela sera utile à tout le monde.
