2014-02-06 2 views
8

У меня есть настройка, где у меня есть два сервера с тонким клиентом (Apache, PHP). На сервере A рассматривается клиентская машина и подключается к серверу B для получения данных через Restful API. Оба сервера находятся в одной сети. На сервере B, ответ запроса показан ниже:Время отклика API Curl API отличается от другого сервера

{ 
    "code": 200, 
    "response_time": { 
     "time": 0.43, 
     "measure": "seconds" 
    } 
} 

Сервер Б вычисляет время заполненное для каждой задачи с помощью microseconds, чтобы пометить начало и конец блока запроса. Но когда я использую curl на сервере А, чтобы сделать вызов на сервер B, я получаю очень странные результаты в плане по времени выполнения:

$url = "https://example.com/api"; 
    /*server B address. I've tried IP address as well without any change in results. 
    This must go over a SSL connection. */ 

    $start_time = microtime(true); 

    $curl2 = curl_init(); 

    curl_setopt($curl2, CURLOPT_URL, $url); 
    curl_setopt($curl2, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($curl2, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($curl2, CURLOPT_USERAGENT, "Server A User Agent"); 

    $result = curl_exec($curl2); 

    $HttpCode = curl_getinfo($curl2, CURLINFO_HTTP_CODE); 
    $total_time = curl_getinfo($curl2, CURLINFO_TOTAL_TIME); 
    $connect_time = curl_getinfo($curl2, CURLINFO_CONNECT_TIME); 
    $namelookup_time = curl_getinfo($curl2, CURLINFO_NAMELOOKUP_TIME); 

    $end_time = microtime(true); 

    $timeDiff = round(((float)$end_time - (float)$start_time), 3); 

Я получаю следующее для каждого времени заезда:

$timeDiff = 18.7381 (Using Microseconds) 
$total_time = 18.7381 (Transfer Time) 
$connect_time = 0.020679 
$namelookup_time = 0.004144 

Так что я не уверен, почему это происходит. Есть ли лучший способ источника данных с другого сервера в вашей сети, который содержит ваш API? Было бы так, как если бы сайт Twitter's использовал свой API с другого сервера, который не является сервером API. Я бы подумал, что время для curl API будет очень похоже на время, указанное API. Я понимаю, что API не учитывает сетевой трафик и скорость, чтобы открыть соединение, но мне кажется, что 18 секунд против 0,43.

Любые идеи здесь?

+0

Каких данных это API отправка обратно? & Насколько велики эти данные –

+0

Данные отправляются как JSON.Он может быть довольно большим - не уверен в размере, но длина контента - «Content-Length: 136917» для одного файла образца. – gregavola

+0

Какова скорость загрузки вашего сервера, когда он отправляет обратно на него. Я видел, что в прошлом был установлен на 128 кпс, поэтому вы должны изучить это! –

ответ

1

У меня была та же проблема около 3 дней назад. Я потратил весь день, чтобы найти проблему. В конце я связался с поставщиком серверов и рассказал ему о проблеме. Он сказал, что это не проблема моего сценария, а оператора (сети).

Возможно, это та же проблема, что и у меня, поэтому обратитесь к поставщику своего сервера и спросите его. Вы пробовали его с помощью file_get_contents? Было бы интересно, если бы время ответа было таким же.

7

Это уже не проблема с завиванием. Скорее, это проблема с настройкой сети. Вы можете проверить это, сделав несколько вещей.

1) Используйте команду ping, чтобы проверить время отклика.

From Server-A: ping Server-B-IP 
From Server-B: ping Server-A-IP 

2) Точно так же вы можете использовать команду traceroute (для окон tracert), чтобы проверить время отклика, а также. Вы должны получить ответ мгновенно.

From Server-A: traceroute Server-B-IP 
From Server-B: traceroute Server-A-IP 

3) Используйте wget или curl командную строку, чтобы загрузить большой файл (скажем 100 МБ) с одного сервера на другой, а затем проверить, как долго они принимают. Например, используя wget:

From Server-B: wget http://server-A-IP/test/test-file.flv 
From Server-A: wget http://server-B-IP/test/test-file.flv 

4) Помимо этих основных плановой проверки, вы можете также использовать некоторые предварительные инструменты для сортировки этой проблемы сети вне. Например, команды/примеры из следующих двух звеньев:

Test network connection performance between two Linux servers
Command line tool to test bandwidth between 2 servers

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