2、创建phpinfo()页面,查询session项下面的Registeredsave handlers值中是否有memcache项
浏览器访问test1.php
测试代码:
[root@nginx-php ~]# cat /usr/local/nginx1.10/html/test2.php
<?php
$memcache = new Memcache;
$memcache->connect('192.168.31.250', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version."<br/>";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
echo "Store data in the cache (data will expire in 10 seconds)<br/>";
$get_result = $memcache->get('key');
echo "Data from the cache:<br/>";
var_dump($get_result);
?>
You have mail in /var/spool/mail/root
浏览器访问test2.php
使用memcache实现session共享
1)配置php.ini中的Session为memcache方式。
session.save_handler = memcache
session.save_path = "tcp://192.168.31.250:11211?persistent=1&weight=1&timeout=1&retry_interval=15
注:
session.save_handler:设置session的储存方式为memcache。默认以文件方式存取session数据,如果想要使用自定义的处理来存取session数据,比如memcache方式则修为session.save_handler = memcache
session.save_path:设置session储存的位置,多台memcache用逗号隔开
使用多个 memcached server 时用逗号”,”隔开,可以带额外的参数”persistent”、”weight”、”timeout”、”retry_interval”等等,
类似这样的:"tcp://host:port?persistent=1&weight=2,tcp://host2:port2"。
2)memcache实现session共享也可以在某个一个应用中设置:
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://192.168.31.141:11211");
ini_set()只对当前php页面有效,并且不会去修改php.ini文件本身,也不会影响其他php页面。
测试memcache可用性
重启php-fpm
在web服务器上新建//usr/local/nginx1.10/html/memcache.php文件。内容如
[root@nginx-php ~]# cat /usr/local/nginx1.10/html/memcache.php
<?php
session_start();
if (!isset($_SESSION['session_time']))
{
$_SESSION['session_time'] = time();
}
echo "session_time:".$_SESSION['session_time']."<br />";
echo "now_time:".time()."<br />";
echo "session_id:".session_id()."<br />";
?>
访问网址http://192.168.31.141/memcache.php可以查看session_time是否都是为memcache中的Session,同时可以在不同的服务器上修改不同的标识查看是否为不同的服务器上的。
可以直接用sessionid 去 memcached 里查询一下:
[root@nginx-php ~]# telnet 192.168.31.250 11211
Trying 192.168.31.250...
Connected to 192.168.31.250.
Escape character is '^]'.
get 940t1dqt22r49op3h3c9rho510
VALUE 940t1dqt22r49op3h3c9rho510 0 26
session_time|i:1490351103;
得到session_time|i:1490351103;这样的结果,说明session 正常工作
默认memcache会监听11221端口,如果想清空服务器上memecache的缓存,一般使用的是:
[root@nginx-php ~]# telnet 192.168.31.250 11211
Trying 192.168.31.250...
Connected to 192.168.31.250.
Escape character is '^]'.
flush_all
OK
或
[root@nginx-php ~]# echo "flush_all" | nc 192.168.31.250 11211
OK
使用flush_all 后并不是删除memcache上的key,而是置为过期
memcache安全配置
因为memcache不进行权限控制,因此需要通过iptables将memcache仅开放个web服务器。
7、测试memcache缓存数据库数据
在Mysql服务器上创建测试表
mysql> create database testdb1;
Query OK, 1 row affected (0.02 sec)
mysql> use testdb1;
Database changed
mysql> create table test1(id int not null auto_increment,name varchar(20) default null,primary key (id)) engine=innodb auto_increment=1 default charset=utf8;
Query OK, 0 rows affected (0.20 sec)
mysql> insert into test1(name) values ('tom1'),('tom2'),('tom3'),('tom4'),('tom5');
Query OK, 5 rows affected (0.03 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from test1;
+----+------+
| id | name |
+----+------+
| 1 | tom1 |
| 2 | tom2 |
| 3 | tom3 |
| 4 | tom4 |
| 5 | tom5 |
+----+------+
5 rows in set (0.01 sec)
测试
下面就是测试的工作了,这里有个php脚本,用于测试memcache是否缓存数据成功
需要为这个脚本添加一个只读的数据库用户,命令格式
grant select on testdb1.* to user@'%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.16 sec)
在web服务器上创建测试脚本内容如下:
[root@nginx-php ~]# cat /usr/local/nginx1.10/html/test_db.php
<?php
$memcachehost = '192.168.31.250';
$memcacheport = 11211;
$memcachelife = 60;
$memcache = new Memcache;
$memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");
$query="select * from test1 limit 10";
$key=md5($query);
if(!$memcache->get($key))
{
$conn=mysql_connect("192.168.31.225","user","123456");
mysql_select_db(testdb1);
$result=mysql_query($query);
while ($row=mysql_fetch_assoc($result))
{
$arr[]=$row;
}
$f = 'mysql';
$memcache->add($key,serialize($arr),0,600);
$data = $arr ;
}
else{
$f = 'memcache';
$data_mem=$memcache->get($key);
$data = unserialize($data_mem);
}
echo $f;
echo "<br>";
echo "$key";
echo "<br>";
//print_r($data);
foreach($data as $a)
{
echo "number is <b><font color=#FF0000>$a[id]</font></b>";
echo "<br>";
echo "name is <b><font color=#FF0000>$a[name]</font></b>";
echo "<br>";
}
?>
访问页面测试
如果出现mysql表示memcached中没有内容,需要memcached从数据库中取得
再刷新页面,如果有memcache标志表示这次的数据是从memcached中取得的。
memcached有个缓存时间默认是1分钟,过了一分钟后,memcached需要重新从数据库中取得数据
查看 Memcached 缓存情况
我们需要使用 telnet 命令查看
[root@nginx-php ~]# telnet 192.168.31.250 11211
Trying 192.168.31.250...
Connected to 192.168.31.250.
Escape character is '^]'.
stats
STAT pid 1596 //Memcached进程的ID
STAT uptime 3417 //进程运行时间
STAT time 1490352577 //当前时间
STAT version 1.4.33 // Memcached 版本
STAT libevent 2.0.22-stable
STAT pointer_size 64
STAT rusage_user 0.267961
STAT rusage_system 1.306311
STAT curr_connections 16
STAT total_connections 30
STAT connection_structures 17
STAT reserved_fds 20
STAT cmd_get 33 //总共获取数据的次数(等于 get_hits + get_misses )
STAT cmd_set 75 //总共设置数据的次数
STAT cmd_flush 2
STAT cmd_touch 0
STAT get_hits 29 //命中了多少次数据,也就是从 Memcached 缓存中成功获取数据的次数
STAT get_misses 4 //没有命中的次数
STAT get_expired 0
STAT get_flushed 1
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 2
STAT incr_hits 21
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 6705
STAT bytes_written 3696
STAT limit_maxbytes 1073741824 //总的存储大小,默认为 64M
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT time_in_listen_disabled_us 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT malloc_fails 0
STAT log_worker_dropped 0
STAT log_worker_written 0
STAT log_watcher_skipped 0
STAT log_watcher_sent 0
STAT bytes 702
STAT curr_items 4
STAT total_items 54
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 2
STAT crawler_reclaimed 0
STAT crawler_items_checked 0
STAT lrutail_reflocked 0
END
命中率= get_hits/ cmd_get
总结:
Memcache缓存服务器将数据缓存到内存中,提高用户访问效率,但是一旦服务器宕机数据将丢失,所以不安全。
Memcache服务器之间本身互不通信也不数据共享还不具备分布式功能,如果要实现memcache服务器数据session共享机制,需要在memcache客户端部署,例如本实例中在php客户端安装memcache软件
什么是短标签,下面来举个例子:
通常php网页文件书写格式是:
<?php
phpinfo();
?>
但是如果启用了短标签功能��short_open_tag = On)可以用如下的书写格式:
<?
phpinfo();
?>
注:如果没有启用短标签功能(short_open_tag = Off)的话,必须写成第一种格式类型。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-03/142168.htm