Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP套接字,有没有加快速度的方法_Php_Sockets_Optimization - Fatal编程技术网

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发布的代码实现这些想法。谢谢你们两位!