¿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).
Detecta el tiempo que tarda un archivo en cargarse (PHP)
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.
svish
Parece que este método funciona bastante bien en realidad:
- Envíe una solicitud ajax (justo antes de las publicaciones de formulario) al servidor que almacena una marca de tiempo de sesión
- Publicar el formulario
- 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.
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.
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.
.
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