Выполнится ли скрипт на удалённом сервере, если мы не дождёмся ответа сервера?

Тема в разделе "PHP", создана пользователем Sergo_Sev, 31 мар 2014.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    188
    Если мы обращаемся к удаленному серверу и он к примеру подвис секунд на 30, а мы сделали запрос и через 2 секунды сработал таймаут, то удаленный скрипт выполнится или нет?

    PHP:
    function f1$vk )
        {
    $ch curl_init ();
    curl_setopt ($chCURLOPT_CONNECTTIMEOUT2); // таймаут 2 секунды
    curl_setopt ($chCURLOPT_TIMEOUT2); // таймаут 2 секунды
    curl_setopt ($ch CURLOPT_URL $vk);
    curl_setopt ($chCURLOPT_SSL_VERIFYPEERfalse);
    $url curl_exec($ch);
    curl_close($ch);
         return 
    $url;
    }

    $url "https://api.vk.com/method/messages.send.xml?uid="// обращение по ссылке должно вызвать отправку сообщения
    f1($url);
     
  2. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.039
    Симпатии:
    2.045
    Вместо ответа предлагаю маленьку лабораторную работу =) Услышать от кого-то хорошо, а ещё лучше увидеть своими глазами ;)
    PHP:
    <?php

    sleep
    (10);

    file_put_contents ("text.txt""Я отработал", );

    echo 
    "Ok";

    ?>
    Выполняем, ждём 10 секунд, проверяем наличие файлика text.txt. Удаляем файлик, повторяем тоже самое, но сразу после вызова файла закрываем окно браузера - смотрим в папке в течении 10 секунд на предмет появления файлика =)
     
    Sergo_Sev нравится это.
  3. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    188
    Отличный ответ! :ay:
    Значит достаточно просто обратиться к файлу и если сервер жив то скрипт выполнится в любом случае (просто закралось сомнение - а вдруг не выполнится)
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.405
    Симпатии:
    1.185
    Не всё так просто...

    ignore_user_abort — Устанавливает, необходимо ли прерывать работу скрипта при отключении клиента

    Так же полезной может оказаться информация из статьи "Работа с соединениями" - http://www.php.net/manual/ru/features.connection-handling.php

    PS: curl_setopt ($ch, CURLOPT_TIMEOUT, 2); // таймаут 2 секунды
    это маловато некоторые ответы могут формироваться дольше 2 секунд, у меня до 7 секунд были задержки ответа от апи ВК
     
    Wounderer, Sergo_Sev и Горбушка нравится это.
  5. Sergo_Sev

    Sergo_Sev Творец

    Регистр.:
    14 июн 2008
    Сообщения:
    571
    Симпатии:
    188
    Спасибо!!! Полезная статья! В этом направлении я и подумал, что есть подобные нюансы
    Как будет тормозить контакт - тогда точно проверю работает или нет

    В принципе ответ от сервера мне не важен - важно выполнить скрипт и быстро вывести само сообщение из скрипта, без долгого ожидания (столкнулся как раз с тем что скрипт долго выполняется потому и установил таймайт) и важно, что бы ВК API получил мой запрос и сделал то, что от него требуется в этом самом запросе
    Или может есть подходящий вариант, что бы сразу сообщение вывести и ответа от контакта дождаться?

    И ещё попутный вопрос - в чем разница между CURLOPT_TIMEOUT и CURLOPT_CONNECTTIMEOUT?
    Как я понял из мануала - CURLOPT_CONNECTTIMEOUT это время ожидания ответа от сервера, а CURLOPT_TIMEOUT это время выполнения самой функции, но что в первом случае мы ждём ответа и потом продолжаем работу скрипта, что во втором
     
  6. dwarf

    dwarf Постоялец

    Регистр.:
    12 июн 2011
    Сообщения:
    88
    Симпатии:
    18
    CURLOPT_CONNECTTIMEOUT - The number of seconds to wait while trying to connect. Use 0 to wait indefinitely.
    CURLOPT_TIMEOUT - The maximum number of seconds to allow cURL functions to execute.

    CURLOPT_CONNECTTIMEOUT - отвечает только за tcp соединение, обработка и отправка http запроса в него не входит.
     
  7. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.405
    Симпатии:
    1.185
    CURLOPT_CONNECTTIMEOUT - время, в течении которого курл пытается подключится к серверу (при очень медленном подключении или ддосе сервера стоит увеличить)
    CURLOPT_TIMEOUT - время на передачу самого запроса. Здесь зависимость от скорости подключения и количества передаваемых данных. В случае ТС наиболее актуально время обработки запроса сервером, т.е. данные могут передаться за 0,1 секунды, а обрабатывать их ВК будет несколько секунд...

    Выставляя первый параметр слишком маленьким есть шанс, что до вк запрос просто не дойдёт. Сделав слишком маленьким второй параметр мы можем лишиться ответа от api и не узнаем, что произошло с нашим запросом. ВК может попросить разгадать каптчу или выдать другую ошибку.

    Если надо быстро выдать ответ пользователю - записывай параметры запроса к вк в БД или текстовый файл и выполняй по крону или постоянно запущенным демоном.
     
Статус темы:
Закрыта.