Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将php作为css/js服务:速度够快吗?有什么缺点?_Php_Javascript_Css_Optimization_Performance - Fatal编程技术网

将php作为css/js服务:速度够快吗?有什么缺点?

将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巫术从中编写一个压缩

我最近开始进入优化性能和加载时间客户端、压缩css/js、gzip、关注YSlow等领域

我想知道,在尝试实现所有这些微优化的同时,将php文件作为css或javascript提供有哪些优点和缺点

我不完全确定瓶颈在哪里,如果有的话。我假设在相同的css和php文件之间,“纯”css文件会稍微快一点,因为它不需要解析php代码。但是,在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%。我们甚至不必缩小代码(这使调试更容易)

因此,是的,使用PHP发送CSS/JS文件可以大大缩短页面的加载时间,特别是对于大型页面

编辑:您可以使用此代码组合文件:

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 ...