2013-12-01 4 views
0

У меня есть PHP-скрипт, который создает кучу cURL-запросов. После каждого запроса cURL я хочу выделить некоторые данные, но в настоящее время данные получают только после каждых 5-10 запросов cURL.Периодически эхо-данные с длинным сценарием PHP

Я пробовал использовать ob_flush и flush, но, похоже, это не имеет значения. Ниже основной поток моего сценария:

<?php 

    header('Content-Type: text/html; charset=UTF-8'); 

    set_time_limit(0); 

    ob_start(); 

    $arr = array(); // Lots of strings in this array 

    foreach ($arr as $elem) { 

    // Use $elem to make cURL request and return HTML. 
    // Run regexes on returned HTML. 

    echo '<pre>'; 

    print_r($matches[1]); 

    print_r($matches[2]); 

    echo '</pre>'; 

    ob_flush(); 

    flush(); 

    } 

Что я могу сделать, чтобы заставить скрипт выводить вторят/print_r «Ed данных после каждой итерации цикла Еогеаспа?

спасибо.

+0

Включен ли режим дефляции? – exussum

+0

Он был отключен, но я просто раскомментировал строку 'LoadModule deflate_module modules/mod_deflate.so' в файле' httpd.conf' и перезапустил сервер Apache, но, похоже, это не повлияло. – HartleySan

+0

Я должен упомянуть, что если вы запустите такой скрипт из командной строки, он выведет все нужные вам данные, когда вы его попросите, независимо от количества эхо-данных. Кроме того, вам не нужно использовать функции ob_. – HartleySan

ответ

1

Вы должны переместить ob_start() внутри цикла, как:

<?php 

    header('Content-Type: text/html; charset=UTF-8'); 

    set_time_limit(0); 

    $arr = array(); // Lots of strings in this array 

    foreach ($arr as $elem) { 

    ob_start(); 

    // Use $elem to make cURL request and return HTML. 
    // Run regexes on returned HTML. 

    echo '<pre>'; 

    print_r($matches[1]); 

    print_r($matches[2]); 

    echo '</pre>'; 

    ob_end_flush(); 

    flush(); 

    } 

Думайте выходной буфер (ob_*) функцию, как толчок и поп-музыку на стеке. Вы указываете, где вы хотите начать запись, нажав буфер в стек(), а затем, когда вы хотите вывести, вы выталкиваете буфер из стека и делаете что-то с результатом (, ob_get_*() и т. Д.). Каждый ob_start() должен иметь соответствующую функцию конца буфера.

Вы также захотите использовать ob_end_flush() вместо ob_flush(), поскольку я не думаю, что вы хотите сохранить буфер после каждого прогона.

+0

Я пробовал это, но он не делал то, что хотел. Фактически, когда я это делаю, скрипт ждет, пока все запросы cURL закончатся, прежде чем вывести все сразу. – HartleySan

+0

Я добавил примечание о 'ob_flush()' vs 'ob_end_flush()', это тоже не сработало? – Drew

+0

Вместо этого я попробовал 'ob_end_flush', и это немного изменилось, но данные все равно выводятся только каждые 10 запросов cURL. Есть несколько вещей, которые мне интересно: 1) Я выводил только 500 символов текста за запрос cURL. Является ли небольшое количество данных причиной того, что PHP объединяет запросы? 2) Я попробовал включить mod_deflate, как рекомендовано пользователем1281385, но это, похоже, не имеет значения. Нужно ли мне беспокоиться об этом? – HartleySan

0

Попробуйте использовать это в начале:

apache_setenv('no-gzip', 1); 
ini_set('output_buffering', 0); 
ini_set('zlib.output_compression', 0); 
ini_set('implicit_flush', 1); 

А потом делать вещи вы уже сделали.

+0

Спасибо за ответ. К сожалению, это ничего не ускорило. Я все еще получаю выход каждые 7-8 запросов. – HartleySan