2009-12-29 2 views
9

Все,CURL с PHP - очень медленно

Я должен запросить URL-адрес, который возвращает запрос JSON. Я использую PHP и CURL для этого. В настоящее время для запроса и ответа требуется около 3-4 секунд.

Ниже приводится код завиток

$ch = curl_init(); 
    $devnull = fopen('/tmp/curlcookie.txt', 'w'); 

    curl_setopt($ch, CURLOPT_STDERR, $devnull); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_URL, $desturl); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
    curl_setopt($ch, CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT,1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); 

    $ret = curl_exec($ch); 

    curl_close($ch); 

    if ($devnull) 
    { 
     fclose($devnull); 
    } 

Ниже массив CURL_GETINFO

Array 
(
    [url] => https://xx.xx.xxx.xx/portalsite/tester 
    [content_type] => application/json 
    [http_code] => 200 
    [header_size] => 198 
    [request_size] => 835 
    [filetime] => -1 
    [ssl_verify_result] => 20 
    [redirect_count] => 0 
    [total_time] => 2.054561 
    [namelookup_time] => 6.5E-5 
    [connect_time] => 0.016048 
    [pretransfer_time] => 0.123947 
    [size_upload] => 699 
    [size_download] => 46735 
    [speed_download] => 22746 
    [speed_upload] => 340 
    [download_content_length] => 0 
    [upload_content_length] => 0 
    [starttransfer_time] => 1.743973 
    [redirect_time] => 0 
) 

Как я могу ускорить время обработки CURL?

Благодаря

+0

Сколько времени потребуется, если вы посетили '$ desturl' с вашим браузером? Если это также занимает 3-4 секунды, я не думаю, что cURL виноват. –

+0

Это действительно довольно быстро, если я явно просматриваю URL. Менее 2 секунд – Jake

+0

Я также выяснил, что настройка CURLOPT_TIMEOUT заставляет cURL использовать указанное время, лучше не устанавливать эту константу и позволить cURL curl –

ответ

4

это выглядит как большая часть времени ждет ответа сервера (starttransfer_time - pretransfer_time = 1.620026) ... возможно, сервер делает некоторые базы данных или другую операцию, которая занимает много времени?

+1

каким-либо образом уменьшить namelookup_time? – Jake

+0

используйте ip вместо имени. – Femaref

+0

вы можете добавить его в/etc/hosts или указать IP-адрес (с заголовком Host:). – jspcal

3

У меня возникла такая проблема: wget был быстрым (максимум 1 секунда), используя cURL, потребовалось около 5 секунд, чтобы получить страницу, когда tcpdump-ing я обнаружил, что cURL пытается сделать обратный поиск DNS , и если у сервера нет реестра DNS, зарегистрированного, это замедлит вас, я настроил обратный DNS на моем локальном DNS-сервере, поэтому каждый запрос на этот сайт с использованием cURL теперь идет очень быстро. Я не нашел способ отключить поиск в DNS из настроек cURL.

Мое предложение - отсканировать свой трафик, чтобы увидеть, где он так долго ждет.

4

Согласно this answer (аналогичной проблеме) скручивание может быть медленным, если вы находитесь на Mac OS X и вы получаете доступ к вашему проекту с xxxx.local127.0.0.1 myproject.local в вашем /etc/hosts/

Как @lepix сказал:

это происходит потому, что .local TLD зарезервирован для службы Bonjour, и это поскольку Mac OS X Lion (10,7).

Надеется, что это он lp, благодаря lepix.

Смежные вопросы