Warum funktioniert fsockopen Performance-Probleme haben und nicht fopen wenn eine POST-Anforderung in PHP zu senden?

StackOverflow https://stackoverflow.com/questions/1930074

Frage

Ich habe zwei verschiedene Implementierungen versucht, zur Simulation eines Formulars Posting. Man verwendet fsockopen (Beispiel hier: http://www.faqts.com/knowledge_base /view.phtml/aid/7962 ) und die anderen Verwendungen fopen (Beispiel hier: http://netevil.org/blog/2006/nov/http-post-from-php-without-curl ).

Ich lief in einige ernsthafte Performance-Probleme mit fsockopen - wenn ich durch sie mit einem Debugger Schritt, scheint alles gut funktionieren, aber wenn ich nicht legen den Debugger die Seite dauert eine laaange Zeit Last (wahrscheinlich mehr als 10 Sekunden). fopen funktioniert perfekt (plus Ich habe die Antwort-Header nicht analysieren out). Weiß jemand, warum fsockopen diese Performance-Probleme haben würde? Hat es mit der Timeout-Einstellung zu tun?

Ich habe unter meinen Code enthalten.


//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;
        }
    }
}


/**
 * 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);
        }
    }
}

War es hilfreich?

Lösung

HTTP 1.1-Verbindungen zu persistenten Standard. Das heißt, die Verbindung erhält nicht automatisch geschlossen und feof() kehrt nicht wahr, bis die Anforderung mal aus. Um dies zu umgehen senden und die Connection: close Header oder Verwendung HTTP 1.0, die keine persistenten Verbindungen unterstützt.

Andere Tipps

  

Wer weiß, warum fsockopen würde   haben diese Performance-Probleme? Does   es muss mit dem Timeout tun   Einstellung?

Ich habe in der Vergangenheit Probleme hatten, mit über ssl fsockopen -. Aber das ist nicht das, was Ihr fragen

Haben Sie versucht, die CURL_ * Familie von Funktionen statt, das helfen könnte?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top