progreso porcentaje pagina online mostrar mientras ejemplos colocar carga bootstrap barra animada php

porcentaje - Barra de progreso de línea de comandos en PHP



exec php ejemplos (4)

Esta es una buena barra de progreso para cli:

http://snipplr.com/view/29548/

<?php /* Copyright (c) 2010, dealnews.com, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of dealnews.com, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * show a status bar in the console * * <code> * for($x=1;$x<=100;$x++){ * * show_status($x, 100); * * usleep(100000); * * } * </code> * * @param int $done how many items are completed * @param int $total how many items are to be done total * @param int $size optional size of the status bar * @return void * */ function show_status($done, $total, $size=30) { static $start_time; // if we go over our bound, just ignore it if($done > $total) return; if(empty($start_time)) $start_time=time(); $now = time(); $perc=(double)($done/$total); $bar=floor($perc*$size); $status_bar="/r["; $status_bar.=str_repeat("=", $bar); if($bar<$size){ $status_bar.=">"; $status_bar.=str_repeat(" ", $size-$bar); } else { $status_bar.="="; } $disp=number_format($perc*100, 0); $status_bar.="] $disp% $done/$total"; $rate = ($now-$start_time)/$done; $left = $total - $done; $eta = round($rate * $left, 2); $elapsed = $now - $start_time; $status_bar.= " remaining: ".number_format($eta)." sec. elapsed: ".number_format($elapsed)." sec."; echo "$status_bar "; flush(); // when done, send a newline if($done == $total) { echo "/n"; } } ?>

Actualmente estoy intentando agregar una barra de progreso a una secuencia de comandos de la línea de comandos y he intentado varias soluciones (incluidas Zend y Console_ProgressBar). El problema que ambos tienen en común es que la barra de progreso no se queda pegada en la parte inferior de la ventana porque durante el script se generan nuevas líneas y otra información.

¿Hay alguna forma de mantener la barra de progreso en la parte inferior del terminal pero aún así poder generar otra información mientras se ejecuta el script?

[Editar]

Me lo imaginé:

En lugar de enviar directamente a STDOUT, en realidad estoy capturando la salida dentro de una variable, borro la pantalla con echo chr(27) . ''[2J'' echo chr(27) . ''[2J'' y luego muestra para SALTAR los contenidos de la variable y luego agrega mi barra de progreso.

Espero que tenga sentido :)


Esta es una mejora de la respuesta anterior que maneja el tamaño de los terminales y usa 2 líneas en lugar de 1. La primera línea es información, mientras que la segunda línea es la barra de progreso.

<? /* Copyright (c) 2010, dealnews.com, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of dealnews.com, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** * show a status bar in the console * * <code> * for($x=1;$x<=100;$x++){ * * show_status($x, 100); * * usleep(100000); * * } * </code> * * @param int $done how many items are completed * @param int $total how many items are to be done total * @param int $size optional size of the status bar * @return void * */ function show_status($done, $total, $size=30, $lineWidth=-1) { if($lineWidth <= 0){ $lineWidth = $_ENV[''COLUMNS'']; } static $start_time; // to take account for [ and ] $size -= 3; // if we go over our bound, just ignore it if($done > $total) return; if(empty($start_time)) $start_time=time(); $now = time(); $perc=(double)($done/$total); $bar=floor($perc*$size); // jump to the begining echo "/r"; // jump a line up echo "/x1b[A"; $status_bar="["; $status_bar.=str_repeat("=", $bar); if($bar<$size){ $status_bar.=">"; $status_bar.=str_repeat(" ", $size-$bar); } else { $status_bar.="="; } $disp=number_format($perc*100, 0); $status_bar.="]"; $details = "$disp% $done/$total"; $rate = ($now-$start_time)/$done; $left = $total - $done; $eta = round($rate * $left, 2); $elapsed = $now - $start_time; $details .= " " . formatTime($eta)." ". formatTime($elapsed); $lineWidth--; if(strlen($details) >= $lineWidth){ $details = substr($details, 0, $lineWidth-1); } echo "$details/n$status_bar"; flush(); // when done, send a newline if($done == $total) { echo "/n"; } }

No sé por qué el código anterior tiene una licencia, solo la estoy copiando para estar segura. El código de abajo no tiene licencia. De uso gratuito para cualquier propósito.

function formatTime($sec){ if($sec > 100){ $sec /= 60; if($sec > 100){ $sec /= 60; return number_format($sec) . " hr"; } return number_format($sec) . " min"; } return number_format($sec) . " sec"; } class Timer { public $time; function __construct(){ $this->start(); } function start($offset=0){ $this->time = microtime(true) + $offset; } function seconds(){ return microtime(true) - $this->time; } }; // We need this to limit the frequency of the progress bar. Or else it // hugely slows down the app. class FPSLimit { public $frequency; public $maxDt; public $timer; function __construct($freq){ $this->setFrequency($freq); $this->timer = new Timer(); $this->timer->start(); } function setFrequency($freq){ $this->frequency = $freq; $this->maxDt = 1.0/$freq; } function frame(){ $dt = $this->timer->seconds(); if($dt > $this->maxDt){ $this->timer->start($dt - $this->maxDt); return true; } return false; } }; class Progress { // generic progress class to update different things function update($units, $total){} } class SimpleProgress extends Progress { private $cols; private $limiter; private $units; private $total; function __construct(){ // change the fps limit as needed $this->limiter = new FPSLimit(10); echo "/n"; } function __destruct(){ $this->draw(); } function updateSize(){ // get the number of columns $this->cols = exec("tput cols"); } function draw(){ $this->updateSize(); show_status($this->units, $this->total, $this->cols, $this->cols); } function update($units, $total){ $this->units = $units; $this->total = $total; if(!$this->limiter->frame()) return; $this->draw(); } } // example $tasks = rand() % 700 + 600; $done = 0; $progress = new SimpleProgress(); for($done = 0; $done <= $tasks; $done++){ usleep((rand() % 127)*100); $progress->update($done, $tasks); }


Lo siguiente es para máquinas Unix .

El objetivo es recuperar las columnas totales de terminal actuales. (usando tput )

Esta es una base, lista para ser ampliada.

#!/usr/bin/php <?php @ob_start(); $shell = system("tput cols"); @ob_end_clean(); for( $i= 0 ; $i < $shell ; $i++ ){ echo "█"; usleep(100000); }

Las acciones ob están aquí para ocultar la tput de tput .

Digamos que le gustaría hacer una barra de progreso que coincida con el progreso de su tarea.

Solo divide el tiempo restante en segundos por el número de columnas.

Puede terminar con microsegundos, por lo que es mejor usar usleep .

De esta manera, la barra de progreso siempre coincidirá con el ancho del shell del usuario, incluso cuando se cambie el tamaño.

Para hacer lo mismo en puro bash:

for ((i=0; i<$(tput cols); i++)); do echo -e "█/c" ;done

Esto muestra la singularidad principal del echo php: no agrega una nueva línea, mientras que el echo bash sí lo hace.

Cuando use bucles, diga que para verificar una condición en intervalos, otra forma agradable de advertir sobre la ejecución de una actividad son los efectos de texto .

Lo siguiente utilizando strtoupper y el código ansi de video inverso .

#!/usr/bin/php <?php $iloop = "0"; /* Outside the loop */ while (true){ $warn = "Program running hold on!!/r"; if (strlen($warn) === $iloop+1){ $iloop = "0"; } $warn = str_split($warn); $iloop++; $warn[$iloop] = "/033[35;2m/e[0m".strtoupper($warn[$iloop]); echo " /033[7m".implode($warn); usleep(90000); }

Salida:

A algunos les puede gustar la versión de fiesta, obtenida por iteración de códigos ANSI.

#!/usr/bin/php <?php $iloop = "0"; /* Outside the loop */ while (true){ for ($i=0;$i<=109;$i++){ $warn = "Program running hold on!!/r"; if (strlen($warn) === $iloop+1){ $iloop = "0"; } $warn = str_split($warn); $iloop++; $warn[$iloop] = "/033[$i;7m".strtoupper($warn[$iloop]); echo " /033[7m".implode($warn); usleep(90000); }}

Obtenga más información sobre los códigos ANSI : https://.com/a/48365998/2494754


Otras respuestas parecen demasiado complejas. Mi solución es simplemente repetir / 033 [0G secuencia de escape antes de la próxima actualización y mueve el cursor de nuevo al principio.

function progressBar($done, $total) { $perc = floor(($done / $total) * 100); $left = 100 - $perc; $write = sprintf("/033[0G/033[2K[%''={$perc}s>%-{$left}s] - $perc%% - $done/$total", "", ""); fwrite(STDERR, $write); }

Al llamar a la función por primera vez, sale la barra de progreso y cada llamada subsiguiente sobrescribe la última línea con una nueva barra de progreso.

EDITAR: He cambiado el eco en la secuencia de escape / 033 [0G y ahora debería funcionar en OSX así como en Linux / Unix.

EDIT 2: Se corrigió un posible error en la línea 3 según la sugerencia de @tbjers.

EDIT 3: actualizado con la nueva versión que se imprime en STDERR y ahora también en GitHub: https://github.com/MacroMan/PHPTerminalProgressBar