Apache / PHP uzmanlar?

4 Cevap php

Ben kimliği doğrulanmış kullanıcıların dosyaları indirmek için erişim vermek için kullanabileceğiniz bir web sayfası var. Kök klasöre dosya (normalde HTTP erişilebilir değil) vardır, ve ben dosya indirme başlar web sayfası oluşturmak için bir PHP komut dosyası ve fopen işlevini kullanın. Bu (200KB altında hepsi) dosyaları için üç mükemmel çalışır, ancak dördüncü dosyası - 40MB - bir boş dosya olarak kaydeder.

Ben bir HTTP erişilebilir klasörüne 40MB dosyayı taşırsanız, dosyaya bir bağlantı çalışıyor, ama tabii ki ben istiyorum kısıtlı erişim sağlamaz.

Ben dosya PHP tarafından tespit ediliyor ki komut doğruladı, ancak başlıkları gönderilir nedense, için, 40MB dosya anında indirme bitirir ve 0KB olduğunu.

Komik bir şey bu kod ancak üretim sunucusunda, benim yerel kalkınma sunucuda çalışıyor, olduğunu. Her ikisi de PHP aynı sürümünü (5.2.10) çalıştıran ve bellek ve yürütme zamanı (32M ve 30secs) için aynı ayarları vardır. Ben üretim memory_limit ve max_execution_time değerleri (64M ve 60secs için) darbeleme denedim ama hiçbir etkisi vardı.

Herhangi bir fikir? İşte (dosya isimleri cahil korumak için değiştirildi) benim PHP komut dosyası:

<?php
// Download filename given in the $_GET['filename'] variable
$filepath = $_SERVER['DOCUMENT_ROOT'] . '/../';
if (isset($_REQUEST['type'])) {
 switch (strtoupper($_REQUEST['type'])) {
 case 'EVAL':
  $filename = "littlefile1.zip";
  break;
 case 'EXE':
  $filename = "bigfile.zip";
  break;
 case 'RPT':
  $filename = "littlefile2.zip";
  break;
 case 'UPD':
  $filename = "littlefile3.zip";
  break;
 default:
  die();
 }


 header("Content-Disposition: attachment; filename=" . $filename);
 header("Content-Length: " . filesize($filepath . $filename));
 header("Content-Type: application/octet-stream");
 $fp=fopen($filepath . $filename, 'rb');
 fpassthru($fp);
 ob_flush();
 fclose($fp);
}
?>

Şimdiden teşekkürler!

Greg'in yorumuna cevaben, ben almak başlık hata şuna benzer:

Date: Sun, 29 Nov 2009 19:58:16 GMT
Server: Apache/2.2.3 (Red Hat)
X-Powered-By: PHP/5.2.10
Content-Disposition: attachment; filename=bigfile.zip
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Length: 44964864
Connection: close
Content-Type: application/octet-stream

500 Internal Server Error

4 Cevap

ayarlarsanız error_reporting(E_ALL); Eğer hata her türlü alabilirim?

Gördüğüm tek şey komut dosyası zaman sınırı ve bazı bellek sorun olurdu ama size hem kontrol söyledi beri.

Eğer () (ob_start ile) çıktı tamponlama kullanıyor musunuz? Eğer değilse, yerine ob_flush ve floş () () kullanmanız gerekir ve dosyayı göndermeden önce onu aramak zorunda. Güvenliği, siz de çıktı tamponu temizlemek için () ob_clean çağırabilir. BTW, readfile () (), fpassthru () ve fclose () fopen kullanmak zorunda sizi kurtarır.

<?php
// Download filename given in the $_GET['filename'] variable
$filepath = $_SERVER['DOCUMENT_ROOT'] . '/../';
filenames['EVAL'] = "littlefile1.zip";
filenames['EXE'] = "bigfile.zip";
filenames['RPT'] = "littlefile2.zip";
filenames['UPD'] = "littlefile3.zip";
if (isset($_REQUEST['type'])) {
 $filename = filenames[strtoupper($_REQUEST['type'])];
 if (!empty($filename) && file_exists( $filepath . $filename)) {
   header("Content-Disposition: attachment; filename=" . $filename);
   header("Content-Length: " . filesize($filepath . $filename));
   header("Content-Type: application/octet-stream");
   flush();
   ob_clean();
   readfile($filepath . $filename);
 }
 exit;
}

Sana bir sağlayıcı 0'a set error_reporting olan bira, ya da bir günlük dosyasına yönlendirilir hataları bahse girerim, ve dolayısıyla bazı hata oluştuğunda ancak rapor almaz.

  • Eğer ["type"] $ _REQUEST bir test çıkış yapabilir miyim? Bu sizin switch ifadesinde boş ya da değil o olabilir mi?

  • Eğer kasıtlı olarak ölümcül bir hata neden olacak bir şey eklemek, ve isimli boş kalır olup olmadığını görebilirsiniz?

  • RageZ önerisi olarak, E_ALL için error_reporting ayarlayabilirsiniz?

  • Belki hatalar çıktıda gösterilmeyen varsayılan, ama bir iç hata günlük dosyasına yönlendirilir. Bunun böyle olup olmadığını sağlayıcınız ile kontrol edebilirsiniz? Belki hata günlüklerini görüntülemek için bir giriş alanı var, ya da dizin yapısı içerisinde bir yere saklanır?

Content-jar; filename = Jobchart.msi

Bu dosya gerçekten var mı?