PHP套接字,有没有加快速度的方法
我正在编写一个小脚本,以查看特定设备上的某些端口是否正在使用或处于打开状态。我的代码是:PHP套接字,有没有加快速度的方法,php,sockets,optimization,Php,Sockets,Optimization,我正在编写一个小脚本,以查看特定设备上的某些端口是否正在使用或处于打开状态。我的代码是: for($c=1;$c<=16;$c++){ echo "<tr><td>Pod " . $c . "</td>"; for ($d=5000;$d<=5010;$d++){ $tmp=fsockopen("10.0.0." . $c,$d,$erstr, $errno, 1); if($tmp){ echo "<td
for($c=1;$c<=16;$c++){
echo "<tr><td>Pod " . $c . "</td>";
for ($d=5000;$d<=5010;$d++){
$tmp=fsockopen("10.0.0." . $c,$d,$erstr, $errno, 1);
if($tmp){
echo "<td class='o'>OPEN</td>";
fclose($tmp);
}
else{
echo "<td class='u'>IN USE</td>";
}
}
ob_flush();
flush();
echo "</tr>\n";
}
echo "</table>";
显然,这需要大量的连接,目前运行大约需要10秒钟。我想知道有没有什么办法可以让这个速度快一点?谢谢你的帮助 如果给定端口未侦听/接受,则在传输过程中发送的SYN数据包重新传输将出现所有TCP超时。这是TCP的设计-我们不能改变这一点 我可以推荐的一件事是从流切换到,并尝试非阻塞连接-创建160个套接字,将它们设置为,启动所有离子,以减少超时等待它们,标记返回可读的。在循环中这样做,直到你花了,比如说,整整一秒钟。现在,您得到了一个打开的TCP主机/端口对列表,以及一个可能关闭的TCP主机/端口对列表,并且您花费了固定的时间
免责声明:我从不使用PHP进行网络连接,因此这可能完全没有用。如果给定端口未侦听/接受,则在传输过程中发送的SYN数据包重新传输将遭受所有TCP超时。这是TCP的设计-我们不能改变这一点 我可以推荐的一件事是从流切换到,并尝试非阻塞连接-创建160个套接字,将它们设置为,启动所有离子,以减少超时等待它们,标记返回可读的。在循环中这样做,直到你花了,比如说,整整一秒钟。现在,您得到了一个打开的TCP主机/端口对列表,以及一个可能关闭的TCP主机/端口对列表,并且您花费了固定的时间
免责声明:我从不使用PHP进行网络连接,因此这可能完全没有用。一种大大加快速度的方法是异步。现在,如果其中一台主机运行缓慢,它将减慢整个管道的运行速度,因为您正在一个接一个地运行。PHP实际上没有基于事件的AIO选择,甚至没有线程。但是,它在linux环境中确实有fork。下面的示例尚未经过测试,但它是如何在php中执行异步IO的一般概念:
<?php
$childrenArr = array();
$childrenLeft = array();
for($c=1;$c<=16;$c++){
for ($d=5000;$d<=5010;$d++){
$pid = pcntl_fork();
if ($pid == -1) {
die("Could not fork");
} else if ($pid) {
$childrenArr[$pid] = array($c, $d);
$childrenLeft[$pid] = 1;
} else {
$tmp=fsockopen("10.0.0." . $c,$d,$erstr, $errno, 1);
exit(($tmp) ? 1 : 0);
}
}
}
$results = array();
while (count($childrenLeft) > 0) {
$oldPid = pcntl_waitpid(-1, $status, WNOHANG);
if (pcntl_wifexited($status )) {
unset($childrenLeft[$oldPid]);
list($c, $d) = $childrenArr[$oldPid];
$results[$c . "_" . $d] = pcntl_wexitstatus($status);
}
usleep(100);
}
for($c=1;$c<=16;$c++){
echo "<tr><td>Pod " . $c . "</td>";
for ($d=5000;$d<=5010;$d++){
if ($results[$c . "_" . $d]) {
echo "<td class='o'>OPEN</td>";
}
else {
echo "<td class='u'>IN USE</td>";
}
}
ob_flush();
flush();
echo "</tr>\n";
}
echo "</table>";
一种大大加快速度的方法是异步。现在,如果其中一台主机运行缓慢,它将减慢整个管道的运行速度,因为您正在一个接一个地运行。PHP实际上没有基于事件的AIO选择,甚至没有线程。但是,它在linux环境中确实有fork。下面的示例尚未经过测试,但它是如何在php中执行异步IO的一般概念:
<?php
$childrenArr = array();
$childrenLeft = array();
for($c=1;$c<=16;$c++){
for ($d=5000;$d<=5010;$d++){
$pid = pcntl_fork();
if ($pid == -1) {
die("Could not fork");
} else if ($pid) {
$childrenArr[$pid] = array($c, $d);
$childrenLeft[$pid] = 1;
} else {
$tmp=fsockopen("10.0.0." . $c,$d,$erstr, $errno, 1);
exit(($tmp) ? 1 : 0);
}
}
}
$results = array();
while (count($childrenLeft) > 0) {
$oldPid = pcntl_waitpid(-1, $status, WNOHANG);
if (pcntl_wifexited($status )) {
unset($childrenLeft[$oldPid]);
list($c, $d) = $childrenArr[$oldPid];
$results[$c . "_" . $d] = pcntl_wexitstatus($status);
}
usleep(100);
}
for($c=1;$c<=16;$c++){
echo "<tr><td>Pod " . $c . "</td>";
for ($d=5000;$d<=5010;$d++){
if ($results[$c . "_" . $d]) {
echo "<td class='o'>OPEN</td>";
}
else {
echo "<td class='u'>IN USE</td>";
}
}
ob_flush();
flush();
echo "</tr>\n";
}
echo "</table>";
你在linux环境中吗?是的,我在linux环境中。你在linux环境中吗?是的,我在linux环境中。这运行得更快!我发现了几个问题,我将尝试解决这些问题——首先,在浏览器中运行PHP不会提供正在使用或打开的数据,但在CLI中运行会提供这些数据。现在我只是将输出重定向到一个HTML文件并运行它,没什么大不了的。谢谢你的大本营!这跑得快多了!我发现了几个问题,我将尝试解决这些问题——首先,在浏览器中运行PHP不会提供正在使用或打开的数据,但在CLI中运行会提供这些数据。现在我只是将输出重定向到一个HTML文件并运行它,没什么大不了的。谢谢你的大本营!这看起来是另一种节省时间的方法,所以我将尝试用上面Mike发布的代码实现这些想法。谢谢你们两位!这看起来是另一种节省时间的方法,所以我将尝试用上面Mike发布的代码实现这些想法。谢谢你们两位!