Как остановить скручивание при запросе или остановить запущенный скрипт php? - PullRequest
0 голосов
/ 26 марта 2010

Я использую URL для запроса удаленных URL, которые иногда могут быть очень медленными или просто замедленными. В этом случае мои php-скрипты все еще ждут ответа, это заставляет apache вынуждать многие запросы оставаться в памяти и затем перегружаться. Мне нужен способ прекратить запрос curl или прекратить запуск PHP-скрипта по истечении указанного времени. Я пытался объявить (), это не имеет смысла для локон. Может кто-нибудь знает как это решить?

Кстати: каков эффект CURLOPT_CONNECTTIMEOUT и CURLOPT_TIMEOUT?

Вот пример кода:

function http($url, $method, $postfields = NULL) {
    $ci = curl_init();
    /* Curl settings */
    curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ci, CURLOPT_TIMEOUT, 5);
    curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
    curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, 0);

    switch ($method) {
    case 'POST':
        curl_setopt($ci, CURLOPT_POST, TRUE);
        if (!empty($postfields)) {
            curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
        }
        break;
    case 'DELETE':
        curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
        if (!empty($postfields)) {
            $url = "{$url}?{$postfields}";
        }
    }

    curl_setopt($ci, CURLOPT_URL, $url);
    $response = curl_exec($ci);
    $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
    $this->last_api_call = $url;
    curl_close ($ci);
    return $response;
}

Я установил время соединения и тайм-аут на 5 с, но это не сработало. Curl по-прежнему тратит много времени на завершение запроса, но URL, если не ответ в 5 с, что означает, что он не работает или состояние сети плохое, должен остановить его.

1 Ответ

1 голос
/ 26 марта 2010

CURLOPT_CONNECTTIMEOUT остановит запрос, если соединение не будет установлено после указанного времени

CURLOPT_TIMEOUT остановит запрос, если полный ответ все еще не получен по истечении указанного времени

Иногда у меня возникают проблемы, когда время само по себе не истекает, в этом случае вы можете попробовать что-то вроде этого:

declare(ticks = 1);

function sig_handler($sig) {

 mysql_query("insert into log (event) values ('Timed out!')");
 die("Timed out!");

}

pcntl_signal(SIGALRM,"sig_handler");
// call sig_handler function after 30 seconds
pcntl_alarm(30);

// curl code here
...