#php #foreach #progress-bar
#php #foreach #индикатор выполнения
Вопрос:
У меня есть цикл foreach, который вызывает функцию для установки значений в массив. Иногда для завершения требуется несколько часов, в зависимости от того, сколько раз он должен выполняться через функцию для завершения.
Я хотел бы иметь индикатор выполнения или, по крайней мере, индикатор выполнения типа 1/1000.
Возможно ли это? Если да, то как я могу реализовать это в своем коде? Будет ли это в функции или в цикле foreach? Проводил исследование и нашел несколько примеров использования for и $i , но я не совсем уверен, как это реализовать, поскольку я уже использую цикл foreach.
Большое спасибо.
function scrape_amazon($links) {
//my code runs here to set all values in $ret array.
}
foreach($links as $link) {
$ret = scrape_amazon($link);
}
Комментарии:
1. Ни то, ни другое, PHP вообще не может этого сделать. Вам понадобятся Ajax и JavaScript, а также, вероятно, полная реструктуризация. Если вы не хотите уродливого непрерывного сброса, и это определенно не индикатор выполнения.
2. Спасибо. Я посмотрю на индикаторы выполнения ajax и посмотрю, что я могу узнать. Надеюсь, мне не придется ничего реструктурировать…
3. часы! вы ожидаете, что человек будет сидеть и смотреть? почему бы не запустить его в фоновом режиме и сообщить им, когда это будет сделано.
4. Это то, что я делаю сейчас, но я хотел бы иметь возможность периодически проверять его, чтобы увидеть, где он находится в шагах.
Ответ №1:
PHP, вероятно, не совсем подходящий инструмент для этой задачи, однако то, что вы могли бы сделать, это:
- Запустите медленный код в качестве фонового процесса и выведите прогресс в файл.
- Есть PHP-скрипт, который опрашивает этот файл для получения информации о ходе выполнения (либо с помощью обновления страницы, либо AJAX)
Запуск фонового процесса может быть выполнен несколькими способами, в том числе:
- Запускайте через cron каждые 60 секунд и проводите опрос на наличие новых заданий, размещенных в некоторой читаемой области
- Запуск с помощью механизма fork / exec с веб-страницы
- Запуск как демон при запуске системы
Потребуется некоторое усилие, чтобы избежать проблем с несколькими исполнениями и / или перекрытием.
Комментарии:
1. Я создал таблицу в mysql и обновлял ее в каждом цикле. Затем я использовал Ajax для чтения php-файла, который опрашивает таблицу каждые 5 секунд. Отлично работает! Спасибо за совет.
Ответ №2:
Я использую это, что, ну, не ajax, делаю только промывку, но не так уродливо.
Я размещаю изображение
<img src='progress.gif' height=18 width=0 name=probar>
Затем установите для каждого события, выполняемого на сервере echo
, строку, затем flush
:
echo "<script language='JavaScript'>ndocument.probar.width=".(($sys["probar_width"]/$task_all)*$task_i).";n</script>n";
flush();
Если ваш сервер (например, apache) использует кэширование (например, включен gzip), он не будет работать хорошо.