Альтернатива CURL из-за долгого ожидания - PullRequest
3 голосов
/ 13 мая 2010

Привет, ребята. В настоящее время я запускаю PHP-скрипт, используя CURL для отправки данных на другой сервер, чтобы запустить PHP-скрипт, который может занять до минуты. Этот сервер не возвращает никаких данных. Но CURL-запрос все еще должен ждать его завершения, а затем он загружает оставшуюся часть оригинальной страницы. Я хотел бы, чтобы мой PHP-скрипт просто отправлял данные на другой сервер и затем не ждал ответа.

Итак, мой вопрос, как мне решить это? Я читал, что CURL всегда должен ждать. Каковы ваши предложения?

Спасибо!

Ответы [ 5 ]

10 голосов
/ 13 мая 2010

Это может быть полезной отправной точкой, вопиюще скопировано здесь

function curl_post_async($url, $params)
{
    foreach ($params as $key => &$val) {
      if (is_array($val)) $val = implode(',', $val);
        $post_params[] = $key.'='.urlencode($val);
    }
    $post_string = implode('&', $post_params);

    $parts=parse_url($url);

    $fp = fsockopen($parts['host'], 
        isset($parts['port'])?$parts['port']:80, 
        $errno, $errstr, 30);

    //pete_assert(($fp!=0), "Couldn't open a socket to ".$url." (".$errstr.")");(optional)

    $out = "POST ".$parts['path']." HTTP/1.1\r\n";
    $out.= "Host: ".$parts['host']."\r\n";
    $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
    $out.= "Content-Length: ".strlen($post_string)."\r\n";
    $out.= "Connection: Close\r\n\r\n";
    if (isset($post_string)) $out.= $post_string;

    fwrite($fp, $out);
    fclose($fp);
}
3 голосов
/ 13 мая 2010

http://php.net/manual/en/function.fsockopen.php


$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}

1 голос
/ 13 мая 2010

Вы можете создать серверный сокет на другом компьютере, к которому подключается ваша веб-страница PHP. Таким образом, вы решаете протокол. В противном случае посмотрите, соответствует ли фоновый процесс вашим потребностям.

0 голосов
/ 24 ноября 2015

Просто лучше использовать флаг TIMEOUT для выхода за определенный промежуток времени.

curl_easy_setopt(curl, CURLOPT_TIMEOUT, sec); // sec is int variable

Это был код на C, адаптируйся.

0 голосов
/ 16 мая 2010

Я думаю, что вы можете установить максимальное время выполнения в php, чтобы он прекратил работу скрипта после ограничения по времени. Это не «про» решение, но оно работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...