Drupal 获取js后面的Query字符串

当你把开你的页面, 你总是可以看到每一个js文件后面都会有这样的一个ID: ?nac714


这是id在每次清空Drupal缓存的时候会重新生成, 当重新生成了浏览器就会认为你的文件更新了, 从而重新去下载你的js缓存

使用以下这段代码可以获取到当前的这个缓存ID

variable_get('css_js_query_string', '0');

PHP 目录查找. 支持多层目录

现在我有一个需求, 需要一个目录中找出. index.html 或者 index.htm文件,

/**
 * 目录扫描. 返回数组.
 */
function _directory_map($source_dir, $directory_depth = 0, $hidden = FALSE) {
  if ($fp = @opendir($source_dir)) {
    $filedata = array();
    $new_depth = $directory_depth - 1;
    $source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;

    while (FALSE !== ($file = readdir($fp))) {
      // Remove '.', '..', and hidden files [optional]
      if (!trim($file, '.') OR ( $hidden == FALSE && $file[0] == '.')) {
        continue;
      }

      if (($directory_depth < 1 OR $new_depth > 0) && @is_dir($source_dir . $file)) {
        $filedata[$file] = _directory_map($source_dir . $file . DIRECTORY_SEPARATOR, $new_depth, $hidden);
      }
      else {
        $filedata[] = $file;
      }
    }

    closedir($fp);
    return $filedata;
  }
  return FALSE;
}

/**
 * 扫描Index.html
 */
function search_html_index($dirarrays, $current_dir, $scan_file) {
  static $result = false;
  foreach ($dirarrays as $dir => $name) {
    if (is_array($name)) {
      search_html_index($name, $current_dir . $dir . '/',  $scan_file);
    }
    else {
      if(array_search($name, $scan_file) !== FALSE) {
        $index = array_search($name, $scan_file);
        $result = $current_dir . $scan_file[$index];
      }
      if ($result) {
        break;
      }
    }
  }
  return $result;
}


## 执行程序

$extpath = './mydir/';

$file = search_html_index(_directory_map($extpath), $extpath, array(
              'index.html',
              'index.htm'
            ));

var_dump($file);

Web 缓存

中文文档: http://www.cnblogs.com/xyjsw/archive/2010/01/27/1657825.html
英文文档: https://www.mnot.net/cache_docs/#DEFINITION

疑问1: 如果缓存了还会问服务器发起请求吗?

答:不会, 当缓存了客户端就不用再向服务器发送请求了. 直接判断缓存中的过期时间就好了
304的是代理缓存啊,是在服务器端做缓存的,服务器端会缓存完整的页面
304的是代理缓存啊,是在服务器端做缓存的,服务器端会缓存完整的页面 
304本身是表示资源没有变化,不管是不是用了缓存

会发起请求, 比如一个css在本地有缓存,会向服务器发起请求,如果缓存还有效,那么直接返回 304,但不进行内容的传输.
另类回答: 服务器端可以设置过期时间,发送到客户端浏览器的时候,会带入头信息里面,浏览器根据头信息判断是否过期,如果是强制刷新的应该是浏览器会忽略过期时间

疑问2. http://demo.com/style.css?ver=1.2.3 比如第一次向服务器发请一个这样的请求. 保存的缓存是 Style.css还是 style.css?ver=1.2.3 ?

答: 缓存是style.css?ver=1.2.3

问: http://demo.com/style.css?ver=1.2.3 如果第二次再发起这样的请求为什么会强制更新缓存?

答: 不会. 1.2.3这个参数当变化的时候会重新更新缓存

问: 服务器端的缓存是保存在哪? 内存还是文件? 比如PHP中的header函数

回答: apc 默认是磁盘 ,  memcache 是内存, php header是浏览器缓存, 代理缓存某种意义上也是浏览器的缓存吧,因为内容已经从应用服务器出来了。

问: 如果我对当前页面设置了缓存, 只是缓存DOM吗? 还是会缓存当前页面的资源(Image, CSS, Javascript和Video ETC… )

等待回答.

问: 比如我一个视频第一次请求了告诉客户端要缓存?第二次我又访问,服务器告诉我304. 所以我继续播放本地的。但是我在第三次刷新的时候我断网了。这是浏览器会继续使用我的本地缓存吗

问:关于HTTP缓存,浏览器在什么时候会删除缓存