php - fsockopen 通常很慢吗?

标签 php performance bandwidth fsockopen

我正在尝试在 PHP 中执行下行带宽速度测试。我不知道为什么 wget 会以 400 Mbps 的速度下载 1 MB 的数据,而 fsockopen 会以 170 Mbps 的速度下载。我正在使用 fsockopen,因为所有服务器都支持它。

有人知道为什么吗? 400 Mbps 与 170 Mbps 差别很大。

是否有更好的性能选择?

<?php
      $url = 'http://ftp.sunet.se/pub/Linux/distributions/ubuntu/ubuntu/dists/hardy-backports/Contents-i386.gz';
      $size = 1024*1024; // Get amount of bytes

      $parts = parse_url($url);
      $fp = fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80, $errno, $errstr, 30);

      if (!$fp) throw new Exception("Problem with $url, $errstr");

      $out = "GET " . $parts['path'] ." HTTP/1.1\r\n"
           . "Host: ". $parts['host'] ."\r\n"
           . "Connection: Close\r\n\r\n";

      fwrite($fp, $out);

      $found_body = false;
      $response = '';
      $start = microtime(true);
      $timeout = 30;

      while (!feof($fp)) {
        if ((microtime(true) - $start) > $timeout) break;
        if (strlen($response) > $size) break;
        //$row = fgets($fp, 128); // Grab block of 128
        $row = fgets($fp);
        if ($found_body) {
          $response .= $row;
        } else if ($row == "\r\n") {
          $found_body = true;
          $tsStart = microtime(true);
          continue;
        }
      }

      $time_elapsed = microtime(true) - $tsStart;

      $speed = strlen($response) / $time_elapsed * 8 / 1000000;

      echo round($speed, 2) . ' Mbps ('. strlen($response) .' bytes in '. round($time_elapsed, 3) .' s)<br />';

?>

最佳答案

慢的不是 fsockopen - 通常是 PHP。尝试增加 fgets() 调用中的缓冲区大小,并使用正则表达式查找 header 的末尾。使用您当前的代码,您执行读取循环的次数过多,网络 IO 不再是您的瓶颈。

关于php - fsockopen 通常很慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8974404/

相关文章:

php - 我从 iOS 和 Postman 使用 PHP 上传文件时遇到部分文件上传错误

php - SQL 条件 UNION() 与 Yii 查询生成器

php - 根据从 MYSQL 返回的查询值选中复选框

.net - 关于GetHashCode实现的问题

nginx - 使用 Amazon S3 限制 Nginx 的带宽

javascript - 将EventListener添加到多个复选框

performance - OpenCV 中就地 RGB->BGR 颜色转换较慢

javascript - Nodejs,客户端并不总是收到服务器消息

java - 如何测量互联网带宽

Java NIO 从一个套接字读取并写入另一个套接字的固有缺陷?