以前使用curl的多線程并不是真正的多線程,只是一種模擬的多線程,現(xiàn)在使用pthreads來實現(xiàn)真正意義上的多線程。
什么是線程?
線程和進程十分相似,不同的只是線程比進程小。首先,線程采用了多個線程可共享資源的設(shè)計思想;例如,它們的操作大部分都是在同一地址空間進行的。其次,從一個線程切換到另一線程所花費的代價比進程低。再次,進程本身的信息在內(nèi)存中占用的空間比線程大,因此線程更能允分地利用內(nèi)存。
線程之間通常需要進行交互,因此就存在使用 IPC 進行多進程通信的問題。本文中對于多進程通信問題不做過多的討論,因為 POXIS 線程 API 提供了處理諸如死鎖和競態(tài)條件這類問題的工具。本文主要討論特定于多線程編程的問題和解決方案,一般的多道程序設(shè)計問題留待以后討論。
線程程序有時會出現(xiàn)在多進程和 IPC 程序設(shè)計中不常出現(xiàn)的一些問題。例如,如果兩個線程同時調(diào)用一個函數(shù),如 asctime() (它使用一個靜態(tài)的數(shù)據(jù)區(qū)),會產(chǎn)生不可思議的結(jié)果。這是“線程安全”要考慮的問題。
安裝方式:
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"
調(diào)用方式:
結(jié)合以前的get_html也可以這樣來實現(xiàn)類
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 }