0

我有一个即时缩略图系统,并且正在努力寻找最佳方式来确保它在提供图像时尽可能快。这是当前的流程:

  • 用户请求缩略图thumbnails/this-is-the-image-name.gif?w=200&h=100&c=true
  • htaccess 文件使用 modrewrite 将请求从该文件夹发送到 PHP 文件
  • PHP 文件file_exists()根据查询字符串值检查请求的图像

如果是这样:

header('content-type: image/jpeg'); 
echo file_get_contents($file_check_path); 
die();

如果不是,它会创建缩略图并返回它。

我的问题是是否有办法将其优化为更快?理想情况下,我的 htaccess 文件会执行 file_exists 并且仅在它不存在时将您发送到 PHP 文件……但由于我使用的是查询字符串,因此无法构建动态 URL 来检查. 是否值得从查询字符串切换到实际的文件请求,然后在 htaccess 中进行存在检查?那会更快吗?我更喜欢查询字符串语法,但目前所有请求都转到 PHP 文件,该文件返回图像,无论它们是否存在。

感谢您提前输入!

4

1 回答 1

1

理论上你应该可以做到这一点。该RewriteCond命令有一个标志-f,可用于检查文件是否存在。你应该能够有这样的规则:

# If the file doesn't exist
RewriteCond %{REQUEST_FILENAME} !-f

# off to PHP we go
RewriteRule (.*)   your-code.php [L,QSA]

这里的转折是我想你是根据传入的参数来命名文件——所以上面的例子可能是thumbnails/this-is-the-image-name-200-100.gif. 如果是这种情况,您将需要生成一个文件名以进行动态测试,并检查它而不是REQUEST_FILENAME-- 详细信息确实特定于您的设置。如果可以的话,我会推荐某种不需要太多努力的系统。例如,您可以将缩略图存储到文件系统中的目录结构中,例如/width/height/filename,这比在重写规则中更容易检查,modified-filename-width-height.gif.

如果您还没有检查过,Apache 的 mod_rewrite 指南有很多不错的示例。

更新:因此,您实际上需要从外观上检查动态文件名。我认为做这样的事情最简单的方法是将你生成的文件名粘贴到环境变量中,就像这样(我从你的另一个问题中借来充实这个):

# generate potential thumbnail filename
RewriteCond %{SCRIPT_FILENAME}%{QUERY_STRING} /([a-zA-Z0-9-]+).(jpg|gif|png)w=([0-9]+)&h=([0-9]+)(&c=(true|false))

# store it in a variable
RewriteRule .* - [E=thumbnail:%1-%2-%3-%4-%6.jpg]

# check to see if it exists
RewriteCond %{DOCUMENT_ROOT}/path/%{ENV:thumbnail} !-f 

# off to PHP we go
RewriteRule (.*)   thumbnail.php?file_name=%1&type=%2&w=%3&h=%4&c=%6 [L,QSA]

这是完全未经测试的,并且肯定无法正常工作。我会推荐其他几件事:

另外,我给您的一个重要建议是,如果可能,请打开日志记录并设置RewriteLogLevel为高级别。重写规则的日志可能非常复杂,但绝对可以让您了解正在发生的事情。您需要服务器访问权限才能执行此操作——如果我记得的话,您不能将日志记录配置放在 .htaccess 文件中。

于 2011-06-14T18:25:22.227 回答