За последние 24 часа нас посетил 21631 программист и 1028 роботов. Сейчас ищет 741 программист ...

Linux PHP - отследить цепочку серверов в запросе

Тема в разделе "Прочие вопросы по PHP", создана пользователем at0m1x, 15 окт 2015.

  1. at0m1x

    at0m1x Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    31
    Симпатии:
    0
    Всем привет. У меня есть сайт (ubuntu server, php, nginx). Он связан с другим сайтом и отправляет много POST запросов на API этого другого сайта. В день уходит примерно 10000 запросов. Из них 2000 не успешных. Отправляю запросы с помощью CURl:

    Код (PHP):
    1. $ch = curl_init('http://api.other-site.com/api');
    2. curl_setopt($ch, CURLOPT_POST, true);
    3. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
    4. 'field1' => 'value1',
    5. 'field2' => 'value2',
    6. ...
    7. ]));
    8. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    9. $result = curl_exec($ch);
    10. $error = curl_error($ch);
    11. curl_close($ch); 
    При не успешных запросах в переменную $error ложится строка: Recv failure: Connection reset by peer

    Я хочу выяснить из-за чего такая не стабильная связь. Скорее всего не стабильный интернет канал между моим сервером и сервером API.

    В идеале было бы сделать скрипт, который бы отправил 10000 тестовых запросов с моего сервера на сервер API, и при этом подробно бы залогировал через какие промежуточные сервера шел запрос, и на каком оборвался в случае не успешного выполнения. Т.е. что бы лог был примерно в таком виде:

    2015-10-15 10:10:12 success
    Request:
    URL: http://api.other-site.com/api
    METHOD: POST
    PARAMS: field1=value1&field2=value2&field3=value3
    123.236.100.240 server1.com
    123.236.99.240 server2.com
    123.6.100.240 server3.com
    123.6.100.20 api.other-site.com
    Response:
    123.6.100.20 api.other-site.com
    123.6.100.240 server3.com
    123.236.99.240 server2.com
    123.236.100.240 server1.com

    2015-10-15 10:10:12 error
    Request:
    URL: http://api.other-site.com/api
    METHOD: POST
    PARAMS: field1=value1&field2=value2&field3=value3
    123.236.100.240 server1.com
    123.236.99.240 server2.com
    123.6.100.240 server3.com CONNECTION RESET
    NO RESPONSE

    Этот скрипт будет запускаться из под консоли сервера. Возможно такой написать на PHP, или каком то другом языке?

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Я бы посоветовал смотреть в сторону bash.
     
  3. at0m1x

    at0m1x Активный пользователь

    С нами с:
    18 дек 2011
    Сообщения:
    31
    Симпатии:
    0
    В итоге остановился на баш команде tcptraceroute

    Эта команда как раз стучится на 80-й порт и показывает через какие промежуточные сервера проходит запрос.

    Сделал баш скрипт, который переодически выполняет эту команду и логирует результаты. Запустил его на несколько часов, после чего проанализировал логи и выяснилось что запросы все таки сбрасывает API сервер к которому я обращаюсь. Т.к. через все промежуточные сервера зарос проходит стабильно, а при обрыве если посмотреть по логу он всегда происходил именно на конечном сервере. Так что команда помогла выяснить где именно обрывается запрос.

    Код баш скрипта:

    Код (Text):
    1.  
    2. while [ 1 = 1 ]
    3. do
    4.   date >> ./trace-so.log
    5.   tcptraceroute api.server.com >> ./trace-so.log
    6. done
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    стабильная, раз бай пир ресет вроде же ж.