题目:有一群朋友在玩捉迷藏游戏,不时有新的小朋友加入,请问如何知道现在共有多少人在玩?请使用面向对象的思想,编写程序解决。
解决这个问题有2中方法:使用全局变量和静态变量
//有一群朋友在玩捉迷藏游戏,不时有新的小朋友加入,
//请问如何知道现在共有多少人在玩?
//请使用面向对象的思想,编写程序解决。
/*
//1种方法使用全局变量
global $global_nums;
//先声明全局变量后再对它进行赋值
$global_nums=0;
class Child{
public $name;
//构造方法
public function __construct($name){
$this->name=$name;
}
//定义一个方法统计人数
public function allPlay(){
//先声明使用全局变量
global $global_nums;
$global_nums+=1;
echo $this->name."加入游戏.<br/>";
}
}
$p1=new Child("lily");
$p1->allPlay();
$p2=new Child("lucy");
$p2->allPlay();
$p3=new Child("kucy");
$p3->allPlay();
echo $global_nums;
*/
//第二在类中 使用静态变量
class Child{
public $name;
//在类中声明静态变量
public static $allPlay=0;
public function __construct($name){
$this->name=$name;
}
//统计人数
public function addPlay(){
//在类中使用静态变量。在类中有下面2中方式访问静态变量
//self::$静态变量名和类名::$静态变量名
//self::$allPlay+=1;
Child::$allPlay+=1;
echo $this->name."加入游戏.<br/>";
}
}
$p1=new Child("lily");
$p1->addPlay();
$p2=new Child("lucy");
$p2->addPlay();
$p3=new Child("kucy");
$p3->addPlay();
$p4=new Child("uucy");
$p4->addPlay();
//在类外只有一种方式访问静态变量:类名::$静态变量名
echo Child::$allPlay;
?>
本文链接
用第一篇的get_html()实现简单的数据采集,由于是一个一个执行才采集数据的传输时间就会是所有页面下载的总时长,一个页面假设1秒,那么10个页面就是10秒了。所幸curl还提供了并行处理的功能。
要写一个并行采集的函数,先要了解要采集什么样的页面,对采集的页面用什么请求,才能写出一个相对常用的函数。
功能需求分析:
返回什么?
当然每一个页面的html集合成的数组
传递什么参数?
编写get_html()时,我们知道了可以用options数组来传递更多的curl参数,那么多页面同时采集函数的编写这种特性也得保留下来。
什么类型的参数?
无论是请求网页HTML,还是调用互联网api接口,get和post传递参数总是请求同一个页面或者接口,只是参数不同罢了。那么参数的类型是:
get_htmls($url,$options);
$url 是string
$options,是一个二维数组,每一个页面的参数为一个数组。
这样的话,貌似解决了问题。但是我找遍了curl的手册都没有看到get的参数传递在什么地方,所以只能$url 是数组的形式传递并且增加一个method参数
函数的原型就定下来了get_htmls($urls,$options = array, $method = ‘get’);代码如下:
2 $mh = curl_multi_init();
3 if($method == 'get'){//get方式传值 最常用
4 foreach($urls as $key=>$url){
5 $ch = curl_init($url);
6 $options[CURLOPT_RETURNTRANSFER] = true;
7 $options[CURLOPT_TIMEOUT] = 5;
8 curl_setopt_array($ch,$options);
9 $curls[$key] = $ch;
10 curl_multi_add_handle($mh,$curls[$key]);
11 }
12 }elseif($method == 'post'){//post方式传值
13 foreach($options as $key=>$option){
14 $ch = curl_init($urls);
15 $option[CURLOPT_RETURNTRANSFER] = true;
16 $option[CURLOPT_TIMEOUT] = 5;
17 $option[CURLOPT_POST] = true;
18 curl_setopt_array($ch,$option);
19 $curls[$key] = $ch;
20 curl_multi_add_handle($mh,$curls[$key]);
21 }
22 }else{
23 exit("参数出错!\n");
24 }
25 do{
26 $mrc = curl_multi_exec($mh,$active);
27 curl_multi_select($mh);//减少CPU压力 注释掉CPU压力变大
28 }while($active);
29 foreach($curls as $key=>$ch){
30 $html = curl_multi_getcontent($ch);
31 curl
从manual上知道了mysql_affected_rows函数当UPDATE前后的数据一样时会返回异常值,
下面有个方便的解决办法,从官方munual上看到 bdobrica at gmail dot com 留言的:
As a solution to the problem pointed in the post reffering to mysql_affected_rows() returning 0 when you are making an update query and the fields are not modified although the query is valid, i'm posting the following function. It is very simple and based on a previous post.
$info_str = mysql_info();
$a_rows = mysql_affected_rows();
ereg("Rows matched: ([0-9]*)", $info_str, $r_matched);
return ($a_rows < 1)?($r_matched[1]?$r_matched[1]:0):$a_rows;
}
PS:因为这个小问题折腾了半天,感觉php真是太不清晰了
本文链接