温馨提醒

亲爱的游客,你的浏览器太旧啦.都啥年代了.为了你的安全,为了你的体验,为更好的浏览本页, 赶紧更新一把吧.....本博客不支持ie8以下浏览器,如果你使用的是ie浏览器,请您更新到ie8或以上版本.

推荐使用谷歌浏览器(chrome)或火狐浏览器(Firefox),点击下方按键进行安装

码农部落

  ——好记性,不如烂博客!

php操作memcached

<?php
	//创建一个mem 对象实例
	$mem = new Memcache();
	if (!$mem->connect("127.0.0.1",11211)) {
		die("连接失败");	
	}

	//1、增加字串
	/*if ($mem->set('key1',"beijing",MEMCACHE_COMPRESSED,60)) {
		echo '添加ok';
	}*/

	//2添加数值
	/*if ($mem->set('key1',100,MEMCACHE_COMPRESSED,60)) {
		echo '添加数值ok';
	}*/

	//3.添加数组
	/*$arr=array("bj",'tj');
	if($mem->set('key1',$arr,MEMCACHE_COMPRESSED,time()+31*3600*24)){
		echo '添加数组ok';
	}*/

	//4.添加对象
	/*class Dog{
		public $name;
		public $age;
		public function __construct($name,$age){
			$this->name=$name;
			$this->age=$age;
		}
	}
	$dog1=new Dog('小狗',50);
	if($mem->set('key1',$dog1,MEMCACHE_COMPRESSED,60)){
		echo '添加对象ok';
	}*/

	//5.添加null 布尔值
	/*if($mem->set('key1',false,MEMCACHE_COMPRESSED,60)){
		echo '添加布尔ok';
	}*/

	//6. 资源类型放入.
	/*$con=mysql_connect("127.0.0.1","root","root");
	if(!$con){
		die('连接数据库失败');
	}
	if($mem->set('key1',$con,MEMCACHE_COMPRESSED,60)){
		echo '添加资源ok';
	}*/

	//7、修改
	/*if($mem->replace("key1",'hello',MEMCACHE_COMPRESSED,60)){
		echo 'replace ok';
	}else{
		echo 'replace no ok';
	}*/

	//删除
	if($mem->delete('key14')){
		echo 'key14 删除';
	}else{
		echo 'key14不存在';
	}

	//查询
	$val=$mem->get('key1');
	var_dump($val);
?>

提示:

在对数组或者是对象进行操作的时候,可以将它序列化(serialize),保存到memcache里,取出来的时候再反序列化(unserialize)就行了。如果根据需要,也可以json_encode <=> json_decode,下面是个例子:

$arr=array("bj",'tj');
	if($mem->set('key1',serialize($arr),MEMCACHE_COMPRESSED,time()+31*3600*24)){

		echo '添加数组ok99111';
	}
        $val=$mem->get('key1');
	var_dump(unserialize($val));

细节

在我们添加数据的时候,模式一般如下:
bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]] )
string $key 代表键名
mixed $var  代表键名对应的值
int  $flag  标志位,0为压缩,MEMCACHE_COMPRESSED为压缩
int $expire为要保存的时间
如果报 expire 设为0 表示,永不过期.(只要memcache不重新启动,就永远在mem中)
exprie 直接给的是秒数,则最大 30*3600*24(最多可以保存30天,如果超过30天,要用时间戳的方式)
如果你希望保持时间超过30  time()+天数*3600*24 (时间戳的方式)

window下,安装mencached

介绍:
memcached是一种缓存技术, 他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的, memcached技术的主要目的提速,
在memachec 中维护了一张大的hashtable表 ,该表是在内存,表的结构是
key value
字串 (字串,数值,数组,对象,布尔,二进制数据,null)

原理说明:
php_memcached
安装并使用memcached
安装步骤
下载memcached软件
安装
进入cmd ,切换到 memcached.exe 文件所在目录
memcached.exe –d install
启动memcached
第一种,可以到服务点击启动
第二种, 命令行
memcached.exe –m 200MB –d start 【以deamon方式启动,默认64M】
如果你在启动时,win7启动不成功, 则可以使用如下方法
memcached.exe –p 端口号
启动方法不要关闭控制台.

端口号的范围 : 0-65535 , 因为端口号是用两个字节来表示
有名端口: 0-1024 已经用程序使用 , apache 80 , mysql 3306 , ftp 21 , ssh 22
oracle: 1521, stmp: 25

使用netstat –an 如果看到 11211端口在监听,说明启动ok
netstat –anb 是哪个程序监听, 这个指令还可以看到有哪些用户连接到我们的服务器.

如果没有安装好,原因可能
如果你是win7, win7对安全性高,所有,必须以adminstartor 身份来安装.
你切换成adminstrator , 去安装,在启动
你的memcached.exe 目录有中文,或特殊字符, 保证目录没有中文和特殊字符.


6 个必备的PHP功能开发

做过PHP开发的程序员应该清楚,PHP中有很多内置的功能,掌握了它们,可以帮助你在做PHP开发时更加得心应手,本文将分享8个开发必备的PHP功能,个个都非常实用,希望各位PHP开发者能够掌握。
1、传递任意数量的函数参数
我们在.NET或者JAVA编程中,一般函数参数个数都是固定的,但是PHP允许你使用任意个数的参数。下面这个示例向你展示了PHP函数的默认参数:

// 两个默认参数的函数  
function foo($arg1 = ”, $arg2 = ”) {  
echo “arg1: $arg1\n”;  
echo “arg2: $arg2\n”;  
}  
foo(‘hello’,'world’);  
/* 输出: 
arg1: hello 
arg2: world 
*/  
foo();  
/* 输出: 
arg1: 
arg2: 
*/  
下面这个示例是PHP的不定参数用法,其使用到了 func_get_args()方法:  
// 是的,形参列表为空  
function foo() {  
// 取得所有的传入参数的数组  
$args = func_get_args();  
foreach ($args as $k => $v) {  
echo “arg”.($k+1).”: $v\n”;  
}  
}  
foo();  
/* 什么也不会输出 */  
foo(‘hello’);  
/* 输出 
arg1: hello 
*/  
foo(‘hello’, ‘world’, ‘again’);  
/* 输出 
arg1: hello 
arg2: world 
arg3: again 
*/  

2、使用glob()查找文件
大部分PHP函数的函数名从字面上都可以理解其用途,但是当你看到 glob() 的时候,你也许并不知道这是用来做什么的,其实glob()和scandir() 一样,可以用来查找文件,请看下面的用法:

// 取得所有的后缀为PHP的文件  
$files = glob(‘*.php’);  
print_r($files);  
/* 输出: 
Array 
( 
[0] => phptest.php 
[1] => pi.php 
[2] => post_output.php 
[3] => test.php 
) 
*/  

你还可以查找多种后缀名:

// 取PHP文件和TXT文件  
$files = glob(‘*.{php,txt}’, GLOB_BRACE);  
print_r($files);  
/* 输出: 
Array 
( 
[0] => phptest.php 
[1] => pi.php 
[2] => post_output.php 
[3] => test.php 
[4] => log.txt 
[5] => test.txt 
) 
*/

你还可以加上路径:

$files = glob(‘../images/a*.jpg’);  
print_r($files);  
/* 输出: 
Array 
( 
[0] => ../images/apple.jpg 
[1] => ../images/art.jpg 
) 
*/ 

如果你想得到绝对路径,你可以调用 realpath() 函数:

$files = glob(‘../images/a*.jpg’);  
// applies the function to each array element  
$files = array_map(‘realpath’,$files);  
print_r($files);  
/* output looks like: 
Array 
( 
[0] => C:\wamp\www\images\apple.jpg 
[1] => C:\wamp\www\images\art.jpg 
) 
*/  

3、获取内存使用情况信息
PHP的内存回收机制已经非常强大,你也可以使用PHP脚本获取当前内存的使用情况,调用memory_get_usage() 函数获取当期内存使用情况,调用memory_get_peak_usage() 函数获取内存使用的峰值。参考代码如下:

echo “Initial: “.memory_get_usage().” bytes \n”;  
/* 输出 
Initial: 361400 bytes 
*/  
// 使用内存  
for ($i = 0; $i < 100000; $i++) {  
$array []= md5($i);  
}  
// 删除一半的内存  
for ($i = 0; $i < 100000; $i++) {  
unset($array[$i]);  
}  
echo “Final: “.memory_get_usage().” bytes \n”;  
/* prints 
Final: 885912 bytes 
*/  
echo “Peak: “.memory_get_peak_usage().” bytes \n”;  
/* 输出峰值 
Peak: 13687072 bytes 
*/  

4、获取CPU使用情况信息
获取了内存使用情况,也可以使用PHP的 getrusage()获取CPU使用情况,该方法在windows下不可用。

print_r(getrusage());  
/* 输出 
Array 
( 
[ru_oublock] => 0 
[ru_inblock] => 0 
[ru_msgsnd] => 2 
[ru_msgrcv] => 3 
[ru_maxrss] => 12692 
[ru_ixrss] => 764 
[ru_idrss] => 3864 
[ru_minflt] => 94 
[ru_majflt] => 0 
[ru_nsignals] => 1 
[ru_nvcsw] => 67 
[ru_nivcsw] => 4 
[ru_nswap] => 0 
[ru_utime.tv_usec] => 0 
[ru_utime.tv_sec] => 0 
[ru_stime.tv_usec] => 6269 
[ru_stime.tv_sec] => 0 
) 
*/  

这个结构看上出很晦涩,除非你对CPU很了解。下面一些解释:
ru_oublock: 块输出操作
ru_inblock: 块输入操作
ru_msgsnd: 发送的message
ru_msgrcv: 收到的message
ru_maxrss: 最大驻留集大小
ru_ixrss: 全部共享内存大小
ru_idrss:全部非共享内存大小
ru_minflt: 页回收
ru_majflt: 页失效
ru_nsignals: 收到的信号
ru_nvcsw: 主动上下文切换
ru_nivcsw: 被动上下文切换
ru_nswap: 交换区
ru_utime.tv_usec: 用户态时间 (microseconds)
ru_utime.tv_sec: 用户态时间(seconds)
ru_stime.tv_usec: 系统内核时间 (microseconds)
ru_stime.tv_sec: 系统内核时间?(seconds)

要看到你的脚本消耗了多少CPU,我们需要看看“用户态的时间”和“系统内核时间”的值。秒和微秒部分是分别提供的,您可以把微秒值除以100万,并把它添加到秒的值后,可以得到有小数部分的秒数。

// sleep for 3 seconds (non-busy)  
sleep(3);  
$data = getrusage();  
echo “User time: “.  
($data['ru_utime.tv_sec'] +  
$data['ru_utime.tv_usec'] / 1000000);  
echo “System time: “.  
($data['ru_stime.tv_sec'] +  
$data['ru_stime.tv_usec'] / 1000000);  
/* 输出 
User time: 0.011552 
System time: 0 
*/  

sleep是不占用系统时间的,我们可以来看下面的一个例子:

// loop 10 million times (busy)  
for($i=0;$i<10000000;$i++) {  
}  
$data = getrusage();  
echo “User time: “.  
($data['ru_utime.tv_sec'] +  
$data['ru_utime.tv_usec'] / 1000000);  
echo “System time: “.  
($data['ru_stime.tv_sec'] +  
$data['ru_stime.tv_usec'] / 1000000);  
/* 输出 
User time: 1.424592 
System time: 0.004204 
*/  

这花了大约14秒的CPU时间,几乎所有的都是用户的时间,因为没有系统调用。
系统时间是CPU花费在系统调用上的上执行内核指令的时间。下面是一个例子:

$start = microtime(true);  
// keep calling microtime for about 3 seconds  
while(microtime(true) – $start < 3) {  
}  
$data = getrusage();  
echo “User time: “.  
($data['ru_utime.tv_sec'] +  
$data['ru_utime.tv_usec'] / 1000000);  
echo “System time: “.  
($data['ru_stime.tv_sec'] +  
$data['ru_stime.tv_usec'] / 1000000);  
/* prints 
User time: 1.088171 
System time: 1.675315 
*/  

我们可以看到上面这个例子更耗CPU
5、生成唯一的id

很多朋友都利用md5()来生成唯一的编号,但是md5()有几个缺点:1、无序,导致数据库中排序性能下降。2、太长,需要更多的存储空间。其实PHP中自带一个函数来生成唯一的id,这个函数就是uniqid()。下面是用法:

// generate unique string  
echo uniqid();  
/* 输出 
4bd67c947233e 
*/  
// generate another unique string  
echo uniqid();  
/* 输出 
4bd67c9472340 
*/  

该算法是根据CPU时间戳来生成的,所以在相近的时间段内,id前几位是一样的,这也方便id的排序,如果你想更好的避免重复,可以在id前加上前缀,如:

// 前缀  
echo uniqid(‘foo_’);  
/* 输出 
foo_4bd67d6cd8b8f 
*/  
// 有更多的熵  
echo uniqid(”,true);  
/* 输出 
4bd67d6cd8b926.12135106 
*/  
// 都有  
echo uniqid(‘bar_’,true);  
/* 输出 
bar_4bd67da367b650.43684647 
*/  

6、序列化

PHP序列化功能大家可能用的比较多,也比较常见,当你需要把数据存到数据库或者文件中是,你可以利用PHP中的serialize() 和 unserialize()方法来实现序列化和反序列化,代码如下:

// 一个复杂的数组  
$myvar = array(  
‘hello’,  
42,  
array(1,’two’),  
‘apple’  
);  
// 序列化  
$string = serialize($myvar);  
echo $string;  
/* 输出 
a:4:{i:0;s:5:”hello”;i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:”two”;}i:3;s:5:”apple”;} 
*/  
// 反序例化  
$newvar = unserialize($string);  
print_r($newvar);  
/* 输出 
Array 
( 
[0] => hello 
[1] => 42 
[2] => Array 
( 
[0] => 1 
[1] => two 
) 
[3] => apple 
) 
*/  

如何序列化成json格式呢,放心,php也已经为你做好了,使用php 5.2以上版本的用户可以使用json_encode() 和 json_decode() 函数来实现json格式的序列化,代码如下:

// a complex array  
$myvar = array(  
‘hello’,  
42,  
array(1,’two’),  
‘apple’  
);  
// convert to a string  
$string = json_encode($myvar);  
echo $string;  
/* prints 
["hello",42,[1,"two"],”apple”] 
*/  
// you can reproduce the original variable  
$newvar = json_decode($string);  
print_r($newvar);  
/* prints 
Array 
( 
[0] => hello 
[1] => 42 
[2] => Array 
( 
[0] => 1 
[1] => two 
) 
[3] => apple 
) 
*/  

php 解决约瑟夫(josephu)问题

Josephu 问题为:设编号为1,2,3…..N的N个人围坐一圈,约定编号为K(1<=K<=N) 的人从而1开始报数,数到m的那个人出列,它的下一位,又从1开始报数.数到m的那个再出列.依次类推,直到所有人出列.由此产生的一个出队的编号的序列.

<?php
class Child{
    public $no;
    public $next;
    public function __construct($no){
        $this->no=$no;
    }
}


$first=null;
/**
 * 产生一个环形链表
 * $n; //n表示小孩的个数
 */
function child(&$first,$n){
    $cur=null;
    for($i=0;$i<$n;$i++){
        $child=new Child($i+1);
        if($i==0){
            $first=$child;
            $cur=$first;
            $cur->next=$cur;
        }else{
            $cur->next=$child;
            $child->next=$first;
            $cur=$cur->next;
        }
    }
}
/**
 * 显示环形链表
 */
function show($first){
    $cur=$first;
    while($cur->next!==$first){
        echo "小孩的编号是:".$cur->no.'
'; $cur=$cur->next; } echo "小孩的编号是:".$cur->no.'
'; } function play($first,$k,$m){ //从第一个人开始数,数2 $cur=$first; $tail=$first; while($tail->next!==$first){ $tail=$tail->next; } for($i=0;$i<$k-1;$i++){ $cur=$cur->next; $tail=$tail->next; } while($cur->next!==$cur){ //找到要出列的小孩 for($i=0;$i<$m-1;$i++){ $cur=$cur->next; $tail=$tail->next; } echo "-".$cur->no; $cur=$cur->next; $tail->next=$cur; } echo "-".$cur->no; } child($first,10); play($first,2,3); ?>