对于为静态资源添加前缀的变量,什么是一个好策略?

时间:2011-01-25 07:19:05

标签: php scalability static-resource

我们正在扩展一个网站,我们希望计划未来我们可能希望在子域中(或者甚至可能是一个单独的域,例如CDN)托管我们的图像。我们目前使用以下HTML在HTML / PHP代码中引用图像:

<img src="/images/ourlogo.jpg" alt="Our Logo" />

我正在考虑启动公司大会,以便:

<img src="<?php echo STAT_IMG;?>ourlogo.jpg" alt="Our Logo" />

其中STAT_IMG是一个全局PHP常量,最初定义为与当前情况相同,即

define('STAT_IMG', '/images/');

但稍后可以更改为:

define('STAT_IMG', 'http://www.superfastcdn.com/');

我会遇到任何问题吗?

我已经考虑过的事情:

  • 我可以看到代码库中会有更多字符串附加内容 - 但我不认为它在性能方面会引人注目。
  • 它使代码变得更加丑陋(特别是在我的示例中混合了PHP和HTML )。
  • 有一个问题是,有时您需要明确使用https作为图像(或副版本)。例如,如果您将图像放入电子邮件中,则许多客户端(例如gmail)使用https协议,因此引用http(即未加密协议)的资源将在某些浏览器中生成混合内容警告(例如IE )。 This article from encosia有一个想法,可以通过将STAT_IMG定义为“无协议”来解决此问题,例如define('STAT_IMG', '//www.superfastcdn.com/');。我希望他们的想法有效。
    • 我们可能需要一些其他常量来明确定义协议,例如define('STAT_IMGS', 'https://www.example.com/images/');define('STAT_IMGNS', 'http://www.example.com/images/');以及之前的非绝对版本(define('STAT_IMG', '/images/');)。
  • 我需要将相同的策略应用于其他静态资源,例如javascript和CSS样式表。

1 个答案:

答案 0 :(得分:2)

听起来你需要的是一个函数 - 这就是在Rails,Symfony和Django这样的框架中处理它的方式。一般来说,封装逻辑是一个好主意,因此您不必为给定的设计更改而更新自己的位置。

对于初学者,您可以将其放在所有模板中通用的位置:

<?

$my_domain = "something.com";

function static_url($relative_path, $SSL=false) {
  $prefix = $SSL ? 'https' : 'http';
  return "{$prefix}://{$my_domain}{$relative_path}";
}

然后,你可以把它作为你的模板:

<img src="<?=static_url('images/ourlogo.jpg'); ?>" />

或者,如果您需要https:

<img src="<?=static_url('images/ourlogo.jpg', true); ?>" />