Является ли fsockopen медленным? - PullRequest
3 голосов
/ 23 января 2012

Я пытаюсь выполнить тест скорости передачи данных в PHP. Я не знаю, почему wget загружает данные объемом 1 Мбайт на скорости 400 Мбит / с, а fsockopen - на 170 Мбит / с. Я использую fsockopen, так как он поддерживается на всех серверах.

Кто-нибудь знает почему? 400 Мбит / с против 170 Мбит / с - это большая разница.

Есть ли лучший вариант для производительности?

<?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 />';

?>

Ответы [ 2 ]

4 голосов
/ 23 января 2012

Это не fsockopen, это медленно - это вообще PHP. Попробуйте увеличить размер буфера в ваших вызовах fgets() и используйте регулярное выражение, чтобы найти конец заголовков. С вашим текущим кодом вы выполняете цикл чтения слишком много раз, и сетевой ввод-вывод больше не является вашим узким местом.

0 голосов
/ 23 января 2012

Было бы намного проще (и, вероятно, быстрее) использовать file_get_contents () для этого.

...