我有以下控制器/动作:
<?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应用程序只是为了提供一个图像。在网站上有很多图像,这是一个很大的性能问题。任何想法如何解决这个问题?
答案 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服务器提供它们。