Индикатор выполнения при запуске функции внутри цикла foreach

#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), он не будет работать хорошо.