15

为什么人们不 .php 为他们的 CSS 和文件制作 JavaScript 文件?

添加<?php header("Content-type: text/javascript; charset: UTF-8"); ?>到文件中使其可以被浏览器读取,您可以通过将Content-type属性设置为 .css 文件来执行相同的操作text/css

它允许您将 PHP 的所有变量和方法用于其他语言。例如,让您根据 css 中的用户偏好更改主题主颜色,或预加载您的 javascript 可以在文档加载时使用的数据。

使用这种技术有不好的方面吗?

4

8 回答 8

18

人们这样做的频率比你想象的要多。您只是看不到它,因为通常这种技术与 URL 重写结合使用,这意味着浏览器无法区分静态提供的 .css 文件和由 PHP 脚本生成的动态样式表。

但是,有一些强有力的理由这样做:

  • 在默认配置中,Apache 将 PHP 脚本输出视为“随时可能更改”,并设置适当的标头以防止缓存(否则,动态内容将无法正常工作)。然而,这意味着浏览器不会缓存您的 CSS 和 javascript,这很糟糕——它们会在每次页面加载时通过网络重新加载。如果你每秒有几百个页面加载,这些东西绝对很重要,即使你不这样做,页面的响应性也会受到很大影响。
  • CSS 和 Javascript,一旦部署,就很少更改,并且使其动态化的理由非常少见。
  • 运行 PHP 脚本(即使只是为了启动解释器)比只提供静态文件更昂贵,因此除非绝对必要,否则应避免使用它。
  • 确保您输出的 Javascript 正确且安全是非常困难的。转义 Javascript 的动态值并不像您想象的那么简单,如果这些值是用户提供的,那么您就是在自找麻烦。

还有一些更容易设置的替代方案:

  • 编写一些样式表并动态选择正确的样式表。
  • 根据类名制定样式表规则,并在 HTML 中动态设置这些规则。
  • 对于 javascript,在包含静态脚本之前,在父文档中定义动态部分。最典型的场景是在文档中设置一些全局变量并在静态脚本中引用它们。
  • 作为构建/部署过程的一部分,将动态脚本编译成静态文件。这样,您可以在 CSS 中使用 PHP,但您仍然可以提供静态文件。

如果你想使用 PHP 来动态生成 CSS:

  • 覆盖缓存标头以允许浏览器和代理缓存它们。您甚至可以将缓存过期设置为“从不”,并添加一个伪造的查询字符串参数(例如<link rel="stylesheet" type="text/css" href="http://example.com/stylesheet.css?dummy=121748283923">)并在脚本更改时更改它:浏览器会将其解释为不同的 URL 并跳过缓存的版本。
  • 设置 URL 重写,以便脚本的 URL 具有 .css 扩展名:某些浏览器 (IE) 在扩展名不匹配的某些情况下会因错误地获取 MIME 类型而臭名昭著,尽管Content-Type标题正确。
于 2012-08-07T20:15:46.860 回答
10

有些人会这样做,更好的做法是在 PHP 中生成 JS/CSS 脚本并将它们缓存到文件中。

如果您使用 PHP 提供所有 CSS/JS 文件,那么您必须调用更多 PHP,这会产生更多开销(cpu 和内存),这在提供静态文件时是不必要的。最好让 Web 服务器(Apache/nginx/lighttpd/iis 等)完成它们的工作并为您提供这些文件,而无需 PHP。

于 2012-08-07T19:54:53.390 回答
5

运行 PHP 引擎在时间或 CPU 方面的成本都不是零。由于 CSS 和 JavaScript 文件通常很少更改,让它们在引擎中运行以完全不做任何事情是没有意义的;最好让浏览器在适当的时候缓存它们。

于 2012-08-07T19:54:31.590 回答
2

这是我使用过的一种方法: HTML 页面包含对/path/12345.stylesheet.css. 该文件不存在。因此.htaccess将请求路由到/path/index.php. 该文件 (a) 执行数据库请求,(b) 创建 CSS,(c)保存文件以备下次使用,(d) 将 CSS 提供给浏览器。这意味着下一次请求 时/path/12345.stylesheet.css,实际上有一个物理静态文件由 Apache 照常提供。

哦,每当编辑样式规则时(a)删除静态文件,以及(b)更改引用 ID,以便 HTML 页面将来包含对 的引用/path/10995.stylesheet.css或其他任何内容。(实际上,我使用的是 UNIX 时间戳。)

我使用类似的方法来创建图像缩略图:在第一次请求时创建文件,并将静态文件保存在同一位置以供将来请求。我从来没有机会为 javascript 做同样的事情,但没有根本原因。

这也意味着我不需要担心在 PHP 中缓存标头:只有每个 CSS 文件(或图像缩略图)的第一次调用通过 PHP,如果使用反缓存标头提供服务,那不是什么大问题。

于 2012-08-07T22:30:35.637 回答
1

有时您可能必须动态创建 javascript 或样式。

问题是网络服务器经过优化以提供静态内容。使用 php 动态生成内容可能会对性能产生巨大影响,因为它需要在每个请求上生成。

于 2012-08-07T19:54:43.920 回答
1

这不是一个坏主意,或者所有不常见的,但也有缺点。缓存是一个重要的考虑因素——您需要让浏览器在内容相同时缓存,但在内容不同时刷新(例如,当其他人登录时)。任何查询字符串都会立即停止某些浏览器缓存,因此您需要一些重写规则以及 HTTP 标头。

任何需要花费大量时间或需要锁定某些东西(例如 session_start)的处理都会在浏览器等待资产时阻止浏览器。

最后,也是非常重要的一点,混合语言会使编辑代码变得更加困难——语法高亮和结构浏览器可能无法应对,重叠的语法会导致丑陋的事情,比如多个反斜杠转义。

在 javascript 中,将一些 PHP 数据转换为 (JSON) 变量,然后继续处理静态 JS 代码会很有用。在浏览器一次性下载多个 JS 文件之前连接多个 JS 文件也有性能优势。

对于 CSS,有一些特定的语言,例如更适合该目的的 Less。使用 LessPHP (http://leafo.net/lessphp/),您可以使用 PHP 脚本中的变量和回调轻松初始化 Less 模板。

于 2012-08-07T20:17:23.577 回答
0

不好的一面:很多,但仅举几例:

  • 它会很慢:为每个请求构建自定义样式表会给服务器带来巨大的负载,而不是您想要的。

  • 设计师创建 CSS 文件,程序员不应该(在某些情况下不应该被允许)。这不是他们的工作/他们的专长。

  • 恕我直言,混合 JS 和 PHP 是可能犯的最大错误之一。由于 jQuery 是一个非常流行的库,使用该$符号,它可能是错误和语法错误的巨大来源。除此之外:JS 是一种与几乎任何其他编程语言完全不同的语言。很少有人知道如何充分利用它,而让 PHP 开发人员编写大量的 JS 脚本往往以泪水告终。
    JavaScript 是一种功能性 OO(原型)语言。不完全理解这些关键差异的人会写出糟糕的代码。我知道,因为我写了很多糟糕的 JS 代码。

  • 实际上,您为什么要这样做?PHP 允许您在生成页面时更改所有元素的类,只需确保这些类在您的 css 文件中具有相应的样式规则,并且颜色会根据您的需要更改,而无需发送各种文件、弄乱标题和所有令人头疼的问题这种做法附带的

如果您想要更多不应该这样做的理由,我至少可以想到另外几十个。
也就是说:我只能想到一个你会考虑这样做的原因:它使由客户端缓存脚本引起的问题不再是问题。并不是说这首先应该是一个问题,但是嘿...

于 2012-08-07T20:02:27.983 回答
0

PHP 通常用作生成动态内容的处理器。处理页面然后发送它需要时间。为了效率(服务器和编程所花费的时间),只有在静态文件无法成功实现其预期目标的情况下,才会创建动态 JS 或 CSS 文件。

我建议仅在绝对需要动态数据库驱动处理器的帮助时才这样做。

于 2012-08-07T19:53:46.410 回答