CakePHP-CakeResponse::File非常慢
我需要将文件提供给经过身份验证的用户,并认识到使用PHP会带来性能损失,但我迄今为止所经历的似乎是行不通的 我有一个非常简单的控制器操作,它发送文件:CakePHP-CakeResponse::File非常慢,cakephp,cakephp-2.4,Cakephp,Cakephp 2.4,我需要将文件提供给经过身份验证的用户,并认识到使用PHP会带来性能损失,但我迄今为止所经历的似乎是行不通的 我有一个非常简单的控制器操作,它发送文件: public function view($id = null) { $id = $id | $this->params->named['id']; if (!$this->Attachment->exists($id)) { throw new NotFoundException(__('
public function view($id = null) {
$id = $id | $this->params->named['id'];
if (!$this->Attachment->exists($id)) {
throw new NotFoundException(__('Invalid attachment'));
}
$this->autoRender = false;
$this->Attachment->recursive = -1;
$file = $this->Attachment->findById($id);
$this->response->file(APP . DS . $file['Attachment']['dir']);
return $this->response;
}
使用此方法加载一个小的(55 KB)PNG文件需要8秒,如果我将文件移动到webroot目录并直接加载,则不到2.5秒。从Chrome开发工具来看,“接收”部分的响应时间超过7秒(而直接响应时间为1.5秒)
一个中等大小的PDF文件(2.5MB)通过CakerResponse需要2分钟以上,而直接使用约4分钟。我肯定在控制器的操作中遗漏了什么,因为这对任何人来说都是不可行的
编辑:CakePHP版本是2.4.1。多亏了使用Xdebug的建议,我才能够快速找到问题所在 在CakerResponse中,有以下功能:
/**
* Flushes the contents of the output buffer
*
* @return void
*/
protected function _flushBuffer() {
//@codingStandardsIgnoreStart
@flush();
@ob_flush();
//@codingStandardsIgnoreEnd
}
显然,使用错误抑制操作符调用flush
和ob_flush
通常不会导致问题
不过,我也安装了Sentry作为远程调试工具。这将忽略错误抑制运算符,报告没有要刷新的缓冲区(因为尚未调用ob_start),并在执行此操作时将文件内容输出到日志文件 听起来很可疑。我建议从使用Xdebug或类似工具分析请求开始,知道时间到底花在哪里可能会给您一个线索。ps,请始终提及您的确切CakePHP版本!编辑以添加蛋糕版本。来看看Xdebug,干杯。