php多线程例子
首页->学习资料->编程语言->php教程->大型网站技术 关键词: 发布时间:2016-05-12 11:19:26 浏览次数:1671

如果用 MySQL 数据库,一条联合查询的SQL,也许就可以处理完业务逻辑,但是,遇到大量并发请求,就歇菜了。如果用 NoSQL 数据库,也许需要十次查询,才能处理完同样地业务逻辑,但每次查询都比 MySQL 要快,十次循环NoSQL查询也许比一次MySQL联合查询更快,应对几万次/秒的查询完全没问题。如果加上PHP多线程,通过十个线程同时查询 NoSQL,返回结果汇总输出,速度就要更快了。我们实际的APP产品中,调用一个通过用户喜好实时推荐商品的PHP接口,PHP需要对BigSea NoSQL数据库发起500~1000次查询,来实时算出用户的个性喜好商品数据,PHP多线程的作用非常明显。


本人使用环境
win10 64位系统,wamp2.5(php5.5.12)



一、下载pthreads扩展
下载地址:http://windows.php.net/downloads/pecl/releases/pthreads
根据本人环境,我下载的是http://windows.php.net/downloads/pecl/releases/pthreads/2.0.9/php_pthreads-2.0.9-5.5-ts-vc11-x64.zip

2.0.9代表pthreads的版本。
5.5代表php的版本。
ts表示php要线程安全版本的。
vc11表示php要Visual C++ 编译器编译的版本。
x86则表示32位的 x64表示64位,

怎么确定最后两项,用phpinfo()函数查看系统信息,红色那两项就是:

PHP Version 5.5.12

System    Windows NT LENOVO-PC 6.2 build 9200 (Windows 8 Business Edition) AMD64    

Build Date    Apr 30 2014 11:15:47    

Compiler    MSVC11 (Visual C++ 2012)    

Architecture    x64    


二、安装pthreads扩展
复制php_pthreads.dll 到目录 binphpext 下面。(本人路径D:wampbinphpphp5.5.12ext)
复制pthreadVC2.dll 到目录 binphp 下面。(本人路径D:wampbinphpphp5.5.11)
复制pthreadVC2.dll 到目录 C:windowssystem32 下面。
打开php配置文件php.ini。在后面加上extension=php_pthreads.dll
提示!Windows系统需要将 pthreadVC2.dll 所在路径加入到 PATH 环境变量中。我的电脑--->鼠标右键--->属 性--->高级--->环境变量--->系统变量--->找到名称为Path的--->编辑--->在变量值最后面 加上pthreadVC2.dll的完整路径(本人的为C:WINDOWSsystem32pthreadVC2.dll)。

重启apache


三、测试

/////////////////////////////////////////////////////////多线程例子///////////////////////////////////////

  class 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);  //以指定的微秒数延迟执行,休息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);  
      //CURLOPT_RETURNTRANSFER将 curl_exec()获取的信息以文件流的形式返回,而不是
      //直接输出。如果选项被设置,函数执行成功时会返回执行的结果,失败时返回 FALSE
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
      curl_setopt($curl, CURLOPT_TIMEOUT, 5);  //设置cURL允许执行的最长秒数
      curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);  
      $result = curl_exec($curl);  
      curl_close($curl);  
      return $result;  
  }  
 
  for ($i=0; $i < 100; $i++)   
  {   //组装一百个百度的url搜索请求,mt_rand比rand产生随机数的速度快4倍
      $urls_array[] = array("name" => "baidu", "url" => "http://www.baidu.com/s?wd=".mt_rand(10000,20000));  
  }  
    //microtime — 返回当前 Unix 时间戳和微秒数,参数为TRUE, microtime() 将返回一个浮点数。
    //echo microtime(true);  输出类似:1463052528.9284
    //echo '<br/>';
    //echo microtime();  输出类似:92837400 1463052528
  $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";  
 
/////////////////////////////////////////////////////////////////////////end/////////////////////////////////////////////////////


输行结果:

多线程:5.3671960830688 For循环:10.585718154907

任务越多的时候,优势越明显;

赞:(0)
踩:(0)
相关文章
大型网站及面临的问题及解决方法
网页静态化
thinkphp网页静态化
sphinx全文索引
高并发时表锁与文件锁
海量订单数据存储方法
高并发时商品库存处理方法
高并发测试及系统状态监测
PHP解决抢购、秒杀、抢楼、抽奖等
php上传到七牛
热门文章
win7中将文件拷贝到虚拟机linux下
phpexcel设置行高及列宽,背景颜色,
rabbitmq无法启动
intellij idea不显示git push按钮
php7中使用mongodb的aggregate进行
centos7.4 64位下swoole安装及配置
laravel页面静态化的方法
navicate连接mycat报1184错误
单点登录sso原理及php实现方式及de
devops-jenkins容器为pending状态
好评文章
phpexcel设置行高及列宽,背景颜色,
php7中使用mongodb的aggregate进行
intellij idea打开文件所在文件夹
windows下使用MongoDB Compass Com
win7中将文件拷贝到虚拟机linux下
laravel 中悲观锁 & 乐观锁的使用
单点登录sso原理及php实现方式及de
navicate连接mycat报1184错误
rabbitmq无法启动
laravel整合dingo/api方法步骤:jwt
标签
rabbitmq mysql备份 elasticsearch golang swoole
我的项目
【github】www.github.com/hurong241
【码云】gitee.com/hu_rong/projects
【docker hub】hub.docker.com/repositories/hurong241
【packagist】packagist.org/users/hurong241/packages
站点信息
建站时间:2011年
文章数:607篇
浏览数:939802
粤ICP备18028092号-1  微信:hurong241