Detecta el tiempo que tarda un archivo en cargarse (PHP)

7 minutos de lectura

¿Es posible saber (en el servidor) el tiempo que tardó en cargarse un archivo? Tengo una API de carga de imágenes y en mi respuesta me gustaría devolver el tiempo de carga (sin incluir el tiempo de ejecución del script).

  • muéstranos el código que estás usando para cargar el archivo

    – Galeno

    28 mayo, 2010 a las 19:50

  • un archivo se carga publicándolo en mi URL de API como multipart/form-data

    – hazte

    28 mayo, 2010 a las 19:52

creo que si hay $_SERVER['REQUEST_TIME'] variable que indica el inicio de la solicitud HTTP, por lo que al comienzo de su secuencia de comandos:

$upload_time = time() - $_SERVER['REQUEST_TIME'];

El resultado será en segundos.

  • Es triste escuchar eso, pero tenga en cuenta que es un problema con la configuración de su servidor, no la respuesta.

    – dev-null-dweller

    18 nov.

  • Como dijiste, resultó ser una mala configuración del servidor. Sin embargo, también obtuve algunas respuestas útiles. La solución de encabezado de Apache en la otra pregunta en realidad permite el uso de microtime, que es de una granularidad más fina que REQUEST_TIME. Voy a solicitar que se fusionen las dos preguntas.

    -Gustav Bertram

    20 de noviembre de 2011 a las 1:43


  • De momento si, pero a partir de php 5.4 en adelante REQUEST_TIME también contendrá microsegundos, por lo que debería ser independiente del servidor web.

    – dev-null-dweller

    20 nov.

Detecta el tiempo que tarda un archivo en cargarse PHP
svish

Parece que este método funciona bastante bien en realidad:

  1. Envíe una solicitud ajax (justo antes de las publicaciones de formulario) al servidor que almacena una marca de tiempo de sesión
  2. Publicar el formulario
  3. Compruebe la diferencia en el extremo receptor 🙂

HTML

<?php session_start(); // must be at the top ?>

<form id="upload-form" enctype="multipart/form-data" method="post">
    <input type="file" name="datafile" size="40">
    <input type="submit" value="Send">
</form>

<script type="text/javascript">
    $(function()
    {
        $('#upload-form').submit(function()
        {
            $.ajax({
                url: 'start-timer.php',
                type: 'POST',
                context: this,
                success: function() { this.submit(); },
            });

            return false;
        });
    });
</script>

inicio-temporizador.php

<?php session_start();
$_SESSION['time'] = microtime(true);

cargar.php

<?php 
session_start();
header('content-type: text/plain; charset=utf-8');

if( ! isset($_FILES['file'])
||  ! isset($_SESSION['time'])
||  $_FILES['file']['error'] !== UPLOAD_ERR_OK
||  ! is_uploaded_file($_FILES['file']['tmp_name']))
{
    exit('stuff went wrong...');
}

$time = microtime(true) - $_SESSION['time'];
unset($_SESSION['time']);
echo round($time, 3).'s';

Muestra de trabajo: http://samples.geekality.net/upload-timer

  • Parece prometedor. Veré si puedo hacerlo funcionar y editaré tu respuesta cuando lo haga.

    -Gustav Bertram

    18 nov.


  • @GustavBertram Sentí curiosidad, así que lo probé en casa y lo hice funcionar. Actualicé la respuesta y también creé una muestra de trabajo 🙂

    – Svish

    20 nov.

  • Hola. De hecho, lo hice funcionar yo mismo, y envié una actualización a su respuesta, pero supongo que su actualización sobrescribió eso. 🙂 Su respuesta funciona muy bien, pero la mayor sorpresa es que obtuve la respuesta del encabezado de Apache funcionando.

    -Gustav Bertram

    20 nov.

  • @Svish Tomé su código pero no lo hice funcionar, siempre sale “cosas salieron mal…”, sin importar qué archivo cargue. Me di cuenta de que en su código anterior faltaba un action="upload.php", pero incluso con eso, no tuvo éxito en diferentes servidores. Le agradecería si pudiera revisar su código una vez más, tal vez encuentre la razón (Desafortunadamente, no soy lo suficientemente inteligente en programación PHP).

    – Señora

    3 ago. 2020 a las 12:40

Simplemente no puede medir nada dentro del script de recepción.
Solo porque se inicia justo después de que finaliza la carga (manejada por el servidor web).

Entonces, como dijo Svish, la llamada AJAX y la marca de tiempo en la sesión serían la solución más fácil.

  • @iWantSimpleLife ha demostrado que esto está mal. Su solución de encabezado de Apache es PHP puro y realmente funciona.

    -Gustav Bertram

    20 de noviembre de 2011 a las 1:40

  • O no entiendes esta solución o no leíste mi respuesta. Nada mal en ello. La solución de “encabezado de Apache” dice claramente que la medición la realiza el servidor web apache, NO secuencia de comandos php. Pero el script de recepción en sí mismo NO PUEDE medir nada, por la razón que escribí. Solo puede obtener el resultado hecho por otra persona. Sin mencionar que el encabezado de Apache NO es una “solución PHP pura” sino un enfoque de sesión ES de hecho php puro ya que no implica nada más. NADA en mi respuesta contradice con la respuesta aceptada. Puede ser que necesite una mejor comprensión de cómo funciona PHP. No dude en preguntar.

    – Tu sentido común

    20 nov.

  • Entonces, ¿qué pasa con esta solución? stackoverflow.com/questions/2931959/… Ni siquiera requiere cambios en Apache. Solo tiene razón en un sentido muy técnico y limitado. Si bien la medición no puede comenzar ni finalizar dentro del script PHP, existen al menos tres formas de medir el tiempo que se tarda en cargar un archivo en un script PHP. Su respuesta puede ser técnicamente correcta, pero no es útil.

    -Gustav Bertram

    20 nov.


  • Mi respuesta tiene 2 puntos. 1. Corrige su suposición errónea de que cualquier cosa se puede medir dentro del script de recepción, un punto muy importante para comprender los mecanismos subyacentes. 2. Tiene un esquema de solución práctica que usted confirmó como de trabajo. Si yo fuera tú, no lo llamaría inútil. Parece que es algo personal.

    – Tu sentido común

    20 nov.


Detecta el tiempo que tarda un archivo en cargarse PHP
quierovidasimple

Mira el enlace.

http://prefetch.net/blog/index.php/2007/01/02/measuring-apache-request-processing-time/

Muestra cómo configurar apache para registrar la hora en que apache recibe la solicitud.

Luego puede usar la función apache_request_headers en PHP y extraer ese tiempo.

http://php.net/manual/en/function.apache-request-headers.php

Tal vez de esta manera, puede calcular el tiempo entre el momento en que Apache comienza a recibir el archivo y el momento en que pasa el procesamiento a php.

Es posible que deba hacer algunas pruebas, ya que no he probado esto. Déjame saber si funciona… 🙂

ACTUALIZACIÓN POR @GustavBertram:

Nota: edité la respuesta en lugar de mi propia pregunta, ya que quiero documentar el intento por separado para cada respuesta.

Habilité mod_headers en Apache y agregué el siguiente archivo de configuración:

#/etc/apache2/mods-available/headers.conf
RequestHeader set X-Request-Received: %t

Luego actualicé mi script:

<form action="#" enctype="multipart/form-data" method="post">
Upload:<input type="file" name="datafile" size="40">
<input type="submit" value="Send">
</form>
<?php

// Get the request headers
$REQUEST_HEADERS = apache_request_headers();

// Extract $t value from header
parse_str($REQUEST_HEADERS['X-Request-Received']);

// Massage string to get float in seconds
$received_time = substr_replace($t, '.', 10, 0);

// Get the current microtime as float in seconds
$current_time = microtime(1);

$upload_time = $current_time - $received_time;

echo $received_time . " n <BR />";
echo $current_time . " n <BR />";

echo $upload_time;

Lo probé tanto en mi máquina local como en una máquina remota en la red, con un archivo de 700 MB.

En Apache 2.2.22 y PHP 5.2.17, uso apache_response_headers() lead con el comando flush(), de otra forma no funciona, recibo el encabezado con una variable. ob_end_flush() no me ayudó. La variable REQUEST_TIME de $_SSERVER es un equivalente elegante, pero presta atención, esto funciona desde PHP 5.1.

Detecta el tiempo que tarda un archivo en cargarse PHP
Sumair Zafar

Tengo una lógica simple en mente.

cuando la imagen se publica para cargar

guarde la hora de inicio en una variable y configure otra variable para, por ejemplo, uploadStatus = 0, luego, cuando finalice la carga, configure la variable en uploadStatus = 1 y también guarde la hora de finalización en otra variable.

Al cargar, verifique si uploadStatus == 1, luego reste la hora de inicio de la hora de finalización y obtendrá la hora de carga.

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad