如下所示:复制代码 代码如下:/** * 入口函数 * 将此文件保存为 ProcessOpera.php * 在terminal中运行 /usr/local/php/bin/php ProcessOpera.php & * 查看进程 ps aux|grep php */ProcessOpera("runCode", array(), 8);/** * run Code */function runCode($opt = array()) {   //需要在守护进程中运行的代码}/** * $func为子进程执行具体事物的函数名称 * $opt为$func的参数 数组形式 * $pNum 为fork的子进程数量 */function ProcessOpera($func, $opts = array(),

用第一篇的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');代码如下:复制代码 代码如下:function get_htmls($urls, $options = array(), $method = 'get'){     $mh = curl_multi_init();     if($method == 'get'){//get方式传值 最常用         foreach($urls as $key=>$url){             $ch = curl_init($url);             $options[CURLOPT_RETURNTRANSFER] = true;             $options[CURLOPT_TIMEOUT] = 5;             curl_setopt_array($ch,$options);             $curls[$key] = $ch;             curl_multi_add_handle($mh,$curls[$key]);         }     }elseif($method == 'post'){//post方式传值          foreach($options as $key=>$option){             $ch = curl_init($urls);             $option[CURLOPT_RETURNTRANSFER] = true;             $option[CURLOPT_TIMEOUT] = 5;             $option[CURLOPT_POST] = true;             curl_setopt_array($ch,$option);             $curls[$key] = $ch;             curl_multi_add_handle($mh,$curls[$key]);         }     }else{         exit("参数出错!\n");     }     do{         $mrc = curl_multi_exec($mh,$active);         curl_multi_select($mh);//减少CPU压力 注释掉CPU压力变大     }while($active);     foreach($curls as $key=>$ch){         $html = curl_multi_getcontent($ch);         curl_multi_remove_handle($mh,$ch);         curl_close($ch);         $htmls[$key] = $html;     }     curl_multi_close($mh);     return $htmls; }常用的get请求是通过改变url参数来实现的,又因为我们的函数是针对数据采集的。必然是分类采集,所以网址类似于这种:http://www.baidu.com/s?wd=shili&pn=0&ie=utf-8http://www.baidu.com/s?wd=shili&pn=10&ie=utf-8http://www.baidu.com/s?wd=shili&pn=20&ie=utf-8http://www.baidu.com/s?wd=shili&pn=30&ie=utf-8http://www.baidu.com/s?wd=shili&pn=50&ie=utf-8上面五个页面是很有规律的,改变的仅仅是pn的值。复制代码 代码如下:$urls = array(); for($i=1; $i<=5; $i++){     $urls[] = 'http://www.baidu.com/s?wd=shili&pn='.(($i-1)*10).'&ie=utf-8'; } $option[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0'; $htmls = get_htmls($urls,$option); foreach($htmls as $html){     echo $html;//这里得到html 就可以进行数据处理了 }模拟常用的post请求:写一个post.php文件如下:复制代码 代码如下: if(isset($_POST['username']) && isset($_POST['password'])){     echo '用户名是: '.$_POST['username'].' 密码是: '.$_POST['password']; }else{     echo '请求错误!'; }然后调用如下:复制代码 代码如下:$url = 'http://localhost/yourpath/post.php';//这里是你的路径 $options = array(); for($i=1; $i<=5; $i++){     $option[CURLOPT_POSTFIELDS] = 'username=user'.$i.'&password=pass'.$i;     $options[] = $option; } $htmls = get_htmls($url,$options,

通用HTML标准超链接参数取得正则表达式测试 因为最近要做一个类似专业搜索引擎的东西,需要抓取网页的所有超链接。 大家帮忙测试一下子,下面的代码是否可以针对所有的标准超链接。 测试代码如下: 复制代码 代码如下:<?php // -------------------------------------------------------------------------- // File name : Noname1.php // Description : 通用链接参数获取正则表达式测试 // Requirement : PHP4 (http://www.php.net) // Copyright(C), HonestQiao, 2005, All Rights Reserved. // Author: HonestQiao ([email protected]) // 参数说明: // $strSource: 包含标准链接的HTML网页 // $strResult: 处理的结果 // 附加说明: // 标准链接,使用<a></a>形势包含的链接 // -------------------------------------------------------------------------- $strSource = <<<HTML <a href=1.htm>t1</a> <a href='2.htm'>t2</a> <a href="3.htm">t3</a> <a href=4.htm class=link>t4</a> HTML; preg_match_all('/<a.*?(?: \\t\\r\\n)?href=[\'"]?(.+?)[\'"]?(?:(?: \\t\\r\\n)+.*?)?>(.+?)<\/a.*?>/sim', $strSource, $strResult, PREG_PATTERN_ORDER); for($i = 0; $i < count($strResult[1]); $i++) { printf("%d href=(%s) title=(%s) \n", $i, $strResult[1][$i], $strResult[2][$i]); } ?> 如果您的测试数据,符合标准链接,但是此处没有被处理出来,请告诉我测试数据,以及你的测试环境。 谢谢。

一、 抽象类abstract class1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类。2 .抽象类不能被直接实例化。抽象类中只定义(或部分实现)子类需要的方法。子类可以通过继承抽象类并通过实现抽象类中的所有抽象方法,使抽象类具体化。3 .如果子类需要实例化,前提是它实现了抽象类中的所有抽象方法。如果子类没有全部实现抽象类中的所有抽象方法,那么该子类也是一个抽象类,必须在 class 前面加上 abstract 关键字,并且不能被实例化。复制代码 代码如下:abstract class A  {      /** 抽象类中可以定义变量 */     protected $value1 = 0;      private $value2 = 1;      public $value3 = 2;      /** 也可以定义非抽象方法 */     public function my_print()      {          echo "hello,world/n";      }      /**      * 大多数情况下,抽象类至少含有一个抽象方法。抽象方法用abstract关键字声明,其中不能有具体内容。      * 可以像声明普通类方法那样声明抽象方法,但是要以分号而不是方法体结束。也就是说抽象方法在抽象类中不能被实现,也就是没有函数体“{some codes}”。      */     abstract protected function abstract_func1();      abstract protected function abstract_func2();  }  abstract class B extends A  {      public function abstract_func1()      {         echo "implement the abstract_func1 in class A/n";      }      /** 这么写在zend studio 8中会报错*/     //abstract protected function abstract_func2();  }  class C extends B  {      public function abstract_func2()      {         echo "implement the abstract_func2 in class A/n";      }  }  4 .如果像下面这样创建了一个继承自 A 的子类 B ,但是不实现抽象方法 abstract_func() :复制代码 代码如下:Class B extends A{};  那么程序将出现以下错误: 复制代码 代码如下: Fatal error: Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (A::abstract_func)  5 .如果 B 实现了抽象方法 abstract_func() ,那么 B 中 abstract_func() 方法的访问控制不能比 A 中 abstract_func() 的访问控制更严格,也就是说:(1)      如果 A 中 abstract_func() 声明为 public ,那么 B 中 abstract_func() 的声明只能是 public ,不能是 protected 或 private(2)      如果 A 中 abstract_func() 声明为 protected ,那么 B 中 abstract_func() 的声明可以是 public 或 protected ,但不能是 private(3)      如果 A 中 abstract_func() 声明为 private ,嘿嘿,不能定义为 private 哦!( Fatal error : Abstract function A::abstract_func() cannot be declared private )二、 接口interface1 .抽象类提供了具体实现的标准,而接口则是纯粹的模版。接口只定义功能,而不包含实现的内容。接口用关键字 interface 来声明。2 . interface 是完全抽象的,只能声明方法,而且只能声明 public 的方法,不能声明 private 及 protected 的方法,不能定义方法体,也不能声明实例变量 。然而, interface 却可以声明常量变量 。但将常量变量放在 interface 中违背了其作为接口的作用而存在的宗旨,也混淆了 interface 与类的不同价值。如果的确需要,可以将其放在相应的 abstract class 或 Class 中。复制代码 代码如下:interface iA  {      const AVAR=3;      public function iAfunc1();      public function iAfunc2();  }  echo iA:: AVAR; 3 .任何实现接口的类都要实现接口中所定义的所有方法复制代码 代码如下:class E implements iA  {      public function iAfunc1(){echo "in iAfunc1";}      public function iAfunc2(){echo "in iAfunc2";}  }  否则该类必须声明为 abstract 。复制代码 代码如下:abstract class E implements iA{}  4 .一个类可以在声明中使用 implements 关键字来实现某个接口。这么做之后,实现接口的具体过程和继承一个仅包含抽象方法的抽象类是一样的。一个类可以同时继承一个父类和实现任意多个接口。 extends 子句应该在 implements 子句之前。 PHP 只支持继承自一个父类,因此 extends 关键字后只能跟一个类名。复制代码 代码如下:interface iB  {      public function iBfunc1();      public function iBfunc2();  }  class D extends A implements iA,iB  {      public function abstract_func1()      {         echo "implement the abstract_func1 in class A/n";      }      public function abstract_func2()      {         echo "implement the abstract_func2 in class A/n";      }      public function iAfunc1(){echo "in iAfunc1";}      public function iAfunc2(){echo "in iAfunc2";}      public function iBfunc1(){echo "in iBfunc1";}      public function iBfunc2(){echo "in iBfunc2";}  }  class D extends B implements iA,iB  {      public function abstract_func1()      {         parent::abstract_func1();         echo "override the abstract_func1 in class A/n";      }      public function abstract_func2()      {         echo "implement the abstract_func2 in class A/n";      }      public function iAfunc1(){echo "in iAfunc1";}      public function iAfunc2(){echo "in iAfunc2";}      public function iBfunc1(){echo "in iBfunc1";}      public function iBfunc2(){echo "in iBfunc2";}  }  5 .接口不可以实现另一个接口,但可以继承多个复制代码 代码如下:interface iC extends iA,iB{}  class F implements iC  {      public function iAfunc1(){echo "in iAfunc1";}      public function iAfunc2(){echo "in iAfunc2";}      public function iBfunc1(){echo "in iBfunc1";}      public function iBfunc2(){echo "in iBfunc2";}  }  三、 抽象类和接口的异同1. 相同点:(1)      两者都是抽象类,都不能实例化。(2)      interface 实现类及 abstract class 的子类都必须要实现已经声明的抽象方法。2. 不同点:(1)      interface 需要实现,要用 implements ,而 abstract class 需要继承,要用 extends 。(2)      一个类可以实现多个 interface ,但一个类只能继承一个 abstract class 。(3)      interface 强调特定功能的实现,而 abstract class 强调所属关系。(4)      尽管 interface 实现类及 abstract class 的子类都必须要实现相应的抽象方法,但实现的形式不同。 interface 中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体 ) ,实现类必须要实现。而 abstract class 的子类可以有选择地实现。这个选择有两点含义: a) abstract class 中并非所有的方法都是抽象的,只有那些冠有 abstract 的方法才是抽象的,子类必须实现。那些没有 abstract 的方法,在 abstract class 中必须定义方法体; b) abstract class 的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。(5)      abstract class 是 interface 与 class 的中介。 abstract class 在 interface 及 class 中起到了承上启下的作用。一方面, abstract class 是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。(6)      接口中的抽象方法前不用也不能加 abstract 关键字,默认隐式就是抽象方法,也不能加 final 关键字来防止抽象方法的继承。而抽象类中抽象方法前则必须加上 abstract 表示显示声明为抽象方法。(7)      接口中的抽象方法默认是 public 的,也只能是 public 的,不能用 private , protected 修饰符修饰。而抽象类中的抽象方法则可以用 public , protected 来修饰,但不能用 private 。3. interface 的应用场合(1)      类与类之间需要特定的接口进行协调,而不在乎其如何实现。(2)      作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。(3)      需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。(4)      需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。4. abstract class 的应用场合一句话,在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。最常见的有:(1)      定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用 abstract class 定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。(2)      某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。 abstract 的中介作用可以很好地满足这一点。(3)      规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特 定的功能 。

作者:Haohappy      MSN: haohappy at msn.comBlog: http://blog.csdn.net/haohappy20042006-07-04 为什么需要Debugger?很多PHP程序员调试使用echo、print_r()、var_dump()、printf()等,其实对于有较丰富开发经验的程序员来说这些也已经足够了,他们往往可以在程序执行的过程中,通过输出特定变量的值可以判断程序执行是否正确,甚至效率高低也可以看出来(当然可能还需要使用一些时间函数)。那么我们为什么还需要一个专门的调试程序来监控我们的程序运行呢? 这个问题的答案不妨留到后面来揭晓。 什么是Xdebug?Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。Xdebug现在的最新版本是xdebug 2.0.0beta6,支持PHP4/PHP5。 官方站点:www.Xdebug.org 如何安装Xdebug?以PHP5.1.4,Windows平台为例(其它PHP版本,其它平台请参看官网文档):1. 登录www.xdebug.org,在首页右侧有一个Windows modules,选择其中的PHP5.1.2+,下载php_xdebug-5.1.2-2.0.0beta6.dll文件; 2. 将下载的php_xdebug-5.1.2-2.0.0beta6.dll放到C:\php5\ext目录,重命名为php_xdebug.dll;3. 编辑php.ini,加入下面几行:extension=php_xdebug.dll[Xdebug]xdebug.profiler_enable=onxdebug.trace_output_dir="I:\Projects\xdebug"xdebug.profiler_output_dir="I:\Projects\xdebug"  后面的目录“I:\Projects\xdebug”为你想要放置Xdebug输出的数据文件的目录,可自由设置。4. 重启Apache;5. 写一个test.php,内容为<?php phpinfo(); ?>,如果输出的内容中有看到xdebug,说明安装配置成功。现在我们就可以开始使用Xdebug强大的功能了!

分类:腾博会官方网

时间:2016-03-09 04:02:10