2016-06-10 130 views
0

我们有一个网站可以将文件传输给我们的客户。现在,我们开始使用大于300Mb的文件,并且没有明显的原因,下载内容随机失败。我们收到“下载被中断”错误。文件下载在IIS中随机失败PHP

我们登录到服务器,发现PHP进程有时会在下载开始时关闭,但事件查看器或日志中没有任何重要的内容。

下面是提供的下载代码:

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 ''; 
    } 

这里是我们的设置:

  • 的Windows Server 2008 R2
  • IIS 7.5
  • PHP 30年5月5日

我的尝试:

我试图增加memory_limit的到1024MB,增加超时,增加了脚本的执行时间,我们没有从提高这些得到任何好处。

从事件查看器,我们得到了很多的错误,当下载失败:

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 

编辑1

它看起来像修改,以12000个工作缓冲区的投入,但而不是11999.这是什么样的魔法?

回答

0

显然,把$fileBuffer12000作品,但不是在11999 ...但是,为什么呢?

0

你试过用readfile()替换fread()吗?它不是打开文件处理程序,而是通过php读取和传输文件块,它直接将文件内容传输到网络服务器。

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

+0

我试图做到这一点,但仍然有同样的错误。这让我想知道它可能是一个IIS配置问题... – CoachNono