php十一学习笔记
上大学以来每年的十一都是我进步最大的时候,记得09年的十一我用了八天时间在宿舍提前学了下java,结果开学后大家看我的眼光顿时就变了,还经常有人问我问题了,我也就装模作样的帮他们解答解答,总之那个十一让我有了一点点的成就感。想当年来软件学院本不是我的意愿,但是没有办法,高分的专业没有考上,只能硬着头皮学自己不感兴趣的专业,我的专业是软件工程,我挂的第一门课就是软件工程,随后虽然没有再挂过,但是一直在挂科的边缘,经常为考试不挂科废寝忘食的做小抄,考场上提心吊胆的把考卷填满,结果出来好多60分,也不知道是真的得了60还是老师可怜我,总之跟计算机沾边的课我都学不会。学C、跟C++哪是一个惨字能形容得了的,就没有自己完成作业过,每次上机课都是扫雷或者睡觉来度过的,后来学数据结构就更难听懂学会,这样两年的时间稀里糊涂的就没了。大三开始接触java,由于我利用十一时间提前的学习了并且感觉不错,所以让我找回了自信,接下来的算法、数据库我都学的很有劲头,虽然分数也不高,但是我还是比较有信心的。
10年的十一我刚开始接触前端,我觉得前端工程师职业前景很好,互联网行业高速发展前端职业在其中起了很大的作用,还记得高中的时候打开浏览器页面结构单一,并且动画几乎都是用flash来实现,下载特别慢。可是现在的网站丰富多彩,甚至可以在浏览器中直接玩网游,用户体验的变得非常的友好,异步通信实现了网页不用刷新就做到前后端信息传递,这让我觉得前端很神奇,他让互联网变成了一个“神话”。于是我连同十一外加一个多月的时间尽我所能的去接触前端技术了解前端的发展,终于在十一月份借着学校的光环和老师的推荐找到了我人生第一份工作,我成了一名前端开发工程师。我觉得我的转变很快,在此一年以前我还是一个上课睡觉下课闹闹考试抄抄的学生,那时我根本不敢想象继续下去会变成什么样子,谁知我神奇般的“复活了”。到现在实习加正式工作已经半年的时间了,我接触了很多人,学到了很多东西,都说交一个朋友胜过看好多本书,我是一个从来不爱看书的人,只能在身边人身上学东西了,朋友们,别怪我偷偷地吸取你们身上的能量,哈哈,总有一天我会强大起来。
今年的十一我也没有出去玩,窝在家里学了学php,因为我发现前端对php的使用还是蛮多的。这次学习php我不求精通,做到使用起来无障碍就OK。
乱七八糟说了这么多其实我就想对这几天的php学习做一次总结:
这次学习我是从一个网页抓取工具开始的,它叫做Snoopy,我把它翻译成“史努比”,我不知道原意是什么,但我知道我翻译后的名字是一个狗名,这只狗是用两条腿走路的,它会思考,它想成为一切,只除了“狗”,可能Snoopy的作者也有他自己的理想吧。
http://sourceforge.net/projects/snoopy/ 这是“史努比”官网地址,这里可以下载到源码,里面还有帮助文档。“史努比”使用起来很方便首先我们把源码下载到本地的一个目录,然后在自己的php页面里面引入
include "Snoopy.class.php";然后创建一个Snoopy实例
$snoopy = new Snoopy;这里我发现php创建实例时不用带括号像new Snoopy();这样,哈哈很有意思。然后它有一些基本方法:
include "Snoopy.class.php";
$snoopy = new Snoopy;
$snoopy->fetchtext("http://www.taobao.com");
print $snoopy->results;
这个方法是用来抓取指定网址页面内的所有文本内容,然后输出在自己的页面上。
类似的方法还有:
$snoopy->fetchlinks("http://www.taobao.com");
抓取淘宝首页上的所有连接地址;
fetchform("http://www.taobao.com");
抓取淘宝首页上的表单;
fetch("http://www.taobao.com");
这个我很喜欢,是抓取页面上所有HTML代码(php的file_get_contents这个方法也能达到同样效果);类似的方法还有很多,可以自己去查帮助文档。
接下来接触到的一些其他php方法就出现了:
1.其他网站的页面抓取过来如果和我们的页面编码不一样怎么办,首先需要做的操作就是将对方页面上的
<meta http-equiv="content-type" content="text/html;charset=utf-8">
字符编码方式替换称自己需要的
$html = preg_replace('/(UTF-8)|(utf-8)/','GBK',$snoopy->results);这是我第一种写法有点笨,还可以这样:
$patterns[0] = '/UTF-8/';
$patterns[1] = '/utf-8/';
$html = preg_replace($patterns,'GBK',$snoopy->results);
或许你觉得这样更麻烦,别误会我是想说preg_replace还可以这样使用,你不觉得很有意思么,当然最好的办法是:
$html = preg_replace('/UTF-8/i','GBK',$snoopy->results);正则表达式后加一个i就是忽略大小写的意思,这样最方便了。
这样还不能解决转码的问题,我们还需要做一个
$html = iconv("UTF-8","GBK//IGNORE",$html);这样的操作,意思是将页面的所有使用UTF-8编码的字符转换为GBK编码。//IGNORE的意思是忽略转码过程中的错误,如果不加这个参数会产生意想不到的错误哦。还有一个和iconv能达到同样效果的方法:
$html = mb_convert_encoding($html,"GBK", "UTF-8");注意两个方法参数的顺序不同哦。
2.想把抓取过来的页面内容转码后写入指定目录下的文件肿么办?
可以这样做:
$dirname = "dir1/dir2"; //两级目录,注意:开始和结尾都不要有"/"
$filename = "index.php";//文件名
write_into_file($dirname, $filename, $result);//这是一个自定义方法,定义在下面:
//写入文件
function write_into_file($dirname,$filename,$result){
create_dir($dirname);
cache_page("$dirname/$filename",$result);
}
//创建目录
function create_dir($dirname){
$dirarr = explode("/",$dirname);//以“/”为间隔拆分为数组
for($i=0;$i<count($dirarr);$i++){//判断数组长度用count()
$dir .= $dirarr[$i]."/"; //字符串连接使用“.”
if (!is_dir($dir)){ //检查目录是否存在
if (mkdir($dir)){ //创建目录
echo("<br>成功创建文件夹".$dir."<br>");
}else{
echo("<br>创建文件夹失败".$dir."<br>");
}
}
}
}
//创建文件并写入
function cache_page($pageurl,$pagedata){
if(!$fso=fopen($pageurl,'w')){//创建并以写的方式打开文件
$this->warns('无法打开缓存文件.');//trigger_error
return false;
}
if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
$this->warns('无法锁定缓存文件.');//trigger_error
return false;
}
if(!fwrite($fso,$pagedata)){//写入字节流
$this->warns('无法写入缓存文件.');//trigger_error
return false;
}
flock($fso,LOCK_UN);//释放锁定
fclose($fso);
return true;
}
这就是传说中比较恶心人的黏贴代码。但是我觉得有时一段代码可以胜过千言万语。
3.这是我需要浏览器重定向打开新页面肿么办?
header("Location: $dirname/$filename");//重定向浏览器
exit; //确保重定向后,后续代码不会被执行
4.php肿么取得request请求参数呢?
Get请求的参数都装在$_GET数组中,
Post请求参数都装在$_POST数组中,
如果不知道是哪种请求该肿么办?
那就去$_REQUEST数组里面找吧。
上面三个都是二维数组,想取出里面的参数要用$_GET[$name]这种方法,但是如果浏览器端没有传过来这个参数你就完了,服务器会报错,这时肿么做容错处理呢?我在apache目录里面的文件中看见一个这样的方法:
function _GET($n) {
return isset($_GET[$n]) ? $_GET[$n] : NULL; //isset是用来判断变量是否存在的方法
}
这样我们使用_GET($n)这个方法来取请求参数就可以了,如果没有这个参数就返回NULL。同时我又了解到unset()有释放变量指针的作用。还有使用function_exists()来判断一个方法是否存在。
5.我在别人的代码里看见$html = @file_get_contents($url);这样的使用,经查阅后知道@有屏蔽错误信息的作用。
6.还有一些有关数组的操作。in_array、sort、each、count、array_push、array_pop、array_shift、array_merge、array_key_exists。
7. http://www.kuqin.com/php5_doc/ 这是一个php在线文档很全面也有很多例子。
虽然没多少内容但是这都是我亲自遇到的,然后去查文档或者上网搜索相关文章后才解决的。