使用Yii在Web应用程序文件夹之外提供图像,性能问题

时间:2014-01-17 17:38:48

标签: php image performance yii

我有以下控制器/动作:

<?php

class ImageController extends CController {

    public function actionView($folder, $name) {

        $ds = DIRECTORY_SEPARATOR;

        $file = Yii::app()->params['images_path'] . $ds . $folder . $ds . $name;

        $content = file_get_contents($file);

        Yii::app()->request->sendFile($file, $content);
    }

}

这将是一个基本的图像服务行动。我的图像位于Web根文件夹之外。问题是如何优化文件的读取。似乎每个请求都执行整个Yii应用程序只是为了提供一个图像。在网站上有很多图像,这是一个很大的性能问题。任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

实际上sendFile()用于提供下载而不是查看文件内容。 老实说,我无法理解你想要做什么,但从我的实践 - sendFile()的文件可能会被破坏。有不同的原因,其中一个是日志记录,它也会导致一些性能问题。 删除除CFileLogRoute之外的所有记录器。 可以在config或基本控制器中完成:

public function disableProfilers()
{
    if (Yii::app()->getComponent('log')) {
        foreach (Yii::app()->getComponent('log')->routes as $route) {
            if (in_array(get_class($route), array('CProfileLogRoute', 'CWebLogRoute', 'YiiDebugToolbarRoute','DbProfileLogRoute'))) {
                $route->enabled = false;
            }
        }
    }
}

然后您的下载操作将是

    public function actionDownloadFile()
    {
        $this->disableProfilers();        
        $file = '/path/to/file/some_file.txt';
        Yii::app()->request->sendFile(basename($file),file_get_contents($file));
    }

使用php和file_get_contents提供文件是有效的操作,因此如果要提供大量图像 - 通过HTTP服务器提供它们。