title: Why does fsockopen have performance problems and not fopen when sending a POST request in PHP?
body: <p>I have tried two different implementations for simulating POSTing a form.  One uses <code>fsockopen</code> (example here: <a href="http://www.faqts.com/knowledge_base/view.phtml/aid/7962" rel="nofollow noreferrer">http://www.faqts.com/knowledge_base/view.phtml/aid/7962</a>) and the other uses <code>fopen</code> (example here: <a href="http://netevil.org/blog/2006/nov/http-post-from-php-without-curl" rel="nofollow noreferrer">http://netevil.org/blog/2006/nov/http-post-from-php-without-curl</a>).</p>
  
  <p>I ran into some serious performance problems with <code>fsockopen</code> - when I step through it with a debugger, everything seems to work just fine, but when I do not attach the debugger the page takes a looong time to load (probably more than 10 seconds).  <code>fopen</code> works perfectly (plus I don't have to parse out the response headers).  Does anyone know why <code>fsockopen</code> would have these performance problems?  Does it have to do with the timeout setting?</p>
  
  <p>I've included my code below.</p>
  
  <pre>
  <code>
  //fsockopen implementation
  /**
   * The class that posts form data to a specified URL.
   * @package Core
   * @subpackage Classes
   */
  class SU_form_poster_class
  {
      /**
       * The file handle which is created when a form is posted.
       * @var resource
       */
      protected $file_handle;
  
      protected $port;
  
      protected $timeout;
  
  
      /**
       * Creates a new instance of this class.
       * @param int $timeout the timeout (in seconds) to wait for the request
       * @param int $port the port to make the request on
       */
      public function __construct($timeout = 30, $port = 80)
      {
          $this->timeout = $timeout;
          $this->port = $port;
      }
  
      /**
       * Sends a POST request to a specified page on a specified host with the
       * specified data.
       * @param string $path the part of the URL that specifies the page (including
       * the query string)
       * @param string $host the host part of the URL to post to
       * @param string $request_data the data to be posted in "query string" format,
       * e.g. name1=value1&name2=value2&name3=value3
       */
      public function do_post($path, $host, $request_data)
      {
          $err_num = 0;
          $err_str = '';
          $this->file_handle = fsockopen($host, $this->port, $err_num, $err_str, $this->timeout);
          if (!$this->file_handle)
          {
              throw new RuntimeException($err_str, $err_num);
          }
          else
          {
              $request = 'POST '.$path." HTTP/1.1\r\n".
                  'Host: '.$host."\r\n".
                  "Content-type: application/x-www-form-urlencoded\r\n".
                  'Content-length: '.strlen($request_data)."\r\n\r\n".
                  $request_data;
  
              fputs($this->file_handle, $request);
          }
      }
  
      /**
       * Retrieves data from the most recent request.
       * @return string the response
       */
      public function get_last_response()
      {
          if (!$this->file_handle)
          {
              throw new RuntimeException('A valid request must be made first.');
          }
          else
          {
              $response = '';
              $linenum = 0;
              while (!feof($this->file_handle))
              {
                  $line = fgets($this->file_handle, 1024);
                  if ($linenum > 6)
                  {
                      $response .= $line;
                  }
                  ++$linenum;
              }
              fclose($this->file_handle);
              return $response;
          }
      }
  }
  </code>
  </pre>
  
  <pre>
  <code>
  /**
   * The class that posts form data to a specified URL.
   * @package Core
   * @subpackage Classes
   */
  class SU_form_poster_class
  {
      /**
       * The file handle which is created when a form is posted.
       * @var resource
       */
      protected $stream;
  
      /**
       * Sends a POST request to a specified page on a specified host with the
       * specified data.
       * @param string $url
       * @param string $request_data the data to be posted in "query string" format,
       * e.g. name1=value1&name2=value2&name3=value3
       */
      public function do_post($url, $request_data)
      {
          $params = array(
              'http' => array(
                  'method' => 'POST', 'content' => $request_data
              )
          );
  
          $context = stream_context_create($params);
          $this->stream = fopen($url, 'rb', false, $context);
          if (!$this->stream)
          {
              throw new RuntimeException('Stream was not created correctly');
          }
      }
  
      /**
       * Retrieves data from the most recent request.
       * @return string the response
       */
      public function get_last_response()
      {
          if (!$this->stream)
          {
              throw new RuntimeException('A valid request must be made first.');
          }
          else
          {
              return stream_get_contents($this->stream);
          }
      }
  }
  </code>
  </pre>