企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
PHP连接memcache 1. 将php\_memcache.dll放在php目录下的ext目录下 2. 在php.ini配置文件中, 确保安装PHP与memcache的扩展:extension = php\_memcache.dll 3. 重启apache,确认memcache扩展成功安装 * [Memcache](https://www.php.net/manual/zh/class.memcache.php)— Memcache类 * [Memcache::add](https://www.php.net/manual/zh/memcache.add.php)('key', 'value', MEMCACHE_COMPRESSED, 有效期-秒)— 增加一个条目到缓存服务器 * [Memcache::addServer](https://www.php.net/manual/zh/memcache.addserver.php)('localhost',11211)— 向连接池中添加一个memcache服务器 * [Memcache::close](https://www.php.net/manual/zh/memcache.close.php)()— 关闭memcache连接 * [Memcache::connect](https://www.php.net/manual/zh/memcache.connect.php)('127.0.0.1', 11211, timeout)— 打开一个memcached服务端连接 * [Memcache::decrement](https://www.php.net/manual/zh/memcache.decrement.php)(key,1)— 减小元素的值(递减,每次递减多少由第二个参数决定) * [Memcache::delete](https://www.php.net/manual/zh/memcache.delete.php)(key)— 从服务端删除一个元素 * [Memcache::flush](https://www.php.net/manual/zh/memcache.flush.php)()— 清洗(删除)已经存储的所有的元素 * [Memcache::get](https://www.php.net/manual/zh/memcache.get.php)(key)— 从服务端检回一个元素 * [Memcache::getExtendedStats](https://www.php.net/manual/zh/memcache.getextendedstats.php)(\[string`$type`\[,int`$slabid`\[,int`$limit`\= 100\]\]\])— 缓存服务器池中所有服务器统计信息 * [Memcache::getServerStatus](https://www.php.net/manual/zh/memcache.getserverstatus.php)('localhost',11211)— 用于获取一个服务器的在线/离线状态 * [Memcache::getStats](https://www.php.net/manual/zh/memcache.getstats.php)(\[string`$type`\[,int`$slabid`\[,int`$limit`\= 100\]\]\] )— 获取服务器统计信息 * [Memcache::getVersion](https://www.php.net/manual/zh/memcache.getversion.php)()— 返回服务器版本信息 * [Memcache::increment](https://www.php.net/manual/zh/memcache.increment.php)(key, 1)— 增加一个元素的值(递增) * [Memcache::pconnect](https://www.php.net/manual/zh/memcache.pconnect.php)('127.0.0.1', 11211, timeout)— 打开一个到服务器的持久化连接 * [Memcache::replace](https://www.php.net/manual/zh/memcache.replace.php)(key,value,MEMCACHE_COMPRESSED,有效期-秒)— 替换已经存在的元素的值 * [Memcache::set](https://www.php.net/manual/zh/memcache.set.php)(key,value,MEMCACHE_COMPRESSED,有效期-秒)— Store data at the server * [Memcache::setCompressThreshold](https://www.php.net/manual/zh/memcache.setcompressthreshold.php)(int`$threshold`\[,float`$min_savings=0.2`\] )— 开启大值自动压缩 * [Memcache::setServerParams](https://www.php.net/manual/zh/memcache.setserverparams.php)(string`$host`\[,int`$port`\= 11211\[,int`$timeout`\[,int`$retry_interval`\= false\[,bool`$status`\[,[callback](https://www.php.net/manual/zh/language.pseudo-types.php#language.types.callback)`$failure_callback`\]\]\]\]\] )— 运行时修改服务器参数和状态 * [Memcache 函数](https://www.php.net/manual/zh/ref.memcache.php) * [memcache\_debug](https://www.php.net/manual/zh/function.memcache-debug.php)— 转换调试输出的开/关 ```  memcache::addServer('localhost',11211)  memcache::set(key,value,MEMCACHE_COMPRESSED,有效期-秒)  memcache::get(key)  memcache::delete(key)  memcache::flush(): // 增加一台离线服务器 $memcache->addServer('localhost', 11211, false, 1, 1, -1, false); // 使该服务器变为在线状态 $memcache->setServerParams('memcache_host', 11211, 1, 15, true,function($host, $port) {     print "memcache '$host:$port' failed"; }); ``` **设置:** ``` // 1.实例化Memcache类 memcache $mem = new Memcache; // 2.配置memcache $mem->addServer('localhost',11211); // 3.向内存中添加数据(四种标量,数组,对象,是将这些数据类型转化为字符串进行存储) $mem->set('username','zhangsan'); $mem->set('age',20); $mem->set('price',20.99); $mem->set('bool',true); $mem->set('info',['username'=>'lisi','age'=>20,'sex'=>'男']); class Person { public $name = 'wangwu'; public $age = 20; public $sex = 1; } $mem->set('person',new Person()); // set(键,值,指定压缩,设置有效期) $mem->set('weight','100KG',MEMCACHE_COMPRESSED,10); ``` **获取:** ``` // 1.实例化memcache $mem = new Memcache; // 2.配置 $mem->addServer('localhost',11211); echo '<pre>'; var_dump($mem->get('username')); var_dump($mem->get('age')); var_dump($mem->get('info')); var_dump($mem->get('person')); class Person { public $name = 'wangwu'; public $age = 20; public $sex = 1; } // flush delete echo '</pre>'; ``` **综合实例:** ``` // 1.先实例化memcache $mem = new Memcache; $mem->addServer('localhost',11211); //开启压缩数据超过2000,则压缩20%(第二个参数我是压缩率,取值0~1) $mem->setCompressThreshold(20000, 0.2); // 2.判断内存中存在对应的数据信息 // 将sql语句单独提取并加密取6位出来作为存入数据的键值 $sql = 'select * from demo_user'; $key = substr(md5($sql),0,6); echo $key; $data = $mem->get($key); if ($data) { echo 'memcache服务器中有对应的数据信息'; } else { /* 一个小时改变一次内容,将此内容缓存一个小时 在一个小时内,从计算机的缓存中读取数据, 如果过期,从数据库读取,同时向缓存中再存入一份数据,在保存10s中 */ try { $pdo = new PDO('mysql:host=localhost;dbname=lamp129;charset=utf8','root',''); } catch (PDOException $p) { echo $p->getMessage(); } $stmt = $pdo->query($sql); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); // 将查询到的数据向memcache中写入 $mem->set($key,$data,MEMCACHE_COMPRESSED,100); echo '这是从数据库读取到的信息'; } ``` **分布式缓存** ``` <?php // 分布式缓存 $mem = new Memcache; // 连接多台memcache服务器 $mem->addServer('localhost',11211); $mem->addServer('192.168.129.67',11211); $mem->addServer('192.168.129.32',11211); //这里模拟100个数据 for ($i=0;$i<100;$i++) { $mem->set("user{$i}",'zhangsan'); } //memacache会自动测试每台服务器的性能并分配到各台机子上不需要在指定那台服务器如下面直接巨可以获取到 var_dump($mem->get('user10')); ``` **实战:** 可以设置不同网站的跨域session 将session存入缓存中 phpinfo()查看session suppert enabled registered save handlers files user memacache redis session保存的方式 session_save_handler files 默认是files ![](https://img.kancloud.cn/e6/44/e6440ca98e61304ee507b00d9f9b193a_952x58.png) 打开php.ini 更改session.save_handler = memache 更改session.save_path="Xampp/tmp" 为: session.save_path="tcp://localhost:11211" **thinkphp3 中使用** ``` namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function index(){ if (S('user')) { echo '从缓存中读取数据信息'; } else { // 1.查询数据 $user = M('user'); $data = $user->select(); // 默认采用文件方式保存数据 S('user',$data,10); } var_dump(S('user')); $this->display(); } } // 设置缓存 S('name',$value); S('name',$value,300); S('name',$value,array('type'=>'file','expire'=>300)); // 读取缓存 $value = S('name'); // 删除缓存 S('name',null); 对象的方式操作缓存: // 初始化缓存 $cache = S(array('type'=>'xcache','prefix'=>'think','expire'=>600)); // 设置缓存 $cache->name = 'value'; // 获取缓存 $value = $cache->name; // 删除缓存 unset($cache->name); config.php配置如下: 'DATA_TYPE' => 'memcache', 'MEMCACHE_HOST' =>'127,0,0,1', 'MEMCACHE_PORT'=>'11211', ``` 网站的瓶颈 主要集中在数据库 ,用缓存(直接操作内存) 存储计算机的内存,如果一旦服务器断电,数据都将清空 内存:memcached redis 基于文档:mongodb memcache:基于内存的高性能的分布式的内存管理系统(C语言,PHP的一个扩展) 键值对的存储 使用memcache的客户端:PHP 1.安装memcache的服务器端 cmd 1.1 进入到memcached.exe的目录 1.2 memcached.exe -d install 安装 1.3 memcached.exe -d start 启动 memcached.exe -d stop:关闭 memcached.exe -d uninstall:卸载 netstat:显示协议统计和当前 TCP/IP 网络连接。 netstat -a 显示所有连接和侦听端口。 memcache默认的端口号为11211 2.客户端连接memcache(telnet localhost 11211) stats:查看memcache运行状态信息 set 键 标识符 有效期 长度(只能存储字符串) set name 1 0(永久) 10(存储的值必须是10个长度) zhangsan get 键 delete 键 flush\_all :清空所有数据 stats cachedump 1 0:打印所有的数据 3.PHP连接memcache 1.将php\_memcache.dll放在php目录下的ext目录下 2.在php.ini配置文件中, 确保安装PHP与memcache的扩展 extension = php\_memcache.dll 3.重启apache,确认memcache扩展成功安装 memcache::addServer('localhost',11211) memcache::set(key,value,MEMCACHE\_COMPRESSED,有效期) memcache::get(key) memcache::delete(key) memcache::flush(): 高级session baidu.com tieba.baidu.com music.baidu.com sex.baidu.com // 必须确保能够连接成功 session.save\_handler = memcache session.save\_path = 'tcp://192.168.129.30:11211' ~~~ <?php // 1.实例化Memcache类 memcache $mem = new Memcache; // 2.配置memcache $mem->addServer('localhost',11211); // 3.向内存中添加数据(四种标量,数组,对象,是将这些数据类型转化为字符串进行存储) $mem->set('username','zhangsan'); $mem->set('age',20); $mem->set('price',20.99); $mem->set('bool',true); $mem->set('info',['username'=>'lisi','age'=>20,'sex'=>'男']); class Person { public $name = 'wangwu'; public $age = 20; public $sex = 1; } $mem->set('person',new Person); // set(键,值,指定压缩,设置有效期) $mem->set('weight','100KG',MEMCACHE_COMPRESSED,10); ~~~ ~~~ <?php // 1.先实例化memcache $mem = new Memcache; $mem->addServer('localhost',11211); // 2.判断内存中存在对应的数据信息 // 将sql语句单独提取并加密取6位出来作为存入数据的键值 $sql = 'select * from demo_user'; $key = substr(md5($sql),0,6); echo $key; $data = $mem->get($key); if ($data) { echo 'memcache服务器中有对应的数据信息'; } else { /* 一个小时改变一次内容,将此内容缓存一个小时 在一个小时内,从计算机的缓存中读取数据, 如果过期,从数据库读取,同时向缓存中再存入一份数据,在保存10s中 */ try { $pdo = new PDO('mysql:host=localhost;dbname=lamp129;charset=utf8','root',''); } catch (PDOException $p) { echo $p->getMessage(); } $stmt = $pdo->query($sql); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); // 将查询到的数据向memcache中写入 $mem->set($key,$data,MEMCACHE_COMPRESSED,100); echo '这是从数据库读取到的信息'; } ~~~ ~~~ <?php // 分布式缓存 $mem = new Memcache; // 连接多台memcache服务器 $mem->addServer('localhost',11211); $mem->addServer('192.168.129.67',11211); $mem->addServer('192.168.129.32',11211); for ($i=0;$i<100;$i++) { $mem->set("user{$i}",'zhangsan'); } var_dump($mem->get('user10')); ~~~ 当网站越来越大存储用户或者订单等session信息分布在不同的服务器上怎么办?www.tieba.baidu.com   www.music.baidu.com  www.baidu.com session跨域共享问题:将上述的服务器都装上memcache可以用将session数据存入memcache而不存入文件了 找到php.ini    session\_save\_handler=files   默认 改为session\_save\_handler=memcache session.save\_path='c:\\xampp\\tmp' 改为 session.save\_path='tcp://localhost:11211'