Как добиться прогрессивного ответа, используя curl

1

Я создаю проект на PHP, который система отправляет запрос curl в другой домен для обработки запроса. Например. http://domain.com/process_query?q=abc. Контроллер process_query выполняет запрос по набору файлов и возвращает итоговые результаты отдельных файлов в следующем формате.

[
    array('filename' => "one.dat", 'summary_counts' => 5),
    array('filename' => "two.dat", 'summary_counts' => 30),
    array('filename' => "three.dat", 'summary_counts' => 4),
    array('filename' => "four.dat", 'summary_counts' => 70),
    array('filename' => "five.dat", 'summary_counts' => 0)
]

Затем он захватывается системой, которая отправляет запрос на завивание и отображает его на экране. Я хочу сделать это прогрессивным способом. Например, как только контроллер process_query завершит обработку файла, он должен будет echo откликом [ array('filename' => "one.dat", 'summary_counts' => 5) ] и продолжить обработку следующего файла. Если это возможно, для каждого полученного ответа система может отображать прогрессивную обработку запросов. Это можно сделать с помощью PHP-curl. Если не лучший альтернативный способ?

  • 0
    curl будет блокироваться, пока каждый запрос «в полете», поэтому не будет foreach(...) { curl ...; echo done } - что-то типа того, что вы хотите?
  • 0
    @MarcB вы хотите, чтобы я отправлял отдельный запрос curl для каждого файла?
Показать ещё 1 комментарий
Теги:
curl

2 ответа

0

Есть, вероятно, такие инструменты, как упоминаемый один Rafique, который помогает повысить производительность за счет одновременного запуска запросов на завивки, хотя, если ваша основная цель - отправить отчет о ходе выполнения после каждого шага задачи, вы можете просто echo а затем flush() ответ на браузер.

Вот супер простой скрипт, демонстрирующий возможность очистки содержимого до браузера частично через скрипт:

<?php
echo "1\n";
ob_flush();
flush();

sleep(1);
echo "2\n";
ob_flush();
flush();

sleep(1);
echo "3\n";

Когда вы получаете доступ к этой команде из командной строки, например curl test.php вы увидите числа, появляющиеся на 1, 2, 3 на одну секунду друг от друга.

Вы можете использовать эту технику в сочетании с AJAX, чтобы вызвать длительное действие с вашей веб-страницы, а затем отобразить на странице какое-то состояние прогресса/статуса. Вероятно, вам нужно будет подключиться к событию onprogress (см. Этот поток), иначе вы могли бы запустить его внутри iframe и постепенно увидеть вывод вывода (убедитесь, что вы его поместили, как описано здесь).

0

Да, это возможно. Существует библиотека https://github.com/stil/curl-easy Посетите эту библиотеку gitHub и проверьте документацию о том, как ее реализовать!

Надеюсь, поможет :-)

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню