AJAX - çalıştırılan bir kabuk komut için İlerleme çubuğu

3 Cevap php

Ben sitemde AJAX kullanımı yapıyorum ve benim sunucu tarafından indirilmekte olan bir dosyanın kullanıcıları ilerleme göstermek istiyorum.

Indir komut dosyası tarafından yapılır outputs a percentage to the shell. Ben geri AJAX kullanarak kullanıcıya bu bilgi geçmek istiyorum. Bunu nasıl yapabilirim?

Herhangi bir yardım ve yön için teşekkür ederiz.

Ben senin çözümleri bir metin dosyasına yazma ve metin dosyadan yüzdesi alınıyor içermeyen umut! Başının üzerinde çok fazla sanırım.

EDIT - More Info

Bu bir Linux Kabuk komut - Fedora Core 10.

Şu anda bu kabuk çıkış gibi görünüyor nasıl:

[download]   9.9% of 10.09M at 10.62M/s ETA 00:00

Yüzde değişiklikler ve ben yakalamak ve onu değiştirir gibi kullanıcıya geri göndermek istiyoruz.

Bu yürütmek için, ben PHPs exec () fonksiyonu kullanır.

3 Cevap

Bunun yerine exec, kullanmak olabilir popen. Bu size o olur gibi komut üretir çıktı kapmak için freadla kullanabileceğiniz bir tanıtıcı verecektir.

Bunu yüzde göstergesi yapar güncelleştirmeleri ayrıştırmak gerekir. Eğer bu verileri var sonra, örneğin, bir müşteri bunu alabilir bir kaç yolu vardır Bir "comet" tarzı itme ile, ya da güncellemeleri için bir Ajax isteği anket var.

Ben denemedim, ama bu yaklaşım işe yarayacağını düşünüyorum.

Üç adet gerekecektir:

  1. Kabuk Script çıkışı bağlantı noktasına bağlı netcat kendi akışı var
  2. Gelen akışı dinlerken bir php komut bitmiş yüzdesi w / memcache bir kayıt ya da veritabanını güncelleyerek, gelen veri portu söylediler.
  3. Web komut periyodik backend mağaza bu değeri denetler sunucuya, ajax çağrıları yapmak var.

Ben benzer bir sorun üzerinde çalışıyorum. Benim video dönüştürme kabuk komut dosyası çıkışını ayrıştırmak zorunda. I-popen kullanımı ve çıkışını ayrıştırmak döndürülen resource. İlk başta ben kullandım fgets ama bu yeni çizgiler olarak güncelleştirilmiş değerleri tanımadı. Yani bu alan için basit bir fonksiyon yarattık isteğe bağlı $arg_delimiter böylece chr(13) cariage dönüş gibi diğer dönüş türleri için kontrol edebilirsiniz. Örnek kod benim durumumda bu fonksiyonlar benim ayrıştırıcı nesne üzerinde yöntemleri çünkü biraz değiştirilmiş ve bunun denenmemiştir.

function get_line ($arg_handle, $arg_delimiter = NULL)
{
  $delimiter = (NULL !== $arg_delimiter) ? $arg_delimiter : chr(10);
  $result    = array();

  while ( ! feof($arg_handle))
  {
    $currentCharacter = fgetc($arg_handle);

    if ($delimiter === $currentCharacter)
    {
      return implode('', $result);
    }

    $result[] = $currentCharacter;
  }

  return implode('', $result);
}

Ben sadece popen() resource bu gibi gelen sonuçlar üzerinde döngü:

  $command = '/usr/bin/yourcommand';
  $handle  = popen($command . ' 2>&1', 'r');

  while ( ! feof($handle))
  {
    $line = get_line($handle, chr(13));

    preg_match($yourParserRegex, $line, $data);

    if (count($data) > 0)
    {
      printf("<script type='text/javascript'>\n  //<![CDATA[\n    window.alert('Result: %s');\n  // ]]>\n</script>"
            ,$data[1]
            );
      flush();
    }

  }

Şimdi yapmanız gereken tüm kuyruklu şeyleri anlamaya olduğunu.