Bir dosya yüklemek için ne kadar zaman alır Algılama (PHP)

5 Cevap php

O (serverside) yüklemesi için bir dosya aldı zamanını bilmek mümkün mü? Ben bir resim yükleme API var ve benim yanıt ben yükleme zamanı (betik çalıştırma zamanı dahil değil) dönmek istiyorum.

5 Cevap

Evet, bu yüzden senaryonun başından üzerine, HTTP isteği başlangıcını belirtir $_SERVER['REQUEST_TIME'] değişken olduğunu düşünüyorum:

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

Sonuç saniye olacaktır.

You simply can't measure anything inside the receiving script.
Just because it is started right after the upload (handled by the web-server) ends.

Svish söylediği gibi, oturumda AJAX çağrı ve zaman damgası kolay bir çözüm olacaktır.

Linke bak.

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

Bu istek apache tarafından receieved edilir zaman zaman oturum apache nasıl yapılandırılacağı gösterilmektedir.

Sonra PHP apache_request_headers fundtion kullanmak ve o zaman dışarı çıkarabilir.

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

Belki bu şekilde, apache dosyayı recieving başladığında arasındaki zamanı anlamaya ve geçerken işleme php?

Ben denemedim gibi, bazı testler yapmak gerekebilir. Eğer çalışırsa bana bildirin ... :)

UPDATE BY @GustavBertram:

Not: Her cevap için ayrı ayrı girişimini belgelemek istiyorum çünkü ben, onun yerine kendi sorunun cevabını düzenlenebilir.

Ben Apache mod_headers etkin ve aşağıdaki config dosyasını ekledi:

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

Sonra benim komut güncelleme:

<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;

Benim yerel makine üzerinde hem test ve 700MB dosya ile ağdaki uzak bir makine üzerinde.

Aklımda basit bir mantık var

resim upload için yayınlanmıştır zaman

bir değişkene başlangıç ​​zamandan tasarruf ve örneğin başka bir değişkeni ayarlayın = 0 uploadStatus, sonra yükleme uploadStatus = 1 değişkeni ayarlamak yapılır ve ayrıca başka bir değişkende bitiş zamandan tasarruf olduğunda.

UploadStatus == 1 ise yükleme çek, sonra bitiş zaman başlangıç ​​saati çıkarma ve yükleme zaman alacak.

Bu yöntem aslında oldukça Tamam çalışır gibi görünüyor:

  1. Bir oturum damgası depolayan sunucu (sağ form mesaj önce) bir ajax isteği göndermek
  2. Formu göndermeden
  3. Alıcı sonunda fark edin :)

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>

start-timer.php

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

upload.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';

Çalışma örnek: http://samples.geekality.net/upload-timer