PHP file_get_contents very slow when using full url

后端 未结 9 1002
我在风中等你
我在风中等你 2020-11-27 12:10

I am working with a script (that I did not create originally) that generates a pdf file from an HTML page. The problem is that it is now taking a very long time, like 1-2 mi

相关标签:
9条回答
  • 2020-11-27 12:39

    Can you try fetching that url, on the server, from the command line? curl or wget come to mind. If those retrieve the URL at a normal speed, then it's not a network problem and most likely something in the apache/php setup.

    0 讨论(0)
  • 2020-11-27 12:40

    I had the same issue,

    The only thing that worked for me is setting timeout in $options array.

    $options = array(
        'http' => array(
            'header'  => implode($headers, "\r\n"),
            'method'  => 'POST',
            'content' => '',
            'timeout' => .5
        ),
    );
    
    0 讨论(0)
  • 2020-11-27 12:40
    $context = stream_context_create(array('http' => array('header'=>'Connection: close\r\n')));
    $string = file_get_contents("http://localhost/testcall/request.php",false,$context);
    

    Time: 50976 ms (avaerage time in total 5 attempts)

    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch, CURLOPT_URL, "http://localhost/testcall/request.php");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    echo $data = curl_exec($ch);
    curl_close($ch);
    

    Time: 46679 ms (avaerage time in total 5 attempts)

    Note: request.php is used to fetch some data from mysql database.

    0 讨论(0)
  • 2020-11-27 12:41

    Sometimes, it's because the DNS is too slow on your server, try this:

    replace

    echo file_get_contents('http://www.google.com');
    

    as

    $context=stream_context_create(array('http' => array('header'=>"Host: www.google.com\r\n")));
    echo file_get_contents('http://74.125.71.103', false, $context);
    
    0 讨论(0)
  • 2020-11-27 12:42

    I would use curl() to fetch external content, as this is much quicker than the file_get_contents method. Not sure if this will solve the issue, but worth a shot.

    Also note that your servers speed will effect the time it takes to retrieve the file.

    Here is an example of usage:

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://example.com/test.txt');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch);
    curl_close($ch);
    
    0 讨论(0)
  • 2020-11-27 12:43

    What I would also consider with Curl is that you can "thread" the requests. This has helped me immensely as I do not have access to a version of PHP that allows threading at the moment .

    For example, I was getting 7 images from a remote server using file_get_contents and it was taking 2-5 seconds per request. This process alone was adding 30seconds or something to the process, while the user waited for the PDF to be generated.

    This literally reduced the time to about 1 image. Another example, I verify 36 urls in the time it took before to do one. I think you get the point. :-)

        $timeout = 30;
        $retTxfr = 1;
        $user = '';
        $pass = '';
    
        $master = curl_multi_init();
        $node_count = count($curlList);
        $keys = array("url");
    
        for ($i = 0; $i < $node_count; $i++) {
            foreach ($keys as $key) {
                if (empty($curlList[$i][$key])) continue;
                $ch[$i][$key] = curl_init($curlList[$i][$key]);
                curl_setopt($ch[$i][$key], CURLOPT_TIMEOUT, $timeout); // -- timeout after X seconds
                curl_setopt($ch[$i][$key], CURLOPT_RETURNTRANSFER, $retTxfr);
                curl_setopt($ch[$i][$key], CURLOPT_HTTPAUTH, CURLAUTH_ANY);
                curl_setopt($ch[$i][$key], CURLOPT_USERPWD, "{$user}:{$pass}");
                curl_setopt($ch[$i][$key], CURLOPT_RETURNTRANSFER, true);
                curl_multi_add_handle($master, $ch[$i][$key]);
            }
        }
    
        // -- get all requests at once, finish when done or timeout met --
        do {  curl_multi_exec($master, $running);  }
        while ($running > 0);
    

    Then check over the results:

                if ((int)curl_getinfo($ch[$i][$key], CURLINFO_HTTP_CODE) > 399 || empty($results[$i][$key])) {
                    unset($results[$i][$key]);
                } else {
                    $results[$i]["options"] = $curlList[$i]["options"];
                }
                curl_multi_remove_handle($master, $ch[$i][$key]);
                curl_close($ch[$i][$key]);
    

    then close file:

        curl_multi_close($master);
    
    0 讨论(0)
提交回复
热议问题