导读:大多数网站的性能瓶颈不在PHP服务器上,因为它可以简单地通过横向增加服务器或CPU核数来轻松应对(对于各种云主机,增加VPS或CPU核数就更方便了,直接以备份镜像增加VPS,连操作系统、环境都不用安装配置),而是在于MySQL数据库。如果用 NoSQL 数据库,也许需要十次查询,才能处理完同样地业务逻辑。此时PHP多线程的作用非常明显,它可以同时执行NoSQL查询大大的提升效率。
PHP 5.3 以上版本,使用pthreads
PHP扩展,可以使PHP真正地支持多线程。多线程在处理重复性的循环任务,能够大大缩短程序执行时间。
PHP扩展下载:https://github.com/krakjoe/pthreads
PHP手册文档:http://php.net/manual/zh/book.pthreads.php
1、扩展的编译安装(Linux),编辑参数
--enable-maintainer-zts 是必选项:
添加:
2、给出一段PHP多线程、与For循环,抓取百度搜索页面的PHP代码示例:
===示例代码==============================================
<?phpclass test_thread_run extends Thread{public $url;public $data;public function __construct($url){$this->url = $url;}public function run(){if(($url = $this->url)){$this->data = model_http_curl_get($url);}}}function model_thread_result_get($urls_array){foreach ($urls_array as $key => $value){$thread_array[$key] = new test_thread_run($value["url"]);$thread_array[$key]->start();}foreach ($thread_array as $thread_array_key => $thread_array_value){while($thread_array[$thread_array_key]->isRunning()){usleep(10);}if($thread_array[$thread_array_key]->join()){$variable_data[$thread_array_key] = $thread_array[$thread_array_key]->data;}}return $variable_data;}function model_http_curl_get($url,$userAgent=""){$userAgent = $userAgent ? $userAgent : ‘Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)‘;$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, $userAgent);$result = curl_exec($curl);curl_close($curl);return $result;}for ($i=0; $i < 100; $i++){$urls_array[] = array("name" => "baidu", "url" => "http://www.baidu.com/s?wd=".mt_rand(10000,20000));}$t = microtime(true);$result = model_thread_result_get($urls_array);$e = microtime(true);echo "多线程:".($e-$t)."\n";$t = microtime(true);foreach ($urls_array as $key => $value){$result_new[$key] = model_http_curl_get($value["url"]);}$e = microtime(true);echo "For循环:".($e-$t)."\n";?>
原文:http://www.cnblogs.com/xingmeng/p/3540483.html