cURL вызывает зависание страницы - PullRequest
0 голосов
/ 14 июня 2011

Я использую текущий код, чтобы попытаться использовать cURL для асинхронного выполнения двух сценариев. Каждый сценарий размещается в отдельном домене и занимает ~ 30 секунд. Я хочу, чтобы они запускались в фоновом режиме, чтобы страница продолжала загружаться, но зависла до завершения. Я совершенно не прав, думая о том, как работает cURL? Или я просто сделал что-то не так?

UPDATE:

$.ajax({
    type    : 'POST',
    url     : 'ajax.php?mode=process',
    data    : '$url',
    complete: function(data)
    {
        $('#test'+num).append('Operation successful.');
    }
});

Num - это идентификатор div. Они генерируются с помощью кода. Все это работает правильно, за исключением того, что cURL блокирует сервер до тех пор, пока он не закончит обработку файлов.

Код, приведенный ниже, теперь находится на другой странице специально для обработки URL-адресов, переданных из вызова jQuery ajax выше.

<code>$cURLs = array(
    "script_url?param1=1&param2=2",
    "script_url?param1=5&param2=6");
$result = array();
$mh = curl_multi_init();

foreach ($data as $id => $d) 
{
    $cURLs[$id] = curl_init();
    $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
    curl_setopt($cURLs[$id], CURLOPT_URL,            $url);
    curl_setopt($cURLs[$id], CURLOPT_HEADER,         0);
    curl_setopt($cURLs[$id], CURLOPT_RETURNTRANSFER, 1);

    if (is_array($d)) 
    {
            if (!empty($d['post'])) 
            {
                    curl_setopt($cURLs[$id], CURLOPT_POST,       1);
                    curl_setopt($cURLs[$id], CURLOPT_POSTFIELDS, $d['post']);
            }
    }

    if (!empty($options))
            curl_setopt_array($cURLs[$id], $options);

    curl_multi_add_handle($mh, $cURLs[$id]);
}

$running = null;
do 
{
    curl_multi_exec($mh, $running);
} while($running > 0);

foreach($cURLs as $id => $c) 
{
    $result[$id] = curl_multi_getcontent($c);
    curl_multi_remove_handle($mh, $c);
}

curl_multi_close($mh);
echo "<pre>" . print_r($result, 1) . "
";

Ответы [ 4 ]

3 голосов
/ 14 июня 2011

К сожалению, ваша страница не завершит загрузку, пока ваш скрипт не завершит выполнение.Даже если вы используете функции cURL Multi, это хорошо только для сценария.

Если вам нужен сценарий для запуска в фоновом режиме, вы должны найти другой метод, такой как создание очереди загрузки вбаза данных и cron запускают скрипт для проверки этой очереди каждую минуту.

1 голос
/ 14 июня 2011

Используйте это как опции для запроса скручивания.

$CURL_OPTS = array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 60,
);
0 голосов
/ 14 октября 2011

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

У меня был вызов ajax, который называл a.php, a.phpвызвал b.php через CLI cURL для обработки страницы в фоновом режиме (используя PHP-функцию exec ()) b.php использовал libcurl для очистки веб-сайта ... b.php заставлял a.php перестать отвечать на мои запросы ajaxпроверить состояние скребка.Я обнаружил, что причина в том, что я хранил информацию из скребка в глобальную переменную $ _SESSION ... вы не можете читать / записывать в один и тот же сеанс в нескольких местах, поэтому мои периодические запросы ajax к a.php (который былиспользуя тот же сеанс, что и cURL-скребок на b.php) висели.Периодическое использование session_write_close () по всему циклу cURL приводило к тому, что мои запросы ajax не зависали, потому что сеанс больше не блокирует выполнение запросов страницы.

Мне было бы интересно выяснить, не было ли это причиной того, что ваши ajax-запросы зависли, пока cURL не закончил обработку

0 голосов
/ 14 июня 2011

Если вы хотите сделать это асинхронно, вам нужно завершить вывод на свою страницу, а затем использовать JQuery для вызова скрипта, который загружает данные с использованием cURL.

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