PHP memcache在数据库查询中应用,减少连接数据库的次数,降低服务器的压力!
/*
* memcache应用说明 memory cache 内存缓存
* 工作原理
* 服务器端口port 11211
* MemCached 存取键值对key => value
* 1.内网访问
* 2.设置防火墙
*/
//创建memcache对象
$mem = new Memcache();
//连接memcache服务器
$host = 'localhost';
$port = '11211';
$mem->connect($host,$port);
//$mem->addserver($host,$port);
//$mem->addserver('192.168.10.254', 11211); //新增一台服务器的内存
$dsn = 'mysql:dbname=test;host=localhost';
$username = 'root';
$passwd = 'root';
$options = array(
PDO::ATTR_AUTOCOMMIT=>true,
PDO::ATTR_PERSISTENT=>true
);
//连接数据库
try{
//创建对象
$pdo = new PDO($dsn, $username, $passwd, $options);
//设置错误使用异常模式
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo "数据库连接失败:".$e->getMessage();
exit;
}
$statement = "select * from users where id > ? and id < ?";
//键名用md5()加密后 名字更规范 防止查询语句信息泄漏
$key = md5($statement);
//直接从内存要数据
$data = $mem->get($key);
//判断是否存在$data,如果没有才需要连接数据库获取数据!数据直接从内存获取,实现缓存。
if(empty($data)){
try{
//给数据库管理系统,编译后等待 没有执行
$pdostatement=$pdo->prepare($statement);
$pdostatement->execute(array(3,6));
//设置结果的模式
$pdostatement->setFetchMode(PDO::FETCH_NUM);
$data = $pdostatement->fetchAll(PDO::FETCH_ASSOC);
//保存在缓存中
$mem->set($key, $data,MEMCACHE_COMPRESSED,10);
echo '第一次数据库查询!<br/>';
}catch (PDOException $e){
echo '错误的原因:'.$e->getMessage();
}
}
//按表格形式输出
echo '<table border="1" width="800" align="center">';
foreach ($data as $value){
echo '<tr>';
echo '<td>'.$value['id'].'</td>';
echo '<td>'.$value['username'].'</td>';
echo '<td>'.$value['password'].'</td>';
echo '<td>'.$value['email'].'</td>';
echo '</tr>';
}
echo '</table>';
//关闭连接
$mem->close();