2013-12-06 2 views
0

Добрый день!cURL slow starttransfer_time

cURL действует очень медленно при запросе страницы. Я знаю, что его не запрашивала страница, потому что страница возвращается в браузере мгновенно.

2 вещи, которые я заметил

  • starttransfer_time регулярно почти 20
  • local_port, кажется, изменяется каждый раз. Это нормально?
  • Иногда, локон будет реагировать мгновенно

У меня есть следующий код:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POST, false); 
$output = curl_exec($ch); 
curl_close($ch); 

Вторя curl_getinfo() дает мне следующее

[url] => http://127.0.0.1:80/wpengine/?json=t 
[content_type] => text/html; charset=iso-8859-1 
[http_code] => 302 
[header_size] => 215 
[request_size] => 64 
[filetime] => -1 
[ssl_verify_result] => 0 
[redirect_count] => 0 
[total_time] => 17.238 
[namelookup_time] => 0 
[connect_time] => 0 
[pretransfer_time] => 0 
[size_upload] => 0 
[size_download] => 221 
[speed_download] => 12 
[speed_upload] => 0 
[download_content_length] => 221 
[upload_content_length] => 0 
[starttransfer_time] => 17.238 
[redirect_time] => 0 
[certinfo] => Array 
    (
    ) 

[primary_ip] => 127.0.0.1 
[primary_port] => 80 
[local_ip] => 127.0.0.1 
[local_port] => 51875 
[redirect_url] => 

Может кто-нибудь дать мне некоторые указатели на как выяснить, что происходит?

Вот несколько строк из журнала доступа Apache

127.0.0.1 - - [06/Dec/2013:12:01:22 -0500] "GET /wpengine/?json=t HTTP/1.1" 302 221 
127.0.0.1 - - [06/Dec/2013:12:01:12 -0500] "GET /community HTTP/1.1" 200 6266 
127.0.0.1 - - [06/Dec/2013:12:01:22 -0500] "GET /public/js/jquery.js?b=10 HTTP/1.1" 304 - 
+1

Если вы используете это на местном уровне, на каком сервере вы создали? Можете ли вы проверить журналы сервера? – brandonscript

+0

@ r3mus Я запускаю Wamp с Apache. Я отредактировал свое сообщение, чтобы включить несколько строк из журнала доступа. – Ben

+1

Любопытно, может ли CURL сначала попробовать IPv6 и не решить проблему? Попробуйте добавить 'curl_setopt ($ ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);' – brandonscript

ответ

3

я нашел подобный вопрос при ударе Google Analytics' MP API ... время starttransfer последовательно 1,0 секунды плюс небольшое количество, из которого я делаю вывод, что есть где-то 1 секунда, я угадываю в cURL. Он не использует процессор на моем конце, и я как-то сомневаюсь, что Google ставит в задержке ... otuput от curl_getinfo() ...

 
Array 
(
    [url] => http://www.google-analytics.com/collect 
    [content_type] => image/gif 
    [http_code] => 200 
    [header_size] => 388 
    [request_size] => 201 
    [filetime] => -1 
    [ssl_verify_result] => 0 
    [redirect_count] => 0 
    [total_time] => 1.021528 
    [namelookup_time] => 8.7E-5 
    [connect_time] => 8.8E-5 
    [pretransfer_time] => 0.000324 
    [size_upload] => 1736 
    [size_download] => 35 
    [speed_download] => 34 
    [speed_upload] => 1699 
    [download_content_length] => 35 
    [upload_content_length] => 1736 
    [starttransfer_time] => 1.002496 
    [redirect_time] => 0 
    [certinfo] => Array 
     (
     ) 

    [redirect_url] => 
) 
+0

Да, сценарий быстрой командной строки, использующий lwp-request (начиная новый интерпретатор Perl для каждого POST), намного быстрее, чем cURL, закодированный в одном PHP-процессе. –

+4

Я нашел способ исправить это, по крайней мере, для моих нужд ... Я передал список приведенных выше аргументов CURLOPT_POSTFIELDS, ожидая, что он сгенерирует urlencoded тело сообщения, но на самом деле он генерирует multipart. Чтобы заставить его отправлять простой URL-адрес POST, вы должны сами кодировать параметры тела и передавать готовые к использованию строки. По какой-то причине многопроцессорный процесс имеет задержку в одну секунду, простой POST работает на полной скорости. –

+0

ДА. Несмотря на то, что я не понимаю, почему multipart занимает так много времени, чтобы начать, это сработало, задержка ушла! Вы должны действительно обновить свой ответ с помощью этой информации –

0

Я решил, установив

curl_setopt($ch, CURLOPT_POST, false); 
1

Это в основном из-за заголовка Expect: 100-continue CURL отправляет сервер, когда он обрабатывает большие данные POST, а сервер просто не поддерживает эту функцию. Вы можете подтвердить, добавив -vv для командной строки curl и посмотреть выходы.

Чтобы решить эту проблему, вы можете 1. исправить ваш сервер для поддержки Expect: 100-continue заголовка или 2. сила не локон, чтобы отправить его по добавьте -H "Expect:" вариант (в PHP, вы можете обратиться к этому ответу: How can I stop cURL from using 100 Continue?).

Ссылки о Expect: 100-continue:

https://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.2.3 https://support.urbanairship.com/entries/59909909--Expect-100-Continue-Issues-and-Risks