为什么PHP文件不用于(自定义)CSS和JS

Why aren't PHP files used for (custom) CSS and JS?

本文关键字:CSS JS 自定义 PHP 文件 用于 为什么      更新时间:2023-09-26

为什么人们不 为他们的CSSJavaScript文件制作.php文件?

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

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

使用这种技术有什么不好的一面吗?

人们这样做的频率比你想象的要高。你只是看不到它,因为通常这种技术与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标头正确。

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

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

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

这是我使用的一种方法: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,如果与反缓存标头一起提供,那就没有大问题了。

有时你可能不得不动态创建javascript或样式。

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

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

任何需要明显时间或需要锁定某些内容(例如 session_start)的处理都会在等待资产时阻止浏览器。

最后,也是相当重要的是,混合语言会使编辑代码变得更加困难 - 语法突出显示和结构浏览器可能无法应对,并且重叠的语法会导致诸如多个反斜杠转义之类的丑陋事情。

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

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

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

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

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

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

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

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

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

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