php - apc和文件缓存类

// 收集到的一篇不错的PHP缓存实现。实现了apc和文件缓存,继承Cache_Abstract即可实现调用第三方的缓存工具。

<?php
class CacheException extends Exception {}
/**
* 缓存抽象类
*/
abstract class Cache_Abstract {
/**
     * 读缓存变量
     *
     * @param string $key 缓存下标
     * @return mixed
     */
     abstract public function fetch($key);

/**
     * 缓存变量
     *
     * @param string $key 缓存变量下标
     * @param string $value 缓存变量的值
     * @return bool
     */
     abstract public function store($key, $value);

/**
     * 删除缓存变量
     *
     * @param string $key 缓存下标
     * @return Cache_Abstract
     */
     abstract public function delete($key);

/**
     * 清(删)除所有缓存
     *
     * @return Cache_Abstract
     */
     abstract public function clear();

/**
     * 锁定缓存变量
     *
     * @param string $key 缓存下标
     * @return Cache_Abstract
     */
     abstract public function lock($key);
/**
     * 缓存变量解锁
     *
     * @param string $key 缓存下标
     * @return Cache_Abstract
     */
     abstract public function unlock($key);
/**
     * 取得缓存变量是否被锁定
     *
     * @param string $key 缓存下标
     * @return bool
     */
     abstract public function isLocked($key);
/**
     * 确保不是锁定状态
     * 最多做$tries次睡眠等待解锁,超时则跳过并解锁
     *
     * @param string $key 缓存下标
     */
     public function checkLock($key) {
         if (!$this->isLocked($key)) {
         return $this;
         }
         
             $tries = 10;
             $count = 0;
             do {
                 usleep(200);
                 $count ++;
             } while ($count <= $tries && $this->isLocked($key));     // 最多做十次睡眠等待解锁,超时则跳过并解锁
             $this->isLocked($key) && $this->unlock($key);
             
             return $this;
     }
}

/**
* APC扩展缓存实现
*
*
* @category     Mjie
* @package     Cache
* @author         流水孟春
* @copyright     Copyright (c) 2008- <cmpan(at)qq.com>
* @license     New BSD License
* @version     $Id: Cache/Apc.php 版本号 2010-04-18 23:02 cmpan $
*/
class Cache_Apc extends Cache_Abstract {

protected $_prefix = 'cache.mjie.net';

public function __construct() {
     if (!function_exists('apc_cache_info')) {
     throw new CacheException('apc extension didn\'t installed');
     }
}

/**
     * 保存缓存变量
     *
     * @param string $key
     * @param mixed $value
     * @return bool
     */
public function store($key, $value) {
         return apc_store($this->_storageKey($key), $value);
}

/**
     * 读取缓存
     *
     * @param string $key
     * @return mixed
     */
public function fetch($key) {
         return apc_fetch($this->_storageKey($key));
}

/**
     * 清除缓存
     *
     * @return Cache_Apc
     */
public function clear() {
     apc_clear_cache();
     return $this;
}

/**
     * 删除缓存单元
     *
     * @return Cache_Apc
     */
public function delete($key) {
         apc_delete($this->_storageKey($key));
         return $this;
}

/**
     * 缓存单元是否被锁定
     *
     * @param string $key
     * @return bool
     */
public function isLocked($key) {
     if ((apc_fetch($this->_storageKey($key) . '.lock')) === false) {
         return false;
     }
     
     return true;
}

/**
     * 锁定缓存单元
     *
     * @param string $key
     * @return Cache_Apc
     */
public function lock($key) {
     apc_store($this->_storageKey($key) . '.lock', '', 5);
     return $this;
}

/**
     * 缓存单元解锁
     *
     * @param string $key
     * @return Cache_Apc
     */
public function unlock($key) {
     apc_delete($this->_storageKey($key) . '.lock');
     return $this;
}

/**
     * 完整缓存名
     *
     * @param string $key
     * @return string
     */
private function _storageKey($key) {
         return $this->_prefix . '_' . $key;
}
}
/**
* 文件缓存实现
*
*
* @category     Mjie
* @package     Cache
* @author         流水孟春
* @copyright     Copyright (c) 2008- <cmpan(at)qq.com>
* @license     New BSD License
* @version     $Id: Cache/File.php 版本号 2010-04-18 16:46 cmpan $
*/
class Cache_File extends Cache_Abstract {

protected $_cachesDir = 'cache';

public function __construct() {
     if (defined('DATA_DIR')) {
     $this->_setCacheDir(DATA_DIR . '/cache');
     }
}

/**
     * 获取缓存文件
     *
     * @param string $key
     * @return string
     */
protected function _getCacheFile($key) {
     return $this->_cachesDir . '/' . substr($key, 0, 2) . '/' . $key . '.php';
}
     /**
     * 读取缓存变量
     * 为防止信息泄露,缓存文件格式为php文件,并以"<?php exit;?>"开头
     *
     * @param string $key 缓存下标
     * @return mixed
     */
     public function fetch($key) {
             $cacheFile = self::_getCacheFile($key);
             if (file_exists($cacheFile) && is_readable($cacheFile)) {
                 return unserialize(@file_get_contents($cacheFile, false, NULL, 13));
             }
             return false;
     }
/**
     * 缓存变量
     * 为防止信息泄露,缓存文件格式为php文件,并以"<?php exit;?>"开头
     *
     * @param string $key 缓存变量下标
     * @param string $value 缓存变量的值
     * @return bool
     */
     public function store($key, $value) {
     $cacheFile = self::_getCacheFile($key);
     $cacheDir     = dirname($cacheFile);
     if(!is_dir($cacheDir)) {
         if([url=mailto:!@mkdir($cacheDir]!@mkdir($cacheDir[/url], 0755, true)) {
         throw new CacheException("Could not make cache directory");
         }
     }
             return @file_put_contents($cacheFile, '<?php exit;?>' . serialize($value));
}
/**
     * 删除缓存变量
     *
     * @param string $key 缓存下标
     * @return Cache_File
     */
     public function delete($key) {
         if(empty($key)) {
         throw new CacheException("Missing argument 1 for Cache_File::delete()");
     }
     
     $cacheFile = self::_getCacheFile($key);
     if([url=mailto:!@unlink($cacheFile]!@unlink($cacheFile[/url])) {
         throw new CacheException("Cache file could not be deleted");
     }
     return $this;
}
/**
     * 缓存单元是否已经锁定
     *
     * @param string $key
     * @return bool
     */
public function isLocked($key) {
     $cacheFile = self::_getCacheFile($key);
     clearstatcache();
     return file_exists($cacheFile . '.lock');
}
/**
     * 锁定
     *
     * @param string $key
     * @return Cache_File
     */
public function lock($key) {
     $cacheFile = self::_getCacheFile($key);
     $cacheDir     = dirname($cacheFile);
     if(!is_dir($cacheDir)) {
         if([url=mailto:!@mkdir($cacheDir]!@mkdir($cacheDir[/url], 0755, true)) {
         if(!is_dir($cacheDir)) {
                 throw new CacheException("Could not make cache directory");
         }
         }
     }
     // 设定缓存锁文件的访问和修改时间
     @touch($cacheFile . '.lock');
     return $this;
}
     
/**
     * 解锁
     *
     * @param string $key
     * @return Cache_File
     */
public function unlock($key) {
     $cacheFile = self::_getCacheFile($key);
         @unlink($cacheFile . '.lock');
     return $this;
}
/**
     * 设置文件缓存目录
     * @param string $dir
     * @return Cache_File
     */
protected function _setCacheDir($dir) {
     $this->_cachesDir = rtrim(str_replace('\\', '/', trim($dir)), '/');
     clearstatcache();
     if(!is_dir($this->_cachesDir)) {
     mkdir($this->_cachesDir, 0755, true);
     }
     //
     return $this;
}
     
/**
     * 清空所有缓存
     *
     * @return Cache_File
     */
public function clear() {
     // 遍历目录清除缓存
     $cacheDir = $this->_cachesDir;
     $d = dir($cacheDir);
     while(false !== ($entry = $d->read())) {
     if('.' == $entry[0]) {
     continue;
     }
     
     $cacheEntry = $cacheDir . '/' . $entry;
     if(is_file($cacheEntry)) {
     @unlink($cacheEntry);
     } elseif(is_dir($cacheEntry)) {
     // 缓存文件夹有两级
     $d2 = dir($cacheEntry);
     while(false !== ($entry = $d2->read())) {
         if('.' == $entry[0]) {
         continue;
         }
         
         $cacheEntry .= '/' . $entry;
         if(is_file($cacheEntry)) {
         @unlink($cacheEntry);
         }
     }
     $d2->close();
     }     
     }
     $d->close();
     
     return $this;
}
}
/**
* 缓存单元的数据结构
* array(
*         'time' => time(),     // 缓存写入时的时间戳
*         'expire' => $expire, // 缓存过期时间
*         'valid' => true,         // 缓存是否有效
*         'data' => $value         // 缓存的值
* );
*/
final class Cache {
/**
     * 缓存过期时间长度(s)
     *
     * @var int
     */
private $_expire = 3600;
/**
     * 缓存处理类
     *
     * @var Cache_Abstract
     */
private $_storage = null;
/**
         * @return Cache
         */
static public function createCache($cacheClass = 'Cache_File') {
     return new self($cacheClass);
}
private function __construct($cacheClass) {
     $this->_storage = new $cacheClass();
}
/**
     * 设置缓存
     *
     * @param string $key
     * @param mixed $value
     * @param int $expire
     */
public function set($key, $value, $expire = false) {
     if (!$expire) {
     $expire = $this->_expire;
     }
     
     $this->_storage->checkLock($key);
     
     $data = array('time' => time(), 'expire' => $expire, 'valid' => true, 'data' => $value);
     $this->_storage->lock($key);
     
     try {
     $this->_storage->store($key, $data);
     $this->_storage->unlock($key);
     } catch (CacheException $e) {
     $this->_storage->unlock($key);
     throw $e;
     }
}
/**
     * 读取缓存
     *
     * @param string $key
     * @return mixed
     */
public function get($key) {
     $data = $this->fetch($key);
     if ($data && $data['valid'] && !$data['isExpired']) {
     return $data['data'];
     }
     
     return false;
}
/**
     * 读缓存,包括过期的和无效的,取得完整的存贮结构
     *
     * @param string $key
     */
public function fetch($key) {
     $this->_storage->checkLock($key);
     $data = $this->_storage->fetch($key);
     if ($data) {
     $data['isExpired'] = (time() - $data['time']) > $data['expire'] ? true : false;
     return $data;
     }
     
     return false;
}
/**
     * 删除缓存
     *
     * @param string $key
     */
public function delete($key) {
     $this->_storage->checkLock($key)
                         ->lock($key)
                         ->delete($key)
                         ->unlock($key);
}

public function clear() {
     $this->_storage->clear();
}
/**
     * 把缓存设为无效
     *
     * @param string $key
     */
public function setInvalidate($key) {
     $this->_storage->checkLock($key)
                         ->lock($key);
     try {
     $data = $this->_storage->fetch($key);
     if ($data) {
     $data['valid'] = false;
     $this->_storage->store($key, $data);
     }
     $this->_storage->unlock($key);
     } catch (CacheException $e) {
     $this->_storage->unlock($key);
     throw $e;
     }
}

/**
     * 设置缓存过期时间(s)
     *
     * @param int $expire
     */
public function setExpire($expire) {
     $this->_expire = (int) $expire;
     return $this;
}
}

标签: 缓存, 变量, IT, 下标

Magento错误 - 缓存不足的解决方法

在货品处或者其他部分页面出现了一下几种错误提示:

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 30720 bytes) in /home/XXXXX/public_html/lib/Varien/Io/File.php on line 361

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 72897 bytes) in /home/XXXXX/public_html/lib/Varien/Image/Adapter/Gd2.php on line 155

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/XXXXX/public_html/lib/Varien/Image/Adapter/Gd2.php on line 332

这些报错乃是缓存不足导致,只要将缓存设置大一点就ok啦。

修改根目录下的,php.ini
.htaccess
文件里的memory_limit = 64M项,改为memory_limit = 128M.保存后上传覆盖。

到这个步骤后看看问题是否解决。

如是Magento系统如问题依旧。到Magento后台的缓存设置里勾选缓存选项下的:

【设置,布局,区块 HTML 输出,翻译,集合(Collections)数据,EAV 类型与属性以及,网络服务配置选项。】

到此问题就应该解决了。

如果你的问题非常的顽固。有的模版还会在页面的最底部出现报错信息。

甚至有网页打开报错,或是直接是空白。找到根目录下的 index.php 修改如下:

require_once $mageFilename;

#Varien_Profiler::enable();

#Mage::setIsDeveloperMode(true);

#ini_set(’display_errors’, 1);

ini_set(“memory_limit”,”128M”); <——————————————— 在此加入这一行。

umask(0);

Mage::run();

至此问题99%解决。

服务器推技术简介及php实现服务器推技术的聊天室

IBM:Comet:基于 HTTP 长连接的“服务器推”技术

DEMO1:

  首先是首页,包含一个文本输入和一个显示聊天内容的iframe,还有一个隐藏iframe用来提交form表单:

<?php

//chat.php

header('cache-control: private');

header('Content-Type: text/html; charset=utf-8');

?>

<html>

<script type="text/javascript">

function submitChat(obj) {

obj.submit();

document.getElementsByName('content')[0].value = '';

}

</script>

<iframe src="./chat_content.php" height="300" width="100%"></iframe>

<iframe name="say" height="0" width="0"></iframe>

<form method="POST" target="say" action="./say.php" onsubmit="submitChat(this)">

<input type="text" size="30" name="content" /> <input type="button" value="say"onclick="submitChat(this.form)" />

</form>

</html>

  另外一个就是保存用户提交的聊天内容了,我简单的写一下文本,而且没有做什么锁定,这个只是简易版本:

<?php

$content = trim($_POST['content']);

if ($content) {

$fp = fopen('./chat.txt', 'a');

fwrite($fp, $content . "\n");

fclose($fp);

clearstatcache();

}

?>

  接下来看主要的HTTP长连接部分,也就是chat_content.php文件:

<?php

header('cache-control: private');

header('Content-Type: text/html; charset=utf-8');

 

//测试设置30秒超时,一般会设置比较长时间。

set_time_limit(30);

 

//这一行是为了搞定IE这个BT

echo str_repeat(' ', 256);

 

ob_flush();

flush();

$fp = new SplFileObject('./chat.txt', 'r+');

$line = 0;

$totalLine = 0;

while (!$fp->eof()) {

$fp->current();

$totalLine++;

$fp->next();

}

$fp->seek($totalLine);

$i = $totalLine - 1;

while (true) {

if (!$fp->eof()) {

if ($content = trim($fp->current())) {

echo '<div>';

echo htmlspecialchars($content);

echo "</div>";

flush();

$fp->next();

$i++;

}

} else {

$fp->seek($i - 1);

$fp->next();

}

 

{

//这里可以添加心跳检测后退出循环

}

usleep(1000);

}

?>

  06. 设置一个超时时间,由于要保持HTTP长连接,这个时间肯定要比较长,可能要几个小时吧,上面提到的文章里也有说明,这种HTTP长连接只能打开两个,由于浏览器的限制。另外其实即使你设置了一个永不超时,其实上服务器部分(如Apache)的配置文件也可能对HTTP请求设置了最长等待时间,所以也可能效果会不是你想的,一般默认可能都是15分钟超时。如果有兴趣可以自己尝试修改。

  09. 这里输出了一段空白,主要是手册上已经说明了,IE浏览器在前面256个字符是不会直接输出的,所以我们先随便输出些空白,以便让后面的内容输出来,可能其他浏览器也有其他浏览器的设置,具体可以查看PHP手册的frush函数的说明。接下去11、12行就是强制把这些空白符丢给浏览器输出。

  13. ~ 20. 这里主要是为了计算文件行数,以便从这一行后面开始读内容。

  接下去的while循环就是一个死循环了,就是循环输出文件内容,每次判断是否到达文件末尾,如果有用户写入文件,则当前检测肯定不是文件末尾,就将该行读取出来输出,否则将指针往前移动一行,继续循环,每次等待1000微秒,

  39. 如果一直保持长连接,那么即使客户端断开,服务端也不一定能知道客户端已经断开,所以这里可能还需要做一些心跳记录,比如每个用户保持一个心跳flag,每格几秒更新一下最后心跳时间,当检测最后时间很久没更新后,推出这个死循环,关闭这个HTTP连接。

 

 

DEMO2:

 

传统的B/S结构的应用程序,都是采用\"客户端拉\"结束来实现客户端和服务器端的数据交换。 

本文将通过结合Ticks,来实现一个服务器推的PHP聊天室简单构想。 

 

PHPer,尤其是用过set_cookie, header的,一定见过这样的提示信息:\"Warning: Cannot modify header information - headers already sent by.....\", 这是因为通过HTTP协议通信,数据包会包含俩个部分,一个是Header,一个是data。一般来说,都是先Header部分,在Heaer部分指明了Data部分的长度,然后使用\\r\\n\\r\\n来表示header部分结束,接下来是Data部分。 

 

当我们有任何输出的时候,Header部分就发送了,这个时候,你再想header函数来改变一些Header部分的域信息,就会得到上面的提示信息。 

    

一个简单的办法就是使用output_buffering。让它来缓存服务器的输出,不要太早将Header部分发给客户端。 

 

那么,如果不使用output_buffering,是不是就可以实现,每当服务器有输出,就立即发送给客户端呢? 

 

做个如下试验://设置php.ini中output_buffering=0 或者使用ob_end_flush()关闭缓存 

 

set_time_limit(0); 

for($i=0;$i<10;$i++){ 

  echo \"Now Index is :\". $i; 

  sleep(1); 

  结果我们发现,还是要等到脚本全部执行完以后,才能一次看到所有的结果。。 

  为什么呢? 

  这是因为我们只是解决了缓存问题,但是还有一个缓冲问题,PHP会缓冲程序的输出。所以,这个时候,我们还需要调用,flush(), 来强制使得PHP将所有的程序输出发送给客户端。//设置php.ini中output_buffering=0 

ob_end_flush();//关闭缓存 

 

set_time_limit(0); 

for($i=0;$i<10;$i++){ 

  echo \"Now Index is :\". $i; 

  flush(); 

  sleep(1); 

    现在是不是看到了,不断有服务器的数据显示出来? 

 

    有几个概念之间的关系,我这里补充以下: 

    在代码中使用ob_start(), 就相当于在php.ini中使用output_buffering=on一样,使用服务器缓存。 

    在代码中使用ob_end_flush() 就相当于在php.ini中使用output_buffering = false一样,关闭服务器缓存。 

     

     基于前面的讨论,我们就有可能使用Ticks来实现,一个无刷新,无ajax的聊天室: 页面中包含俩个iframe,一个是不断获取聊天室的聊天内容,一个包含用户发表聊天内容的form. 这样,在第一个frame的脚本中: 

ob_end_clear();//关闭缓存 

set_time_limit(0); 

ob_implicit_flush(); //这个语句将强制每当有输出就自动刷新,相当于在每个echo后,调用flush() 

$new_mesg = NULL; 

register_tick_function(\"getNewMesg\"); 

declare(ticks=1){ 

  while(1){ 

     if(!is_null($new_mesg)){ 

          foreach($new_mesg as $msg){ 

                echo $msg; 

          } 

          $new_mesg = null; 

     }      

  } 

 

function getNewMesg(){ 

//通过查询数据库,或者共享内存,来获取现在的聊天室大厅的内容。 

//返回一个数组,包含所有的新的聊天内容 

 

 这样就实现了一个简单的使用服务器推技术的聊天室的框架。 

 当然,关于实时输出,还有一些其他的限制,比如在PHP5手册中讲到的: 

个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。 

 

有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。 [Page]

 

甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。 

 

一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。 

 

 接下来,我贴一个很有趣的代码,有兴趣的同学,可以试试: 

<?php

header('Content-type: multipart/x-mixed-replace;boundary=endofsection'); 

print "endofsection"; 

for( $i = 0; $i <10;$i ++ ) 

        sleep(1); 

        print "Content-type: text/plain "; 

        print "Part $i "; 

        print "--endofsection "; 

        ob_flush(); //强制将缓存区的内容输出 

        flush(); //强制将缓冲区的内容发送给客户端 

  } 

print "Content-type: text plain "; 

print "The end "; 

print "--endofsection-- ";

 

?>

 

  使用firefox打开,看看你看到了什么。 

  这个例子,使用了ob_flush(), 这样可以在代码中控制缓存区内容的输出时机,更加灵活一些。

什么样才算学好php

也算做PHP蛮久了,我也在想水平怎么样呢?找人凭什么说明人家的水平呢?其实这个有工作经验的成分,有知识面的成分,也有深度的成分。知识面觉得了你可以跟哪些人顺利的交流和工作,知识深度决定了你的工作能力和工作效果,工作经验是避免了你工作产生失误。

我很强调知识面,也是自己的个性所以然。我就喜欢看很多东西,但是我学东西的深度也许都不大,但我却有了和别人沟通的前提。所以我成为不了专家也许。成为专家的人是一群痴迷的人,为工作学习疯狂的人,只有这样的人才是专家。这个也是《卓有成效的管理者》一书说的一方面,这本书很好,我还得温习一遍才行。

回到正题,不多说,但看了一下别人发的帖子,所以转了,PHPer可以参考参考:

《什么样才算是学好了PHP?》

1. php基本语法,像《精通php》里的各个知识点.

2. Sql ,比如对Mysql的管理,sql语句的编写。

3. html,做页面肯定会需要这些东西了。

4. css,现在比较常用的的是Div+css设计。

当然还得对 apache, linux有一定的了解了。

上面的一些东西,就够做一些简单的网站,比如个人或公司主页了。

 

但是大网站是远远不是如上的一些东西就可以的,比如:

1. 要选择一个好的框架,比如Symfony,或zend framework。它们都采用了MVC模式。通过框架可以减少很多底层的重复开发,更重要的是可以让多人协作更加容易和让项目更易于扩展。

2. 代码和页面分离,比如Smarty,它可以让页面(html)和逻辑处理(php)做较好的分离,让美工和程序基本可以并行工作(前提是需求做得比较完善)。

3. 高级缓存。 这是一个php开发上永恒的话题,网站之所以要采用php就是因为速度快。采用缓存技术,可以让速度更快。 主要有的缓存技术有:

文件缓存,如Pear。 

内存缓存,如Memcached。 速度非常快。

操作系统缓存,比如Squid。

4.加速工具,比如zend optimizer, 还有页面压缩。

5.高级数据库技术,比如设计优化,查询优化,集群等等。你能想象Google采用的数据库技术就是Mysql么?Mysql完全可以用于海量数据,但是我们一般到了几百万就很慢了,那是因为功底没有练就。

6.优化Apache,Mysql,linux服务器。主要是设计一些配置文件的参数,和关闭一些不需要的服务。

7.算法,不同的人写出来的东西效率可能差几十倍。建议多看看算法的书,还有多用php练习比较。

8.提高用户体验,当然就是要做的好看,但是页面文件不要太大,要不会影响速度,采用一些DHTML,Ajax技术。用普通人的使用习惯来设计。 Ajax可以采用一些框架,比如prototype。

当然从软件工程来看,你还得学一些比如CVS,phpunit等工具。

多研究一些开源的东西,对学习有帮助。

chrome的缓存位置和改变缓存位置

可以通过 --User-data-dir=R:\TEMP 改变用户文件位置(包括缓存)

但这样历史主题收藏都一同改变了

只改变缓存的位置如下:

快捷方式参数:"D:\Program Files\sunchrome\chrome
.exe" --disk-cache-dir=R:\TEMP

 

2011-2-14更新:

这种方法只有在点击这个修改过参数的图标时候有效,更彻底的一种改法是,

定位到下面的注册表键:

HKEY_CLASSES_ROOT\ChromeHTML\shell\open\command

在这里你可以看到一个指向 Chrome 运行路径的名为(Default)的键值,双击它

"C:\Users\[username]\AppData\Local\Google\Chrome\Application\chrome.exe" --disk-cache-dir="d:\cache" --disk-cache-size=104857600 -- "%1"

// 解释:设置缓存路径到d:\cache 最大缓存大小100M。

sunchrome+ramdisk=速度飞快!

 

========================英文好的话也可以看看这个==================

--disk-cache-dir
// Use a specific disk cache location, rather than one derived from the UserDatadir.

--disk-cache-size
// Forces the maximum disk space to be used by the disk cache, in bytes.

--media-cache-size
// Forces the maximum disk space to be used by the media cache, in bytes.

标签: Chrome, 缓存

Windows 服务器配置 RamDisk

 

给 Windows 服务器增加 RamDisk以前在 IIS 6 的 PHP 最佳配置一文中提到过 RamDisk,后来在那篇文章的留言里,就看到有人问关于 RamDisk 的事。正好那几天转移服务器,需要重新配置这个东西,发现这个东西确实挺难找的,所以在这里写下来,一来可以方便自己以后的工作,二来可以方便跟我有相同需求的朋友们。

 

网上能找到的 RamDisk 程序大都不能支持 Windows 2003,而且许多都是收费软件。原来我用的也是一个试用版的软件,虽然没有功能限制和时间限制,但是总会在随机的某个时间弹出提示框,让人很不爽,而且还不是很稳定。于是这次找了一个免费的却更好的 RamDisk 软件。这个支持 Windows 2000 以上的系统,包括 Windows 2003。

 

这里主要以 IIS 为例来讲。

 

首先用 lyh728 做到 RamDisk 的 GUI 前端来安装 RamDisk 驱动。直接双击 ramdisk.exe 然后点击 install ramdisk 按钮就可以了。然后你可以调整盘符和磁盘大小。RamDisk 的盘符默认是 R:,因为我的服务器只有一个软驱 A:,所以我把 RamDisk 的盘符设为了 B:,主要是为了保证这个盘符不会变。RamDisk 上一般放的都是临时性质的文件,比如 IE 的缓存、IIS 的压缩页面缓存、临时文件夹、PHP 的 Sessions 文件等。这些内容在服务器重启以后就没有了。我给我的服务器分了 256M 的内存作 RamDisk,实际上我发现用不了这么多,目前也只占了 20 多兆的空间而已,所以如果你的内存本来就不是很多的话,分 32M 作 RamDisk 给服务器我觉得基本上就足够了,不放心的话,也可以多给它一点空间,比如 64M 或者 128M。但是默认的 RamDisk 是格式化成 FAT 格式的,并且已经建好了一个 TEMP 文件夹。你会发现这个文件夹在服务器重启后,依然存在。你甚至会发现,你即使将 RamDisk 重新格式化为 NTFS 格式,再重启后,仍然会变为 FAT 格式,并且还有那个 TEMP 文件夹。原因在于默认的安装已经把这个配置写到注册表里了。如果想修改的话,需要用里面的 rdutil 这个工具。

 

首先安装完 RamDisk,并调整好盘符和大小后,什么也别做。尤其是不要急着把 IE 的缓存目录改到 RamDisk 上,否则 RamDisk 会被锁定,以至于不能在被修改保存。

 

然后格式化 RamDisk

 

FORMAT /FS:NTFS /Q /V:RamDisk /A:512 B:

其中 /FS: 后面指定的是文件系统,/A: 后面是一个单元块的大小,因为 RamDisk 上保存的大都是小文件,因此指定 512 字节比较合适。B: 是盘符。

 

接下来把 NTFS 的日志大小设到最小(2M)

 

CHKDSK /L:2048 R:

否则,会因为太大而无法压缩到注册表中。

 

在接下来你就可以在上面建文件夹了,比如 Temp、Sessions、Upload Temp Files、IIS Temporary Compressed Files 等。目录不要建太多,够用就行了。比如 Temp 是用来保存系统临时文件的,Sessions 可以保存 PHP 的 Session 文件,Upload Temp Files 可以保存 PHP 上传的临时文件,IIS Temporary Compressed Files 可以保存 IIS 的临时压缩文件。当然这些目录你还要给予足够的权限,比如需要让 IIS(包括用 IIS 发布的 PHP 程序)访问的目录,就需要给 IIS_WPG 用户组或者 IUSR_HOSTNAME 用户足够的权限。注意,这里也不要给 IE 建立缓存目录,即使你想让 IE 缓存也使用 RamDisk,因为当你设置 IE 的缓存到 RamDisk 的时候,IE 会自动建立这个目录的。

 

好了,做完这步后,先不要急着把这些目录用起来,先把这个文件系统和目录结构保存到注册表:

 

rdutil B: registry

好了,如果你看到保存成功的提示,就大功告成了。重启一下试试看,你会发现重新启动后,你的 RamDisk 将会保持你设置的文件系统格式,以及目录和相应的权限。

 

现在你就可以把系统的 Temp 目录、IIS 的压缩文件缓存、IE 缓存、PHP Session 文件目录、PHP 临时上传目录统统设置到 RamDisk 上了。