php本身对于多线程处理是不够理想的,但如果我们使用pthreads性能会有所提高了,下面来看一个PHP多线程pthreads使用例子.
- <?php
- declare(ticks = 1);
- $running = 1;
- //信号处理函数
- function sig_handler($signo)
- {
- switch ($signo) {
- case SIGINT:
- finish();
- break;
- default:
- break;
- }
- }
- pcntl_signal(SIGINT, "sig_handler");
- class test extends /Thread {
- public $url;
- public $result;
- public function __construct($url) {
- $this->url = $url;
- }
- public function run() {
- if ($this->url) {
- $this->result = model_http_curl_get($this->url);
- }
- }
- }
- function model_http_curl_get($url) {
- $curl = curl_init();
- curl_setopt($curl, CURLOPT_URL, $url);
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($curl, CURLOPT_TIMEOUT, 5);
- curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)');
- $result = curl_exec($curl);
- curl_close($curl);
- return $result;
- }
- for ($i = 0; $i < 500; $i++) {
- $urls[] = 'http://www.baidu.com/s?wd='. rand(10000, 20000);
- }
- $pool = array();
- for ($i=1;$i<=5;$i++) {
- $key = uniqid();
- $url = array_shift($urls);
- $pool[$key] = new test($url);
- $pool[$key]->start();
- echo "启动线程$key/n";
- }
- while ($urls && $running) {
- foreach ($pool as $key=>$worker) {
- if(! $worker->isRunning()){
- //unset($pool[$key]);
- echo "线程".$key."已结束/n";
- $url = array_shift($urls);
- $pool[$key] = new test($url);
- $pool[$key]->start();
- echo "启动线程$key/n";
- }
- }
- usleep(1000);
- }//Vevb.com
- function finish() {
- global $running;
- global $pool;
- $running = 0;
- echo "接收到信号,等待运行中线程结束/n";
- foreach ($pool as $key=>$worker) {
- if ($pool[$key]->join()) {
- var_dump($pool[$key]->result);
- }
- }
- }
- ?>
新闻热点
疑难解答