以前使用curl的多线程并不是真正的多线程,只是一种模拟的多线程,现在使用pthreads来实现真正意义上的多线程。
线程和进程十分相似,不同的只是线程比进程小。首先,线程采用了多个线程可共享资源的设计思想;例如,它们的操作大部分都是在同一地址空间进行的。其次,从一个线程切换到另一线程所花费的代价比进程低。再次,进程本身的信息在内存中占用的空间比线程大,因此线程更能允分地利用内存。
线程之间通常需要进行交互,因此就存在使用 IPC 进行多进程通信的问题。本文中对于多进程通信问题不做过多的讨论,因为 POXIS 线程 API 提供了处理诸如死锁和竞态条件这类问题的工具。本文主要讨论特定于多线程编程的问题和解决方案,一般的多道程序设计问题留待以后讨论。
线程程序有时会出现在多进程和 IPC 程序设计中不常出现的一些问题。例如,如果两个线程同时调用一个函数,如 asctime() (它使用一个静态的数据区),会产生不可思议的结果。这是“线程安全”要考虑的问题。
windows下:
解压得到pthreadVC2.dll和php_pthreads.dll文件,把vc2文件放到php.exe同级目录,把php_pthreads.dll放到扩展目录下。
修改php.ini文件 添加extension=php_pthreads.dll
修改Apache配置文件httpd.conf 添加LoadFile "yourpath/php/pthreadVC2.dll"
结合以前的get_html也可以这样来实现类
1 class threads extends Thread
2 {
3 public $url = '';
4 public $options = array();
5 public $data;
6
7 public function __construct($url, $options = array()){
8 $this->url = $url;
9 $this->options = $options;
10 }
11
12 public function run(){
13 if(!empty($this->url)){
14 $this->data = $this->get_html($this->url, $this->options);
15 }
16 }
17
18 public function get_html($url,$options = array()){
19 if(empty($options)){
20 $options[CURLOPT_RETURNTRANSFER] = true;
21 $options[CURLOPT_TIMEOUT] = 5;
22 }
23 $ch = curl_init($url);
24 curl_setopt_array($ch,$options);
25 $html = curl_exec($ch);
26 curl_close($ch);
27 if($html === false){
28 return false;
29 }
30 return $html;
31 }
32 }