PHP-CURL库常用功能 (2011-03-29)

使用PHP的cURL库可以简单和有效地去抓网页。你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据 了。无论是你想从从一个链接上取部分数据,或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内容,cURL 是一个功能强大的PHP库。

PHP中的CURL函数库(Client URL Library Function)

curl_close — 关闭一个curl会话
curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数
curl_errno — 返回一个包含当前会话错误信息的数字编号
curl_error — 返回一个包含当前会话错误信息的字符串
curl_exec — 执行一个curl会话
curl_getinfo — 获取一个curl连接资源句柄的信息
curl_init — 初始化一个curl会话
curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源
curl_multi_close — 关闭一个批处理句柄资源
curl_multi_exec — 解析一个curl批处理句柄
curl_multi_getcontent — 返回获取的输出的文本流
curl_multi_info_read — 获取当前解析的curl的相关传输信息
curl_multi_init — 初始化一个curl批处理句柄资源
curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected"
curl_setopt_array — 以数组的形式为一个curl设置会话参数
curl_setopt — 为一个curl设置会话参数
curl_version — 获取curl相关的版本信息

curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。

代码如下
  1. ﹤?php
  2. // 初始化一个 cURL 对象
  3. $curl = curl_init();
  4.  
  5. // 设置你需要抓取的URL
  6. curl_setopt($curl, CURLOPT_URL, 'http://www.cmx8.cn');
  7.  
  8. // 设置header
  9. curl_setopt($curl, CURLOPT_HEADER, 1);
  10.  
  11. // 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
  12. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  13.  
  14. // 运行cURL,请求网页
  15. $data = curl_exec($curl);
  16.  
  17. // 关闭URL请求
  18. curl_close($curl);
  19.  
  20. // 显示获得的数据
  21. var_dump($data);
  22.  
  23. ?>


例子二: POST数据

代码如下
  1. ﹤?php
  2. $phoneNumber = '13812345678';
  3. $message = 'This message was generated by curl and php';
  4. $curlPost = 'pNUMBER=' . urlencode($phoneNumber) . '&MESSAGE=' . urlencode($message) . '&SUBMIT=Send';
  5. $ch = curl_init();
  6. curl_setopt($ch, CURLOPT_URL, 'http://www.lxvoip.com/sendSMS.php');
  7. curl_setopt($ch, CURLOPT_HEADER, 1);
  8. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  9. curl_setopt($ch, CURLOPT_POST, 1);
  10. curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
  11. $data = curl_exec();
  12. curl_close($ch);
  13. ?﹥

例子三:使用代理服务器
例子四: 模拟登录
Curl 模拟登录 discuz 程序,适合DZ7.0,将username改成你的用户名,userpass改成你的密码就可以了.
代码如下
  1. <?php  
  2. /**  
  3. * Curl 模拟登录 discuz 程序  
  4. * 尚未实现开启验证码的的论坛登录功能  
  5. */  
  6.  
  7. !extension_loaded('curl') && die('The curl extension is not loaded.');  
  8.  
  9. $discuz_url = 'http://www.lxvoip.com';//论坛地址  
  10. $login_url = $discuz_url .'/logging.php?action=login';//登录页地址  
  11. $get_url = $discuz_url .'/my.php?item=threads'; //我的帖子  
  12.  
  13. $post_fields = array();  
  14. //以下两项不需要修改  
  15. $post_fields['loginfield'] = 'username';  
  16. $post_fields['loginsubmit'] = 'true';  
  17. //用户名和密码,必须填写  
  18. $post_fields['username'] = 'lxvoip';  
  19. $post_fields['password'] = '88888888';  
  20. //安全提问  
  21. $post_fields['questionid'] = 0;  
  22. $post_fields['answer'] = '';  
  23. //@todo验证码  
  24. $post_fields['seccodeverify'] = '';  
  25.  
  26. //获取表单FORMHASH  
  27. $ch = curl_init($login_url);  
  28. curl_setopt($ch, CURLOPT_HEADER, 0);  
  29. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
  30. $contents = curl_exec($ch);  
  31. curl_close($ch);  
  32. preg_match('/<inputs*type="hidden"s*name="formhash"s*value="(.*?)"s*/>/i', $contents, $matches);  
  33. if(!empty($matches)) {  
  34.     $formhash = $matches[1];  
  35. } else {  
  36.     die('Not found the forumhash.');  
  37. }  
  38.  
  39. //POST数据,获取COOKIE  
  40. $cookie_file = dirname(__FILE__) . '/cookie.txt';  
  41. //$cookie_file = tempnam('/tmp');  
  42. $ch = curl_init($login_url);  
  43. curl_setopt($ch, CURLOPT_HEADER, 0);  
  44. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
  45. curl_setopt($ch, CURLOPT_POST, 1);  
  46. curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);  
  47. curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);  
  48. curl_exec($ch);  
  49. curl_close($ch);  
  50.  
  51. //带着上面得到的COOKIE获取需要登录后才能查看的页面内容  
  52. $ch = curl_init($get_url);  
  53. curl_setopt($ch, CURLOPT_HEADER, 0);  
  54. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);  
  55. curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);  
  56. $contents = curl_exec($ch);  
  57. curl_close($ch);  
  58.  
  59. var_dump($contents);  
  60. ?>

 抓取和分析一个文件是非常简单的事。这个教程将通过一个例子带领你一步一步地去实现它。让我们开
始吧!

首先,我首必须决定我们将抓取的URL地址。可以通过在脚本中设定或通过$QUERY_STRING传递。为了简
单起见,让我们将变量直接设在脚本中。

<?
$url = 'http://www.php.net';
?>;

第二步,我们抓取指定文件,并且通过file()函数将它存在一个数组里。

<?
$url = 'http://www.php.net';
$lines_array = file($url);
?>;

好了,现在在数组里已经有了文件了。但是,我们想分析的文本可能不全在一行里面。为了解决这个文
件,我们可以简单地将数组$lines_array转化成一个字符串。我们可以使用implode(x,y)函数来实现它。如
果在后面你想用explode(将字符串变量数组),将x设成"|"或"!"或其它类似的分隔符可能会更好。但是出于
我们的目的,最好将x设成空格。y是另一个必要的参数,因为它是你想用implode()处理的数组。

<?
$url = 'http://www.php.net';
$lines_array = file($url);
$lines_string = implode('', $lines_array);
?>;

现在,抓取工作就做完了,下面该进行分析了。出于这个例子的目的,我们想得到在<head>;到</head>;
之间的所有东西。为了分析出字符串,我们还需要叫做正规表达式的东西。

<?
$url = 'http://www.php.net';
$lines_array = file($url);
$lines_string = implode('', $lines_array);
eregi("<head>;(.*)</head>;", $lines_string, $head);
?>;

让我们看一下代码。正如你所见,eregi()函数按下面的格式执行:

eregi("<head>;(.*)</head>;", $lines_string, $head);

"(.*)"表示所有东西,可以解释为,"分析在<head>;和</head>;间的所以东西"。$lines_string是我们正
在分析的字符串,$head是分析后的结果存放的数组。

最后,我们可以输数据。因为仅在<head>;和</head>;间存在一个实例,我们可以安全的假设数组中仅存
在着一个元素,而且就是我们想要的。让我们把它打印出来吧。

<?
$url = 'http://www.php.net';
$lines_array = file($url);
$lines_string = implode('', $lines_array);
eregi("<head>;(.*)</head>;", $lines_string, $head);
echo $head[0];
?>;

这就是全部的代码了。

点击查看原文阅读(646) | 评论(0) | 分类:我的日记

Win7装memcached和svn自动添加$Id$,$Revision$等keywords (2011-03-24)

最近PHP工作上的两个小技巧,高手不要看了

一.Win7中安装memcached扩展,省去了网上大篇文章,三步即可完成

1.配置apache中的httpd.comf
找到LoadModule mem_cache_module modules/mod_mem_cache.so 把注释去掉

2.配置php.ini 加入memcache扩展
extension=php_memcache.dll

3.将php_memcache.dll复制到\ext扩展目录,重启apache,php就可以了(php_memcache.dll在附件中下载)

二.svn自动添加$Id$,$Revision$等keywords,简单总结步骤如下:

1.右键->settings->General->Subversion->Edit
找到#enable-auto-props = yes  把"#"注释删掉
添加以下配置
*.css = svn:keywords=LastChangedRevision LastChangedBy URL LastChangedDate Id
*.php = svn:keywords=LastChangedRevision LastChangedBy URL LastChangedDate Id
*.html = svn:keywords=LastChangedRevision LastChangedBy URL LastChangedDate Id
*.tpl = svn:keywords=LastChangedRevision LastChangedBy URL LastChangedDate Id
*.txt = svn:keywords=LastChangedRevision LastChangedBy URL LastChangedDate Id
*.js = svn:keywords=LastChangedRevision LastChangedBy URL LastChangedDate Id

这样修改后的效果是吧文件中的$Id$替换成版本等信息
如:$Id$ $LastChangedDate$ 提交后会自动添加版本信息
 $Id: test.php 2058 2011-03-24 07:36:55Z wangzhen $
 $LastChangedDate: 2011-03-24 15:36:55 +0800 (周四, 24 三月 2011) $



 

点击查看原文阅读(889) | 评论(1) | 分类:PHP

心情很差 (2011-03-19)

从周五到今天心情都不好,
也没发生什么不好的事
但心情为什么很差呢。。。

点击查看原文阅读(686) | 评论(2) | 分类:我的日记

最近工作中遇到的小问题总结 (2011-03-03)

最近工作中遇到的小问题总结

1. PHP GD库生成图片中文乱码
要确保字体支持中文,
有必要进行编码转换$text=iconv( "GBK ", "UTF-8 ",$text);
如果用iconv函数不好使的情况下用
$text1 = mb_convert_encoding($text1, "html-entities","utf-8" );
乱码问题解决

2.MySql 字段类型错误,使用 Cast与Convert函数转换类型
遇到这样的问题,varchar字段排序的时候有错误
SELECT * FROM table ORDER BY user_score DESC
会得到这样的排序,显然是错误的
1
10
2
3
4
5
$sql = "SELECT *,CONVERT(user_score,SIGNED) FROM table
                WHERE user_score < {$score}";

二进制,同带binary前缀的效果 : BINARY    
字符型,可带参数 : CHAR()     
日期 : DATE     
时间: TIME     
日期时间型 : DATETIME     
浮点数 : DECIMAL      
整数 : SIGNED     
无符号整数 : UNSIGNED 

转换类型后问题解决

3.MySql 时间戳存储类型错误
时间戳存了INT类型显然是错误的,不能用DATE_FORMAT函数进行转换时间格式
$sql = "SELECT * , FROM_UNIXTIME( user_time, '%Y-%m-%d' ) AS user_date
                        FROM table";
使用FROM_UNIXTIME函数问题解决

以上都是一些小问题,但也浪费了一些时间
今后在建立数据字段类型的时候会严格按照类型建立,才不会出这么多问题
 

点击查看原文阅读(574) | 评论(0) | 分类:PHP

关于有效工作时间 (2011-02-24)

最近工作效率很低,于是自己反省了一下
以后要提高有效工作时间。

以下是是网上关于有效工作时间的说明

 是指工人工作时间中的必须消耗的时间中的一项,与生产直接有关的时间消耗,包括准备与结束时间、基本工作时间和辅助工作时间。一般有效工作时间占上班时间的1/2已经很不错了。

调查数据表明,员工有效工作时间只有30%~40%,超过60%的工作时间都是无效的!如何解决这个难题?《大师亚斯》说,“难题总是以简单的方法解决”。工作日志,就是解决这个问题的一种简单办法。实践证明,只要遵循3E-PRC原则,就能通过工作日志这个简单工具,将有效工作时间提升到80%以上。

点击查看原文阅读(695) | 评论(1) | 分类:我的日记