2009-12-29 18 views
9

Wszystko,CURL z PHP - bardzo powolny

Muszę poprosić o adres URL, który zwraca żądanie JSON. Używam PHP i CURL, aby to zrobić. Obecnie zajmuje około 3-4 sekund na żądanie i odpowiedź.

Poniżej znajduje się kod curl

$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); 
    } 

Poniżej znajduje się tablica 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 
) 

Jak mogę przyspieszyć czas przetwarzania CURL?

Dzięki

+0

Ile czasu zajmuje wizyta '$ desturl' w przeglądarce? Jeśli to zajmie 3-4 sekundy, nie sądzę, że winę ponosi cURL. –

+0

To naprawdę dość szybko, jeśli odwiedzam URL jawnie. Mniej niż 2 sekundy – Jake

+0

Dowiedziałem się również, że ustawienie CURLOPT_TIMEOUT zmusza cURL do użycia tego czasu, lepiej nie ustawiać tej stałej i pozwolić cURL zwijać –

Odpowiedz

4

wygląda większość czasu czeka na serwer do reagowania (starttransfer_time - pretransfer_time = 1.620026) ... może serwer jest jakiejś bazy danych lub innych operacji, które ma czas?

+1

w jakikolwiek sposób, aby zredukować namelookup_time? – Jake

+0

użyj ip zamiast nazwy. – Femaref

+0

można dodać go do/etc/hosts lub podać adres IP (z nagłówkiem Host:) – jspcal

3

Miałem jakiś problem w ten sposób, używając wget było szybkie (maks. 1 sekunda), używając cURL zajęło około 5 sekund, aby uzyskać stronę, kiedy tcpdump-ing znalazłem, że cURL próbuje wykonać wyszukiwanie DNS revers , a jeśli serwer nie ma zarejestrowanego DNSa reversu, spowolni to, ustawiam odwrotny DNS na moim lokalnym serwerze DNS, więc każde żądanie do tej witryny za pomocą cURL teraz działa bardzo szybko. Nie znalazłem sposobu na wyłączenie sprawdzania DNS revers z ustawień cURL.

Moja sugestia polega na skanowaniu Twojego ruchu, aby zobaczyć, gdzie tak długo czeka.

4

Według this answer (podobny problem) Curl może być powolne, jeśli jesteś na Mac OS X i masz dostęp do swojego projektu z xxxx.local (z 127.0.0.1 myproject.local w /etc/hosts/

Jak @lepix powiedział:

to dlatego, że .local TLD jest zarezerwowana dla usługi Bonjour, a to od Mac OS X Lion (10.7).

nadzieję, że będzie on lp, dzięki lepiks.