首页 > php代码 > PHP多线程pthreads使用例子

PHP多线程pthreads使用例子

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 "启动线程$keyn";
}
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 "启动线程$keyn";
        }
    }
    usleep(1000);
}
function finish() {
    global $running;
    global $pool;
    $running = 0;
    echo "接收到信号,等待运行中线程结束n";
    foreach ($pool as $key => $worker) {
        if ($pool[$key]->join()) {
            var_dump($pool[$key]->result);
        }
    }
}


文章链接:http://www.phprm.com/code/85672.html

随便收藏,请保留本文地址!

标签:foreach curl_setopt

相关文章

发表留言