您好,欢迎访问一九零五行业门户网

使用Memcache在PHP中调试方法的介绍及应用

使用memcache在php中调试方法的介绍及应用
    如果我们在网络开发中,特别是大访问量的web项目开发中,为了提高响应速度,减少数据查询运算,那么我们都会选用memcahce。首先我们必须要安装,接下来如何使用memcache,在这里介绍下在linux下安装和windows下安装如下及配置:
一、 linux下的memcache安装:
1.下载memcache的linux版本,注意 memcached 用 libevent 来作事件驱动,所以要先安装有 libevent。
2. 安装 pecl::memcache。
用 pecl 命令行工具安装:
pecl install memcache
或直接从源码安装:
phpize
./configure
make
make install
二、windows下的memcache安装:
  1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached
2. 在终端(也即cmd命令界面)下输入 ‘c:\memcached\memcached.exe -d install’ 安装
3. 再输入: ‘c:\memcached\memcached.exe -d start’ 启动。note: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。
4.下载http://pecl4win.php.net/ext.php/php_memcache.dll,请自己查找对应的php版本的文件
5. 在c:\winnt\php.ini 加入一行 ‘extension=php_memcache.dll’
6.重新启动apache,然后查看一下phpinfo,如果有memcache,那么就说明安装成功!
三、memcached的基本设置:
-p 监听的端口
-l 连接的ip地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位mb。默认64mb
-m 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
四、php.ini中的配置:
[memcache]
一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
是否在遇到错误时透明地向其他服务器进行故障转移。
memcache.allow_failover = on
接受和发送数据时最多尝试多少个服务器,只在打开memcache.allow_failover时有效。memcache.max_failover_attempts = 20
数据将按照此值设定的块大小进行转移。此值越小所需的额外网络传输越多。如果发现无法解释的速度降低,可以尝试将此值增加到32768。
memcache.chunk_size = 8192
连接到memcached服务器时使用的默认tcp端口。
memcache.default_port = 11211
控制将key映射到server的策略。默认值standard表示使用先前版本的老hash策略。
设为consistent可以允许在连接池中添加/删除服务器时不必重新计算key与server之间的映射关系。
memcache.hash_strategy = standard; 
控制将key映射到server的散列函数。默认值crc32使用crc32算法,而fnv则表示使用fnv-1a算法。 fnv-1a比crc32速度稍低,但是散列效果更好。
memcache.hash_function = crc32
memcache也可以作为session的存储模块,具体参看:memcache php 的 session.save_handler.
   1. $memcache = new memcache;   
   2. $memcache->connect('localhost', 11211) or die (could not connect);   
   3.   
   4. $version = $memcache->getversion();   
   5. echo server's version: .$version.
\n;   
   6.   
   7. $tmp_object = new stdclass;   
   8. $tmp_object->str_attr = 'test';   
   9. $tmp_object->int_attr = 123;   
  10.   
  11. $memcache->set('key', $tmp_object, false, 10) or die (failed to save data at the server);   
  12. echo store data in the cache (data will expire in 10 seconds)
\n;   
  13.   
  14. $get_result = $memcache->get('key');   
  15. echo data from the cache:
\n;   
  16.   
  17. var_dump($get_result);  
我们已经安装好了,也配置好了memcache,现在接下来如何调试memcache.
来做个测试。
先搞个表:
create table t(id char(36) not null primary key, username varchar(20) not null);
插点数据:
insert into t values (uuid(),'livia'),(uuid(),'lucy'),(uuid(),'sivia'),(uuid(),'david');
写个简单脚本测试一下。
connect(192.168.1.21, 11211); 
$mem->set($sql,$test_key, memcache_compressed, 600);
print_r($mem->get($sql)); 
?>
看看结果出来了。
c:\>php -f d:/lamp/web2/phpinfo.php 
array 

[0] => array 

[id] => d8f1ec2a-c033-11dd-bd1a-002215c94322 
[username] => david 
)
[1] => array 

[id] => d8f1eb9e-c033-11dd-bd1a-002215c94322 
[username] => sivia 
)
[2] => array 

[id] => d8f1ea9a-c033-11dd-bd1a-002215c94322 
[username] => lucy 
)
[3] => array 

[id] => d8f1e658-c033-11dd-bd1a-002215c94322 
[username] => livia 
)
)
现在我们已经介绍memcache安装,不再赘述。再次着重介绍memcache的一些常用方法。
memcache::add // 添加一个值,如果已经存在,则返回false
memcache::addserver // 添加memcache地址
memcache::close // 关闭一个memcache的连接
memcache::connect // 打开一个到memcache的连接
memcache::decrement // 对保存的某个key中的值进行减法操作
memcache::delete // 删除一个memcache上的key值
memcache::flush // 刷新所有memcache上保存的项目(类似于删除所有的保存的项目)
memcache::get // 从memcache上获取一个key值
memcache::getextendedstats // 获取进程池中所有进程的运行系统统计
memcache::getserverstatus // 获取运行服务器的参数
memcache::getstats //获取当前memcache服务器运行的状态
memcache::getversion // 返回运行的memcache的版本信息
memcache::increment // 对保存的某个key中的值进行加法操作
memcache::pconnect // 打开一个到memcache的长连接
memcache::replace // 替换一个已经存在memcache服务器上的项目(功能类似memcache::set)
memcache::set // 向memcache添加一个值,如果已经存在,则覆写
memcache::setcompressthreshold // 对大于某一大小的数据进行压缩
memcache::setserverparams // 在运行时修改服务器的参数
下面是一些简单的用法实例,仅供参考:
  connect(127.0.0.1, 12000);
  //memcache::set方法有四个参数,第一个参数是key,第二个参数是value,第三个参数可选,表示是否压缩保存,第四个参数可选,用来设置一个过期自动销毁的时间。
  $mem->set('test','123',0,60);
  //memcache::add方法的作用和memcache::set方法类似,区别是如果 memcache::add方法的返回值为false,表示这个key已经存在,而memcache::set方法则会直接覆写。
$mem->add('test','123',0,60);
//memcache::get方法的作用是获取一个key值,memcache::get方法有一个参数,表示key。
$mem->get('test');//输出为'123'
//memcache::replace 方法的作用是对一个已有的key进行覆写操作,memcache::replace方法有四个参数,作用和memcache::set方法的相同。
$mem->replace('test','456',0,60);
 //memcache::delete方法的作用是删除一个key值,memcache::delete方法有两个参数,第一个参数表示key,第二个参数可选,表示删除延迟的时间。
$mem->delete('test',60);
?>
                                                                     肖承湖
php缓存应用:php memcache 详解
2010-01-28 09:38:44 来源:中国站长站综合 【大 中 小】 评论:0 条 我要投稿 收藏本文 分享至微博 
站长交易(http://jy.chinaz.com)帮站长赚钱 虚拟主机评测+idc导航=idc123.com
memcache函数库是在pecl(php extension community library)中,主要作用是搭建大容量的内存数据的临时存放区域,在分布式的时候作用体现的非常明显,否则不建议使用。在ubuntu上安装完运行的时候报错:
/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: 
cannot open shared object file: no such file or directory
按照:《libeven、memcached、libmemcache安装》中的方法,使用:
sudo ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2
可以修正这个bug
通过新得立安装php的memcached模块,注销/etc/php5/conf.d/memcached.ini里面的“;”,重启apache,调用phpinfo()出现memcached的信息。
connect('localhost', 11211) or die (could not connect);    
$version = $memcache->getversion();    
echo server's version: .$version.\n;    
?>
1. connect('localhost', 11211) or die (could not connect);    
4. print_r($memcache->getstats());    
5. /**   
6. * array   
7. * (   
8. *     [pid] => 8052   
9. *     [uptime] => 9205   
10. *     [time] => 1205898428   
11. *     [version] => 1.2.5   
12. *     [pointer_size] => 32   
13. *     [rusage_user] => 0.008000   
14. *     [rusage_system] => 0.000000   
15. *     [curr_items] => 1   
16. *     [total_items] => 17   
17. *     [bytes] => 57   
18. *     [curr_connections] => 2   
19. *     [total_connections] => 15   
20. *     [connection_structures] => 3   
21. *     [cmd_get] => 9   
22. *     [cmd_set] => 23   
23. *     [get_hits] => 5   
24. *     [get_misses] => 4   
25. *     [evictions] => 0   
26. *     [bytes_read] => 671   
27. *     [bytes_written] => 850   
28. *     [limit_maxbytes] => 10485760   
29. *     [threads] => 1   
30. * )   
31. */    
32. ?>
01.connect('localhost', 11211) or die (could not connect); 
04.$memcache->set( 'name', 'leo', 0, 30); 
05.if(!$memcache->add( 'name', 'susan', 0, 30)) 
06.{ 
07. echo 'susan is exist'; 
08.}; 
09.$memcache->replace( 'name', 'lion', 0, 300); 
10.echo $memcache->get( 'name'); 
11.$memcache->delete( 'name', 5); 
12.?>
01.addserver('192.168.1.116', 11211); 
07.$memcache->setserverparams('192.168.1.116', 11211, 1, 15, true, 
08. 
09.'_callback_memcache_failure'); 
10.echo $memcache->getserverstatus('192.168.1.116', 11211); 
11.?>
php缓存应用:php memcache 详解(2)
2010-01-28 09:38:44 来源:中国站长站综合 【大 中 小】 评论:0 条 我要投稿 收藏本文 分享至微博 
站长交易(http://jy.chinaz.com)帮站长赚钱 虚拟主机评测+idc导航=idc123.com
memcached的服务正式启动
建议用面向对象的方式来测试这个库:
memcache::getversion方法的作用是返回运行的memcache的版本信息。 
memcache::getstats 方法的作用是返回服务器的一些运行统计信息。memcache::getstats方法有三个参数,第一个参数表示要求返回的类型:reset, malloc, maps, cachedump, slabs, items, sizes;第二个参数和第三个参数是在第一个参数设置“cachedump”时使用的。memcache::getextendedstats方法的作 用是获取进程池中所有进程的运行系统统计。
memcache_debug()函数的作用是控制调试功能,前提是php在编译的时候使用了–enable-debug选项,否则这个函数不会有作用。
memcache::addserver 方法的作用是添加一个可供使用的服务器地址,memcache::addserver方法有8个参数,除了第一个参数意外,其他都是可选的,第一个参数表 示服务器的地址,第二个参数表示端口,第三个参数表示是否是一个持久连接,第四个参数表示这台服务器在所有服务器中所占的权重,第五个参数表示连接的持续 时间,第六个参数表示连接重试的间隔时间,默认为15,设置为-1表示不进行重试,第七个参数用来控制服务器的在线状态,第8个参数允许设置一个回掉函数 来处理错误信息。
memcache::setserverparams方法的作用是在运行时修改服务器的参数,memcache::setserverparams 方法有六个参数,memcache::addserver方法少了第三和第四个参数。 memcache::getserverstatus方法的作用是获取运行服务器的参数,两个参数分别表示的地址和端口。
memcache::flush方法的作用是清除所有缓存的数据,但是不会削去使用的内存空间。
memcache::increment方法的作用是对保存的某个key中的值进行加法操作,memcache::decremen方法的作用是对保存的某个key中的值进行减法操作。
php memcache高级缓存应用详解 文章录入:7747.net    责任编辑:7747.net  269 
【字体:小 大】
01.connect('localhost', 11211); 
04.$memcache->set('test_item', 8); 
05.$memcache->increment('test_item', 4); 
06.echo $memcache->decrement('test_item', 7); 
07.// 显示 5 
08.?>
memcache函数库是在 pecl(php extension community library)中,主要作用是搭建大容量的内存数据的
临时存放区域,在分布式的时候作用体现的非常明显,否则不建议使用。 本人在ubuntu上安装
完运行的时候报错:
/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: 
cannot open shared object file: no such file or directory
按照:《libeven、memcached、libmemcache安装》中的方法,使用:
sudo ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2
可以修正这个bug
通过新得立安装php的memcached模块,注销/etc/php5/conf.d/memcached.ini里面的“;”,重启apache
,调用phpinfo()出现memcached的信息
执行:
connect('localhost', 11211) or die (could not connect); 
$version = $memcache->getversion(); 
echo server's version: .$version. 
\n; 
?> 
connect('localhost', 11211) or die (could not connect); 
print_r($memcache->getstats()); 
/** 
* array 
* ( 
*     [pid] => 8052 
*     [uptime] => 9205 
*     [time] => 1205898428 
*     [version] => 1.2.5 
*     [pointer_size] => 32 
*     [rusage_user] => 0.008000 
*     [rusage_system] => 0.000000 
*     [curr_items] => 1 
*     [total_items] => 17 
*     [bytes] => 57 
*     [curr_connections] => 2 
*     [total_connections] => 15 
*     [connection_structures] => 3 
*     [cmd_get] => 9 
*     [cmd_set] => 23 
*     [get_hits] => 5 
*     [get_misses] => 4 
*     [evictions] => 0 
*     [bytes_read] => 671 
*     [bytes_written] => 850 
*     [limit_maxbytes] => 10485760 
*     [threads] => 1 
* ) 
*/ 
?> 
connect('localhost', 11211) or die (could not connect); 
$memcache->set( 'name', 'leo', 0, 30); 
if(!$memcache->add( 'name', 'susan', 0, 30)) 

    echo 'susan is exist'; 
}; 
$memcache->replace( 'name', 'lion', 0, 300); 
echo $memcache->get( 'name'); 
$memcache->delete( 'name', 5); 
?>  
addserver('192.168.1.116', 11211); 
$memcache->setserverparams('192.168.1.116', 11211, 1, 15, true,  
'_callback_memcache_failure'); 
echo $memcache->getserverstatus('192.168.1.116', 11211); 
?> 
connect('localhost', 11211); 
$memcache->set('test_item', 8); 
$memcache->increment('test_item', 4); 
echo $memcache->decrement('test_item', 7); 
// 显示 5 
?> 
/usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -p 
                /tmp/memcached.pid
memcached的服务正式启动
memcache::add — 添加一个值,如果已经存在,则返回false
memcache::addserver — 添加一个可供使用的服务器地址
memcache::close — 关闭一个memcache对象
memcache::connect — 创建一个memcache对象
memcache_debug — 控制调试功能
memcache::decrement — 对保存的某个key中的值进行减法操作
memcache::delete — 删除一个key值
memcache::flush — 清除所有缓存的数据
memcache::get — 获取一个key值
memcache::getextendedstats — 获取进程池中所有进程的运行系统统计
memcache::getserverstatus — 获取运行服务器的参数
memcache::getstats — 返回服务器的一些运行统计信息
memcache::getversion — 返回运行的memcache的版本信息
memcache::increment — 对保存的某个key中的值进行加法操作
memcache::pconnect — 创建一个memcache的持久连接对象
memcache::replace — r对一个已有的key进行覆写操作
memcache::set — 添加一个值,如果已经存在,则覆写
memcache::setcompressthreshold — 对大于某一大小的数据进行压缩memcache::setserverparams — 在运行时修改服务器的参数 
建议用面向对象的方式来测试这个库:  
memcache::getversion方法的作用是返回运行的memcache的版本信息。
memcache::getstats 方法的作用是返回服务器的一些运行统计信息。memcache::getstats方法有三个参
数,第一个参数表示要求返回的类型:reset, malloc, maps, cachedump, slabs, items, sizes;第二个
参数和第三个参数是在第一个参数设置为“cachedump”时使用的。memcache::getextendedstats方法的
作用是获取进程池中所有进程的运行系统统计。 
memcache::connect方法的作用是创建一个memcache对象。memcache::pconnect方法的作用是创建一个
memcache的持久连接对象。memcache::close方法的作用是关闭一个memcache对象。
memcache::set 方法的作用是添加一个值,memcache::set方法有四个参数,第一个参数是key,第二个参
数是value,第三个参数可选,表示是否压缩保存,第四个参数可选,用来设置一个过期自动销毁的时间
。memcache::add方法的作用和memcache::set方法类似,区别是如果 memcache::add方法的返回值为
false,表示这个key已经存在,而memcache::set方法则会直接覆写。 memcache::get方法的作用是获取
一个key值,memcache::get方法有一个参数,表示key。memcache::replace 方法的作用是对一个已有的
key进行覆写操作,memcache::replace方法有四个参数,作用和memcache::set方法的相同。 
memcache::delete方法的作用是删除一个key值,memcache::delete方法有两个参数,第一个参数表示key
,第二个参数可选,表示删除延迟的时间。
memcache_debug()函数的作用是控制调试功能,前提是php在编译的时候使用了–enable-debug选项,否
则这个函数不会有作用。
memcache::addserver 方法的作用是添加一个可供使用的服务器地址,memcache::addserver方法有8个参
数,除了第一个参数意外,其他都是可选的,第一个参数表示服务器的地址,第二个参数表示端口,第三
个参数表示是否是一个持久连接,第四个参数表示这台服务器在所有服务器中所占的权重,第五个参数表
示连接的持续时间,第六个参数表示连接重试的间隔时间,默认为15,设置为-1表示不进行重试,第七个
参数用来控制服务器的在线状态,第8个参数允许设置一个回掉函数来处理错误信息。
memcache::setserverparams方法的作用是在运行时修改服务器的参数,memcache::setserverparams方法
有六个参数,memcache::addserver方法少了第三和第四个参数。 memcache::getserverstatus方法的作
用是获取运行服务器的参数,两个参数分别表示的地址和端口。
memcache::flush方法的作用是清除所有缓存的数据,但是不会削去使用的内存空间。
memcache::increment方法的作用是对保存的某个key中的值进行加法操作,memcache::decremen方法的作
用是对保存的某个key中的值进行减法操作。 
discuz!的memcache缓存实现
前言: 
在php+mysql架构的站点中,本文重点从mysql的角度去分析如何使discuz!论坛(或者类似的php+mysql架构的程序)应对大访问 量。同时给出一些使用memcache去减轻mysql压力的建议。其中很多数据是个人测试的结果,如有不同意见,敬请留言告之。另外由于个人思维的问 题,行文比较跳跃,特此声明! 
系统分析: 
单纯的从mysql的角度出发,单台mysql的数据库负载到每天上亿次的操作(每秒大概1100次mysql操作,然后乘以86400)应该不是非常困 难的事情。按照这个数据也就是说一个单mysql服务器的论坛来说可以跑到2千万pv是不成问题的,我相信国内绝大部分的论坛都不可能做到每天2千万的 pv,但实际情况并不是如此。当论坛pv超过百万的时候一台web早已经不堪重负了。 
就我手头的一些数据显示,目前的discuz!论坛的基本服务器架构是前面squid顶着,后面才是一台db在撑着。这种架构中,web服务器压力增大可 以通过并行增加服务器解决,而mysql压力却无处释放,在不考虑mysql官方服务的情况下,我们通过合理的利用memcache是可以达到减轻 mysql服务器负载的。 
可能会有朋友说我们可以对数据表进行分表(注:此处分表是指通过php程序去分表,比如pw,dv的分表)处理,但是当前的情况是一台db服务器已经不能 支撑当前的数据处理了,通过php对mysql进行的分表依然不能减轻mysql的负载。(注:本段文字针对已经成型的系统,如果是独立开发的系统在架构 前期就进行数据的同步分区还是不错的。) 
还可能有朋友会说利用mysql的主从构架,如果你提出这个问题,我就很明确的告诉你,回去看看手册吧。在mysql master/slave 模式中,slave主要是来备份数据的,只有当master出现故障时,slave才会接过master的服务,对外部请求进行处理,直到master恢 复正常。就是说:在master/slave中,要么是master在服务,要么是slave在服务,不会master/slave同时提供服务。使用 mysql主从依然不能有效的降低mysql的负载。 
或许你又会问我为什么不使用mysql集群(mysql cluster),那可是白花花的银子啊,同等金钱的付出下,获得最大的收益才是王道。ps:说句题外话,mysql手册中将mysql集群解释为mysql簇,不习惯。 
其实在mysql5.1中的mysql分区(mysql partition)是个很好的东西,它允许根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分。实际上,表的不同部分在不同的位置被存储为 单独的表。我认为这个才是当前情况下,最积极有效的降低mysql负载的解决方法之一。但是遗憾的是,这种mysql分区的方式我个人没有使用过的经历, 也不见有相当充分的案例表明它是稳定的或者不稳定的。所以我还在徘徊中。如果你知道,请麻烦告之!有朋友说腾讯是在用mysql分区,但是遗憾的是我没有 得到确切的数据。 
好了分析总结了这么多种降低mysql负载的方式之后,在用户环境需求等特定条件下,我得出结论在当前情况下,缓解discuz!论坛的mysql负载比较有效的方法就是使用memcache! 
使用memcache的理由: 
1.web server(lighttpd、nginx据说都比apache效率高好多,大家可以试用下)对cpu要求高,对内存要求低;而memcached server是对cpu要求低,对内存要求高,所以可以搭配使用。在对前端的web server上安装memcached server是可行的。 
2.金钱金钱金钱,最少的付出,获得最大的收益。 
3.简单简单简单,对于一个架构合理的系统来说,添加memcache的支持可能只是一个批量处理文件的过程 
discuz!使用memcache 
1.在config.inc.php中增加 
$memcachehost = '127.0.0.1'; 
$memcacheport = 11211; 
$memcachelife = 60; 
2.在include/common.inc.php中 
$mem = new memcache; 
$mem->connect($memcachehost, $memcacheport); 
3.修改include/db_mysql.class.php中的fetch_array、query这两个方法,并添加query_mysql方法,代码如下: 
function fetch_array($query, $result_type = mysql_assoc) { 
return is_resource($query) ? mysql_fetch_array($query, $result_type) : $query[0]; 

function query_memcache($sql, $type = '') { 
global $mem,$memcachelife; 
$key = md5($sql); 
if(!($query = $mem->get($key))) { 
$query = $this->query($sql, $type); 
while($item = $this->fetch_array($query)) { 
$res[] = $item; 

$query = $res; 
$mem->set($key, $query , 0, $memcachelife); 

return $query; 

function query($sql, $type = '') { 
global $debug, $discuz_starttime, $sqldebug, $sqlspenttimes; 
$func = $type == 'unbuffered' && @function_exists('mysql_unbuffered_query') ? 
'mysql_unbuffered_query' : 'mysql_query'; 
if(!($query = $func($sql, $this->link)) && $type != 'silent') { 
$this->halt('mysql query error', $sql); 

if(substr($sql, 0, 6) == 'select') { 
echo 'cache sql:'.$sql.'
'; 
} else { 
echo 'flash sql:'.$sql.'
'; 

$this->querynum++; 
return $query; 

4.将需要使用memcache缓存的sql查询的代码由 
$db->query( 
修改为 
$db->query_memcache( 
注意并将 
while($post = $db->fetch_array($query)) { 
修改为 
foreach($query as $post) { 
没有while的$db->fetch_array可以不用修改。 
下面代码有用得着的就拿去: 
preg_replace(/while[math processing error]\)/is, foreach(\$query as \$\\1), $file); 
回头放出个小工具批量替换下就可以了。 
在editplus中可以这样替换:while[math processing error]\)替换为foreach($query as $\1) 
5.完成了,测试吧!~ 
参考资料: 
对memcached有疑问的朋友可以参考下列文章: 
linux下的memcache安装:http://www.ccvita.com/index.php/257.html 
windows下的memcache安装:http://www.ccvita.com/index.php/258.html 
memcache基础教程:http://www.ccvita.com/index.php/259.html 
discuz!的memcache缓存实现:http://www.ccvita.com/index.php/261.html
以上就介绍了使用memcache在php中调试方法的介绍及应用,包括了方面的内容,希望对php教程有兴趣的朋友有所帮助。
其它类似信息

推荐信息