将php作为css/js服务:速度够快吗?有什么缺点?
我最近开始进入优化性能和加载时间客户端、压缩css/js、gzip、关注YSlow等领域 我想知道,在尝试实现所有这些微优化的同时,将php文件作为css或javascript提供有哪些优点和缺点 我不完全确定瓶颈在哪里,如果有的话。我假设在相同的css和php文件之间,“纯”css文件会稍微快一点,因为它不需要解析php代码。但是,在php文件中,您可以对标题进行更多的控制,这可能更重要(?) 目前,我正在对一个“触发器”文件执行将php作为css/js服务:速度够快吗?有什么缺点?,php,javascript,css,optimization,performance,Php,Javascript,Css,Optimization,Performance,我最近开始进入优化性能和加载时间客户端、压缩css/js、gzip、关注YSlow等领域 我想知道,在尝试实现所有这些微优化的同时,将php文件作为css或javascript提供有哪些优点和缺点 我不完全确定瓶颈在哪里,如果有的话。我假设在相同的css和php文件之间,“纯”css文件会稍微快一点,因为它不需要解析php代码。但是,在php文件中,您可以对标题进行更多的控制,这可能更重要(?) 目前,我正在对一个“触发器”文件执行filemtime()检查,并使用一些php巫术从中编写一个压缩
filemtime()
检查,并使用一些php巫术从中编写一个压缩css文件,与定义组中的其他几个文件组合。这将创建一个文件,如css/groupname/301469778.css
,php模板将捕获该文件并用新文件名更新html标记。这似乎是最安全的方法,但我真的不喜欢服务器缓存在多次编辑后被垃圾css文件填满。我也不会为那些只为特定页面加载的小“助手”css文件而烦恼
- 如果99%的输出都是由php生成的,那么使用php直接输出css/js内容有什么害处(如果有的话)?(假设没有php错误)
- 如果使用php,那么
mod\u重写文件以使用css/js扩展来处理浏览器误解的边缘情况是否是一个好主意?不会受伤吧?不需要
- css和javascript是否有单独的指南/方法?我认为他们是平等的
- 哪个更快:一个css文件包含多个
,还是一个php文件包含多个@导入
调用readfile()
- 使用php还有哪些方式影响速度
- 一旦文件缓存在浏览器中,它是否会产生影响
我更喜欢将php与.htaccess结合使用,因为它要简单得多,但最终我将使用最好的方法。你说的是通过php提供静态文件,这样做没有什么意义,因为它总是比Apache提供普通文件慢。CSS@import比PHP的readfile()更快,但是通过提供一个组合了所有需要使用的CSS的小型CSS文件,可以获得最佳性能 如果听起来你是在正确的轨道上。我建议您预处理CSS并保存到磁盘。如果需要为缓存之类的事情设置特殊的头,只需在VirtualHost指令或.htaccess文件中执行此操作 为了避免大量的缓存文件,您可以对缩小的CSS使用简单的文件命名约定。例如,如果您的主CSS文件名为main.CSS,并且它通过@imports引用reset.CSS和forms.CSS,那么缩小的版本可以称为main.min.CSS 当重新生成此文件时,它只是将其替换。如果在HTML中包含对该文件的引用,如果该文件不存在,可以将请求发送到PHP,合并并缩小该文件(通过类似的方式),然后将其保存到磁盘,从而通过普通HTTP为所有未来的请求提供服务
更新CSS时,只需删除main.min.CSS版本,它就会自动重新生成。您可以使用。抱歉,这篇文章是德语的,但我已经尝试过translate.google.com,效果很好:-)所以你可以将这篇文章作为教程来使用,以获得更好的性能。。。
我会对文件进行预处理并将其保存到磁盘,就像simonrjones说的那样。缓存内容等应该由专用元素完成,如Apache web服务器、标头和浏览器。我们正在开发具有约2+MB JavaScript代码的大型DHTML/AJAX web应用程序,它们仍然通过一些优化快速加载:
- 尝试减少包含的脚本URL的数量。我们使用一个简单的PHP脚本加载一堆.js文件,并将它们一次性发送到浏览器(所有文件都连接在一起)。当你像我们一样拥有大量的.js文件时,这将更快地加载你的页面,因为建立HTTP连接的开销通常比实际传输内容本身的开销要高得多。请注意,浏览器需要同步下载JS文件
- 对缓存友好。我们的HTML页面也是通过PHP生成的,脚本的URL包含一个散列,该散列取决于文件修改时间。上面的PHP脚本组合了.js文件,然后检查HTTP缓存头并设置一个很长的过期时间,这样浏览器甚至不必在用户第二次访问页面时加载任何外部脚本
- GZIP压缩脚本。这将使您的代码减少大约90%。我们甚至不必缩小代码(这使调试更容易)
function combine_files($list, $mime) {
if (!is_array($list))
throw new Exception("Invalid list parameter");
ob_start();
$lastmod = filemtime(__FILE__);
foreach ($list as $fname) {
$fm = @filemtime($fname);
if ($fm === false) {
$msg = $_SERVER["SCRIPT_NAME"].": Failed to load file '$fname'";
if ($mime == "application/x-javascript") {
echo 'alert("'.addcslashes($msg, "\0..\37\"\\").'");';
exit(1);
} else {
die("*** ERROR: $msg");
}
}
if ($fm > $lastmod)
$lastmod = $fm;
}
//--
$if_modified_since = preg_replace('/;.*$/', '',
$_SERVER["HTTP_IF_MODIFIED_SINCE"]);
$gmdate_mod = gmdate('D, d M Y H:i:s', $lastmod) . ' GMT';
$etag = '"'.md5($gmdate_mod).'"';
if (headers_sent())
die("ABORTING - headers already sent");
if (($if_modified_since == $gmdate_mod) or
($etag == $_SERVER["HTTP_IF_NONE_MATCH"])) {
if (php_sapi_name()=='CGI') {
Header("Status: 304 Not Modified");
} else {
Header("HTTP/1.0 304 Not Modified");
}
exit();
}
header("Last-Modified: $gmdate_mod");
header("ETag: $etag");
fc_enable_gzip();
// Cache-Control
$maxage = 30*24*60*60; // 30 Tage (Versions-Unterstützung im HTML Code!)
$expire = gmdate('D, d M Y H:i:s', time() + $maxage) . ' GMT';
header("Expires: $expire");
header("Cache-Control: max-age=$maxage, must-revalidate");
header("Content-Type: $mime");
echo "/* ".date("r")." */\n";
foreach ($list as $fname) {
echo "\n\n/***** $fname *****/\n\n";
readfile($fname);
}
}
function files_hash($list, $basedir="") {
$temp = array();
$incomplete = false;
if (!is_array($list))
$list = array($list);
if ($basedir!="")
$basedir="$basedir/";
foreach ($list as $fname) {
$t = @filemtime($basedir.$fname);
if ($t===false)
$incomplete = true;
else
$temp[] = $t;
}
if (!count($temp))
return "ERROR";
return md5(implode(",",$temp)) . ($incomplete ? "-INCOMPLETE" : "");
}
function fc_compress_output_gzip($output) {
$compressed = gzencode($output);
$olen = strlen($output);
$clen = strlen($compressed);
if ($olen)
header("X-Compression-Info: original $olen bytes, gzipped $clen bytes ".
'('.round(100/$olen*$clen).'%)');
return $compressed;
}
function fc_compress_output_deflate($output) {
$compressed = gzdeflate($output, 9);
$olen = strlen($output);
$clen = strlen($compressed);
if ($olen)
header("X-Compression-Info: original $olen bytes, deflated $clen bytes ".
'('.round(100/$olen*$clen).'%)');
return $compressed;
}
function fc_enable_gzip() {
if(isset($_SERVER['HTTP_ACCEPT_ENCODING']))
$AE = $_SERVER['HTTP_ACCEPT_ENCODING'];
else
$AE = $_SERVER['HTTP_TE'];
$support_gzip = !(strpos($AE, 'gzip')===FALSE);
$support_deflate = !(strpos($AE, 'deflate')===FALSE);
if($support_gzip && $support_deflate) {
$support_deflate = $PREFER_DEFLATE;
}
if ($support_deflate) {
header("Content-Encoding: deflate");
ob_start("fc_compress_output_deflate");
} else{
if($support_gzip){
header("Content-Encoding: gzip");
ob_start("fc_compress_output_gzip");
} else{
ob_start();
}
}
}
使用files_hash()生成唯一的哈希字符串,该字符串在源文件更改时更改,并使用combine_files()将合并的文件发送到浏览器。因此,在为标记生成HTML代码时使用files_hash(),并在通过该标记加载的PHP脚本中组合_files()。只需将哈希放在URL的查询字符串中
<script language="JavaScript" src="get_the_code.php?hash=<?=files_hash($list_of_js_files)?>"></script>
好的,下面是您的直接答案:
- 只要你的代码是好的,就不会有任何伤害。浏览器不会注意到任何差异
- 不需要修改。浏览器通常不关心URL(甚至不关心MIME类型)
- CSS文件通常较小,通常一个文件就足够了,所以不需要组合。请注意,合并来自不同目录的文件会影响CSS中引用的图像,因为它们仍然是相对于
var environment = <?=getenv('APPLICATION_ENV');?>
// More JS code here ...