Я создаю проект на 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
. Если не лучший альтернативный способ?
Есть, вероятно, такие инструменты, как упоминаемый один 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 и постепенно увидеть вывод вывода (убедитесь, что вы его поместили, как описано здесь).
Да, это возможно. Существует библиотека https://github.com/stil/curl-easy Посетите эту библиотеку gitHub и проверьте документацию о том, как ее реализовать!
Надеюсь, поможет :-)
foreach(...) { curl ...; echo done }
- что-то типа того, что вы хотите?