Выходной буфер PHP Curl не получает ответ - PullRequest
0 голосов
/ 26 августа 2011

У меня есть сделка, где file1.php curl запускает file2.php. file2.php - это долго работающий файл, но он отправляет (или должен отправить) ответ обратно на file1.php, а затем продолжает работу с его кодом. Я использую выходной буфер, чтобы попытаться отправить эти данные, но проблема в том, что если я вернусь; сразу после притока; file1.php получает ответ очень хорошо, но когда я пытаюсь поддерживать file2.php, file1.php никогда не получает ответ, что я делаю неправильно? Есть ли другой способ отправить ответ обратно в file1.php?

// file1.php
    $url = "file2.php"

    $params = array('compurl'=>$compurl,'validatecode'=>$validatecode);

    $options = array(
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => true,     // return headers
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects
        CURLOPT_ENCODING       => "",       // handle all encodings
        CURLOPT_USERAGENT      => "Mozilla", // who am i
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
        CURLOPT_TIMEOUT        => 10,       // don't wait too long
        CURLOPT_POST           => true,     // Use Method POST (not GET)
        CURLOPT_POSTFIELDS     => http_build_query($params)
    );
    $ch = curl_init($url);

    curl_setopt_array( $ch, $options );
    $response = curl_exec($ch); 
    curl_close($ch);
    echo $response;

// file2.php
ob_start();
echo 'Running in the background.';

// get the size of the output
$size = ob_get_length();

header("HTTP/1.1 200 OK"); // I have tried without this
header("Date: " . date('D, j M Y G:i:s e')); // Tried without this
header("Server: Apache"); // Tried without this
header('Connection: close');
header('Content-Encoding: none');
header("Content-Length: $size");
header("Content-Type: text/html"); // Tried without this

// flush all output
ob_end_flush();
ob_flush();
flush();

// If I add return; here file1.php gets the response just fine
// But I need file2.php to keep processing stuff and if I remove the
// return; file1.php never gets a response.

1 Ответ

3 голосов
/ 26 августа 2011

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

...