CakePHP-CakeResponse::File非常慢

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(__('

我需要将文件提供给经过身份验证的用户,并认识到使用PHP会带来性能损失,但我迄今为止所经历的似乎是行不通的

我有一个非常简单的控制器操作,它发送文件:

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,干杯。