PHP ile dosya download ve bandwidth yönetimi
PHP ile dosyanızın gerçek yerini ve ismini göstermeden download ettirebilmek çokça yapılan, yapılmaya çalışılan ya da forumlarda filan sorulan bir sorudur. Ben geçenlerde bu soruyu download edilen dosyanın download edilme hızını ayarlayabilme konusunu da ekleyerek geniÅŸleteyim istedim. Geçenlerde bana lazım oldu, varolan teknikleri inceleyerek en son ÅŸöyle bir kod hazırladım. Download limitini yaklaşık 10Kbyte olarak belirliyor bu script, isterseniz ayarları ile oynayarak daha hızlı download imkanı da verebilirsiniz.
Kodu hazırladığım bir sitede kullanıyorum, ÅŸu ana kadar bir performans sıkıntısı görmedim. Bandwidth limitlemesi ile ilgili daha kapsamlı ve muhtemelen performanslı bir Apache çözümü arıyorsanız Cband modulünü inceleyebilirsiniz.
//yaklaşık 10Kbyte/sn download limiti için $packet_interval = 1; # 1=> yavas, 0.5 => orta, 0.3 => hızlı $packet_size = (10 * 1042); # 10 => yavas, 40=> orta, 90=> hızlı $file = './dosya.mp3'; # dosyanın tam adresi olmalı $fileSize = filesize($file); //örnek mp3 olduğu için mp3 için gerekli headerları gönderelim header("Content-Type: audio/mpeg"); // Dosya adını özellikle değiştiriyorum ki dosya adı ve adresi öğrenilemesin header("Content-Disposition: attachment; filename=\"downloaddosya.mp3\""); header("Content-Length: " . $fileSize); $fh = fopen($file, 'rb'); while(!feof($fh)) { # başlangıç zamanı list($usec, $sec) = explode(' ', microtime()); $time_start = ((float)$usec + (float)$sec); # gönderilecek paket büyüklüğü print(fread($fh, $packet_size)); # bitiş zamanı list($usec, $sec) = explode(' ', microtime()); $time_stop = ((float)$usec + (float)$sec); # gönderilecek paket büyüklüğü aralıktan büyükse scripti bekletelim $time_difference = $time_stop - $time_start; if($time_difference < (float)$packet_interval){ usleep((float)$packet_interval * 1000000 - (float)$time_difference * 1000000); } }
























Murat Çorlu dedi ki: ,
Tarih : January 27, 2008 @ 2:31 am
Eline sağlık Uğur. Kütüphaneme ekliyorum hemen :)
Burak YiÄŸit KAYA dedi ki: ,
Tarih : January 30, 2008 @ 12:53 pm
Benzer bir hız limitleme mantığını daha önce hazırladığım masaüstü programda kullanmıştım. Çalışmakla birlikte sleep işlevi işlemciyi dondurduğundan çok da sunucu dostu bir işlev değil bence.
Yine de eline sağlık :)
ugur dedi ki: ,
Tarih : January 30, 2008 @ 1:56 pm
“İşlemciyi dondurmak” biraz ağır bir tabir bence, çünkü uzun süreler için iÅŸlemciyi bekletmiyorsanız usleep o kadar performanssız bir fonksiyon deÄŸil. Evet haklısınız, problemi çözmek için en performanslı çözüm belki bu olmayabilir ancak, PHP ile yapılabilecek çözümler arasında en performanslılardan biri olduÄŸu kesin. Scripti bekletmek konusunda en performanslı fonksiyon da usleep zaten. Daha etkili bir çözüm için yazımda da bahsettiÄŸim gibi cband modülü kurulabilir.
Yorumunuz için teşekkür ederim.