2016-06-10 5 views
0

Wir haben eine Website, die Dateien an unsere Kunden streamt. Jetzt haben wir begonnen, Dateien größer als 300MB zu haben und ohne ersichtlichen Grund fallen die Downloads zufällig aus. Wir erhalten einen Fehler "der Download wurde unterbrochen".Datei-Downloads sind zufällig in IIS mit PHP

Wir haben uns am Server angemeldet und festgestellt, dass die PHP-Prozesse manchmal geschlossen wurden, wenn ein Download gestartet wurde, aber nichts in der Ereignisanzeige oder in den Protokollen.

Hier ist der Code, der die Downloads liefert:

public function downloadAction($asset, $csrfToken) { 
     if ($this->securityContext->isCsrfProtectionTokenValid($csrfToken) === FALSE) { 
      throw new \TYPO3\Flow\Security\Exception\AccessDeniedException(); 
     } 

     // This is a : \TYPO3\Flow\Resource\Resource 
     $resource = $asset->getResource(); 
     $stream = $resource->getStream(); 

     if (FALSE === $stream) { 
      $this->throwStatus(500); 
     } 

     try { 
      $streamMetadata = stream_get_meta_data($stream); 
      $modified = filemtime($streamMetadata['uri']); 
      $filename = $asset->getResource()->getFilename(); 

      $this->response->setStatus(200); 
      $this->response->setHeader('Content-Type', 'application/octet-stream'); 
      $this->response->setHeader('Content-Disposition', 'attachment; filename="' . $filename . '"'); 
      $this->response->setHeader('Last-Modified', gmdate('r', $modified)); 
      $this->response->setHeader('Content-Length', $asset->getResource()->getFileSize()); 
      $this->response->setHeader('Content-transfer-encoding', 'binary'); 
      $this->response->sendHeaders(); 

      @set_time_limit(86400); 

      $fileBuffer = 8192; 
      while (!feof($stream)) { 
       print(fread($stream, $fileBuffer)); 
       ob_flush(); 
       flush(); 
      } 
     } finally { 
      fclose($stream); 
     } 

     return ''; 
    } 

Hier ist unser Setup:

  • Windows Server 2008 R2
  • IIS 7.5
  • PHP 5.5.30

Was ich versuchte:

Ich versuchte, das memory_limit zu 1024Mb zu erhöhen, das Timeout zu erhöhen, um die Skript Ausführungszeit zu erhöhen und wir alle Vorteile nicht diejenigen, die aus steigenden bekommen.

Von der Ereignisanzeige, werden wir viele Fehler bekommen, wenn die Downloads fehlschlagen:

Faulting application name: w3wp.exe, version: 7.5.7601.17514, time stamp: 0x4ce7afa2 
Faulting module name: unknown, version: 0.0.0.0, time stamp: 0x00000000 
Exception code: 0xc0000005 
Fault offset: 0x0000000000d94b98 
Faulting process id: 0x26a0 
Faulting application start time: 0x01d1c3157fec8818 
Faulting application path: c:\windows\system32\inetsrv\w3wp.exe 
Faulting module path: unknown 
Report Id: 9ea4b22a-2f09-11e6-8366-00155d016700 

Faulting application name: w3wp.exe, version: 7.5.7601.17514, time stamp: 0x4ce7afa2 
Faulting module name: nativerd.dll, version: 7.5.7601.17855, time stamp: 0x4fc85321 
Exception code: 0xc0000005 
Fault offset: 0x000000000000f4d3 
Faulting process id: 0x2170 
Faulting application start time: 0x01d1c310490342e2 
Faulting application path: c:\windows\system32\inetsrv\w3wp.exe 
Faulting module path: c:\windows\system32\inetsrv\nativerd.dll 
Report Id: 9ea48b1a-2f09-11e6-8366-00155d016700 

Faulting application name: w3wp.exe, version: 7.5.7601.17514, time stamp: 0x4ce7afa2 
Faulting module name: iisfcgi.dll, version: 7.5.7601.17514, time stamp: 0x4ce7c6cb 
Exception code: 0xc0000005 
Fault offset: 0x0000000000007a47 
Faulting process id: 0x28b8 
Faulting application start time: 0x01d1c3016d933dec 
Faulting application path: c:\windows\system32\inetsrv\w3wp.exe 
Faulting module path: C:\Windows\System32\inetsrv\iisfcgi.dll 
Report Id: 82a04d74-2f03-11e6-8366-00155d016700 

Edit 1

Es ist wie Modifizierung der es bei 12000 Werke setzen Puffer ein aussieht, aber nicht um 11999. Was für eine Zauberei ist das?

Antwort

0

Offenbar setzen die $fileBuffer bei 12000 funktioniert, aber nicht bei 11999 ... Aber warum?

0

Haben Sie versucht, fread() durch readfile() zu ersetzen? Anstatt einen Datei-Handler zu öffnen, Teile der Datei über PHP zu lesen und zu übertragen, streamt er den Dateiinhalt direkt auf den Webserver.

http://php.net/manual/de/function.readfile.php

+0

Ich habe versucht, das zu tun, aber immer noch den gleichen Fehler. Das wundert mich, dass es wahrscheinlich ein IIS-Konfigurationsproblem ist ... – CoachNono

Verwandte Themen