cURL库的强大功能和灵活的扩展性(4)_PHP技巧_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

cURL库的强大功能和灵活的扩展性(4)

作者:黑客防线网安PHP教程基地 来源:黑客防线网安PHP教程基地 浏览次数:0

本篇关键词:扩展灵活强大'
黑客防线网安网讯:  WebjxCom提示:今天我们一起学习了cURL库的强大功能和灵活的扩展性。希望你喜欢。下一次要发起URL请求时,考虑下cURL吧!    cURL批处理(multicURL)    cURL还有一个高级特性...
  WebjxCom提示:今天我们一起学习了cURL库的强大功能和灵活的扩展性希望你喜欢下一次要发起URL请求时考虑下cURL吧!
  
  cURL批处理(multicURL)
  
  cURL还有一个高级特性——批处理句柄(handle)。这一特性允许你同时或异步地打开多个URL连接。
  
  下面是来自来自php.net的示例代码:
  
  //创建两个cURL资源
  
  $ch1=curl_init();
  
  $ch2=curl_init();
  
  //指定URL和适当的参数
  
  curl_setopt($ch1,CURLOPT_URL,"http://lxr.php.net/");
  
  curl_setopt($ch1,CURLOPT_HEADER,0);
  
  curl_setopt($ch2,CURLOPT_URL,"http://www.php.net/");
  
  curl_setopt($ch2,CURLOPT_HEADER,0);
  
  //创建cURL批处理句柄
  
  $mh=curl_multi_init();
  
  //加上前面两个资源句柄
  
  curl_multi_add_handle($mh,$ch1);
  
  curl_multi_add_handle($mh,$ch2);
  
  //预定义一个状态变量
  
  $active=null;
  
  //执行批处理
  
  do{
  
  $mrc=curl_multi_exec($mh,$active);
  
  }while($mrc==CURLM_CALL_MULTI_PERFORM);
  
  while($active&&$mrc==CURLM_OK){
  
  if(curl_multi_select($mh)!=-1){
  
  do{
  
  $mrc=curl_multi_exec($mh,$active);
  
  }while($mrc==CURLM_CALL_MULTI_PERFORM);
  
  }
  
  }
  
  //关闭各个句柄
  
  curl_multi_remove_handle($mh,$ch1);
  
  curl_multi_remove_handle($mh,$ch2);
  
  curl_multi_close($mh);
  
  这里要做的就是打开多个cURL句柄并指派给一个批处理句柄。然后你就只需在一个while循环里等它执行完毕。
  
  这个示例中有两个主要循环。第一个do-while循环重复调用curl_multi_exec()。这个函数是无隔断(non-blocking)的但会尽可能少地执行。它返回一个状态值,只要这个值等于常量CURLM_CALL_MULTI_PERFORM,就代表还有一些刻不容缓的工作要做(例如,把对应URL的http头信息发送出去)。也就是说,我们需要不断调用该函数,直到返回值发生改变。
  
  而接下来的while循环,只在$active变量为true时继续。这一变量之前作为第二个参数传给了curl_multi_exec(),代表只要批处理句柄中是否还有活动连接。接着,我们调用curl_multi_select(),在活动连接(例如接受服务器响应)出现之前,它都是被“屏蔽”的。这个函数成功执行后,我们又会进入另一个do-while循环,继续下一条URL。
  
  还是来看一看怎么把这一功能用到实处吧:
  
  WordPress连接检查器
  
  想象一下你有一个文章数目庞大的博客,这些文章中包含了大量外部网站链接。一段时间之后,因为这样那样的原因,这些链接中相当数量都失效了。要么是被和谐了,要么是整个站点都被功夫网了...
  
  我们下面建立一个脚本,分析所有这些链接,找出打不开或者404的网站/网页,并生成一个报告。
  
  请注意,以下并不是一个真正可用的WordPress插件,仅仅是一段独立功能的脚本而已,仅供演示,谢谢。
  
  好,开始吧。首先,从数据库中读取所有这些链接:
  
  //CONFIG
  
  $db_host='localhost';
  
  $db_user='root';
  
  $db_pass='';
  
  $db_name='wordpress';
  
  $excluded_domains=array(
  
  'localhost','www.mydomain.com');
  
  $max_connections=10;
  
  //初始化一些变量
  
  $url_list=array();
  
  $working_urls=array();
  
  $dead_urls=array();
  
  $not_found_urls=array();
  
  $active=null;
  
  //连到MySQL
  
  if(!mysql_connect($db_host,$db_user,$db_pass)){
  
  die('Couldnotconnect:'.mysql_error());
  
  }
  
  if(!mysql_select_db($db_name)){
  
  die('Couldnotselectdb:'.mysql_error());
  
  }
  
  //找出所有含有链接的文章
  
  $q="SELECTpost_contentFROMwp_posts
  
  WHEREpost_contentLIKE'%href=%'
  
  ANDpost_status='publish'
  
  ANDpost_type='post'";
  
  $r=mysql_query($q)ordie(mysql_error());
  
  while($d=mysql_fetch_assoc($r)){
  
  //用正则匹配链接
  
  if(preg_match_all("!href="(.*?)"!",$d['post_content'],$matches)){
  
  foreach($matches[1]as$url){
  
  //excludesomedomains
  
  $tmp=parse_url($url);
  
  if(in_array($tmp['host'],$excluded_domains)){
  
  continue;
  
  }
  
  //storetheurl
  
  $url_list[]=$url;
  
  }
  
  }
  
  }
  
  //移除重复链接
  
  $url_list=array_values(array_unique($url_list));
  
  if(!$url_list){
  
  die('NoURLtocheck');
  
  }
  
  我们首先配置好数据库,一系列要排除的域名($excluded_domains),以及最大并发连接数($max_connections)。然后,连接数据库,获取文章和包含的链接,把它们收集到一个数组中($url_list)。
  
  
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-17624-1.html
网站维护教程更新时间:2012-09-21 05:22:24  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer