Arka planda bir ffmpeg işlemini çalıştırmak

3 Cevap php

Ben php. Flv video dönüştürmek için ffmpeg kullanmak isteyen duyuyorum. Şu anda bu çalışma var, ama dosya yüklenir ve bitmesini tarayıcı duruyor. Döndürülen PID kullanarak süreci güncelleme ederken, arka planda bir exec () işlemini çalıştırmak için nasıl php dokümanlar bakarak edilmiştir. İşte ne buldum:

//Run linux command in background and return the PID created by the OS
function run_in_background($Command, $Priority = 0)
{
    if($Priority)
        $PID = shell_exec("nohup nice -n $Priority $Command > /dev/null & echo $!");
    else
        $PID = shell_exec("nohup $Command > /dev/null & echo $!");
    return($PID);
}

Ben arka plan görevi iade PID kullanarak çalışıyorsa izlemek için kullanabileceğiniz bir hile de var:

//Verifies if a process is running in linux
function is_process_running($PID)
{
    exec("ps $PID", $ProcessState);
    return(count($ProcessState) >= 2);
}

Ben daha sonra bu işlevlerden birini çalıştırmak için php cli çalışan bir ayrı. Php dosyası oluşturmak için varsayalım muyum? Ben sadece bu çalışma almak biraz dürtmek gerekir ve sonra ben oradan alabilir.

Teşekkürler!

3 Cevap

Am I suppose to create a separate .php file which then runs from the php cli to execute one of these functions?

Bu muhtemelen ben bunu yapacağını yoludur:

  • the PHP webpage adds a record in database to indicate "this file has to be processed"
    • ve kullanıcıya bir mesaj görüntüler; "dosya yakında işlenecektir" gibi bir şey
  • In CLI, have a batch process the new inserted files
    • İlk, "işlem" olarak rekor işaretlemek
    • ffmpeg şey
    • "işlenmiş" gibi dosyayı işaretleyin
  • And, on the webpage, you can show to the user in which state his file is :
    • henüz işleme edilmemiş ise
    • Bu işleniyor eğer
    • veya işlendikten eğer - o zaman yeni video dosyası için ona link verebilir.

İşte diğer düşünceler bir çift:

  • The day your application becomes bigger, you can have :
    • bir "web sunucusu"
    • Birçok "işleme sunucuları"; uygulamanızda, web sayfaları hizmet değil, CPU çok gerektirecektir ffmpeg şey; böylece, o kısmı ölçek edememek güzel (başka bir DB "işlem" olarak belirten, dosyaları "kilitlemek" için var: bu şekilde, aynı dosyayı işlemek için çalışırken birkaç işleme sunucuları olmaz)
  • You only use PHP from the web server to generate web pages, which is je job of a web server
    • Ağır / Uzun işleme bir web sunucusu iş değil!
    • Eğer "işleme" bölümü için PHP daha başka bir şey geçmek isteyeceksiniz gün, daha kolay olacak.

Sizin "işleme script" dakika her çift başlatmak olurdu; Eğer bir Linux gibi makinede eğer, bunun için cron kullanabilirsiniz.


Edit : a bit more informations, after seeing the comment

Işleme kısmı CLI'den yapılır, ve Apache gelen, "arka plan" manipülasyonlar anykind ihtiyacım yok gibi: sadece bütün çıktıya dönecektir ki, shell_exec kullanabilirsiniz yapıyor bitince PHP komut dosyası için bu işi komut bulunuyor.

"Işleme" diyerek web sayfasını izlerken kullanıcı için, arka plan işleme gibi gözükecek; işleme (hatta belki de başka bir makinede) başka processus tarafından yapılacaktır olarak ve, bir bakıma, bu olacak.

Ama, sizin için, o çok daha basit olacak:

  • bir web sayfası (hiçbir şey "arka plan")
  • ya hiç plan malzeme ile bir CLI komut dosyası.

Sizin işleme komut böyle bir şey gibi görünebilir, sanırım:

// Fetch informations from DB about one file to process
// and mark it as "processing"

// Those would be fetched / determined from the data you just fetched from DB
$in_file = 'in-file.avi';
$out_file = 'out-file.avi';

// Launch the ffmpeg processing command (will probably require more options ^^ )
// The PHP script will wait until it's finished : 
//   No background work
//   No need for any kind of polling
$output = shell_exec('ffmpeg ' . escapeshellarg($in_file) . ' ' . escapeshellarg($out_file));

// File has been processed
// Store the "output name" to DB
// Mark the record in DB as "processed"

Really easier than what you first thought, isn't it ? ;-)
Just don't worry about the background stuff anymore : only thing important is that the processing script is launched regularly, from crontab.


Hope this helps :-)

(Daha sonra, kuyruk sistemi çeşit uygulamak eğer isteyebilirsiniz rağmen) Bunu yapmak için ayrı bir php komut dosyası yazmak gerekmez.

You're almost there. The only problem is, the shell_exec() call blocks to wait for the return of the shell. You can avoid this if you redirect all output from the command in the shell to wither a file or /dev/null and background the task (with the & operator). So your code would become:

//Run linux command in background and return the PID created by the OS
function run_in_background($Command, $Priority = 0)
{
    if($Priority) {
        shell_exec("nohup nice -n $Priority $Command 2> /dev/null > /dev/null &");
    } else {
        shell_exec("nohup $Command 2> /dev/null > /dev/null &");
    }
}

Ne yazık ki, PID almak için herhangi bir yolu olduğunu sanmıyorum.