Komut satırından İlerleme Capture

2 Cevap php
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 12.4M  100 12.4M    0     0  4489k      0  0:00:02  0:00:02 --:--:-- 4653k

Yukarıdaki komut satırından bir CURL çıktı indir dosyasıdır. Ben şöyle PHP kullanarak bu esir var, ama ben yüzde yapılması ayıklamak için pre_match kullanmak nasıl çalışıyor sorun yaşıyorum.

$handle = popen('curl -o '.VIDEOPATH.$fileName.'.flv '.$url, 'rb');

while(!feof($handle))
{
    $progress = fread($handle, 8192);
    //I don't even know what I was attempting here
    $pattern = '/(?<Total>[0-9]{1,3}\.[0-9]{1,2})% of (?<Total>.+) at/';
    //divide received by total somehow, then times 100
    if(preg_match_all($pattern, $progress, $matches)){
    fwrite($fh, $matches[0][0]."\r\n");
    }

}

Bunu nasıl yapabilirim? Lütfen dikkat, ben yukarıdaki preg_match_all yapıyorum hiç bir fikrim yok!

Teşekkürler

Update

Teşekkürler to the help of ylebre. I have this so far.

$handle = popen('curl -o '.VIDEOPATH.$fileName.'.flv '.$url.' 2>&1', 'rb');//make sure its saved to videos

while(!feof($handle))
{

    $line = fgets($handle, 4096); // Get a line from the input handle
    echo '<br>Line'.$line.'<br>';
    $line = preg_replace("/s+/", " ", $line); // replace the double spaces with one
    $fields = explode(" ", $line); // split the input on spaces into fields array
    echo '<br>Fields: '.$fields[0];
    fwrite($fh, $fields[0]); // write a part of the fields array to the output file

}

Ben tarayıcı bu çıktıyı almak:


Satır% Toplam% Zamanı% Xferd Ortalama Hız Zaman Zaman Zaman Güncel

Fields: Line Dload Upload Total Spent Left Speed

Fields: Line 0 1340k 0 4014 0 0 27342 0 0:00:50 --:--:-- 0:00:50 27342 41 1340k 41 552k 0 0 849k 0 0:00:01 --:--:-- 0:00:01 1088k 100 1340k 100 1340k 0 0 1445k 0 --:--:-- --:--:-- --:--:-- 1711k

Fields: Line


Ben yüzde bölümü nasıl tek ayıklamak? Belki CURL başına yapabilirsiniz - hmm bu konuda bir soru soracaktır.

2 Cevap

Gösteriyor ilerleme muhtemelen aynı noktada bilgilerin güncellenmesi, bu yüzden size tam ayrıştırma bilmek eğer yardımcı olacaktır.

Ben tavsiye sonraki adım girişi bir satır alarak ve bu konuda çalışmak için regexpi almak için çalışıyor.

Ben doğru çıktı okuyorum eğer Ayrıca sadece mekânlarda dize bölünmüş olabilir. Eğer tek bir bütün çift boşluk değiştirerek işe başlamak durumunda. Bundan sonra içinizde ne bir göz atmanız için print_r olabilir değerleri ile bir dizi, elde etmek için () patlayabilir kullanabilirsiniz.

Bu gibi bir şey olurdu:

$line = fgets($handle, 4096); // Get a line from the input handle
$line = preg_replace("/s+/", " ", $line); // replace the double spaces with one
$fields = explode(" ", $line); // split the input on spaces into fields array
fwrite($fh, $fields[0]); // write a part of the fields array to the output file

Sürece alanlarında sipariş aynı kalır gibi, çıkan dizi size tutarlı bir sonuç vermelidir.

Bu yardımcı olur umarım!

PHP 5.3 erişiminiz varsa, size çok daha zarif bir çözüm sonuçlanır CURL_PROGRESSFUNCTION seçeneği, (hiçbir ayrıştırma çıkış) kullanabilirsiniz. İşte bunu kullanmak için nasıl bir örnek:

function callback($download_size, $downloaded, $upload_size, $uploaded)
{
  $percent=$downloaded/$download_size;
  // Do something with $percent
}

$ch = curl_init('http://www.example.com');

// Turn off the default progress function
curl_setopt($ch, CURLOPT_NOPROGRESS, false);

// Set up the callback
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'callback');

// You'll want to tweak the buffer size.  Too small could affect performance.  Too large and you don't get many progress callbacks.
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);

$data = curl_exec($ch);