使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)


Posted in PHP onMay 05, 2014

我之前的文章中说过,大多数网站的性能瓶颈不在PHP服务器上,因为它可以简单地通过横向增加服务器或CPU核数来轻松应对(对于各种云主机,增加VPS或CPU核数就更方便了,直接以备份镜像增加VPS,连操作系统、环境都不用安装配置),而是在于MySQL数据库。

如果用 MySQL 数据库,一条联合查询的SQL,也许就可以处理完业务逻辑,但是,遇到大量并发请求,就歇菜了。

如果用 NoSQL 数据库,也许需要十次查询,才能处理完同样地业务逻辑,但每次查询都比 MySQL 要快,十次循环NoSQL查询也许比一次MySQL联合查询更快,应对几万次/秒的查询完全没问题。

如果加上PHP多线程,通过十个线程同时查询NoSQL,返回结果汇总输出,速度就要更快了。我们实际的APP产品中,调用一个通过用户喜好实时推荐商品的PHP接口,PHP需要对BigSea NoSQL数据库发起500~1000次查询,来实时算出用户的个性喜好商品数据,PHP多线程的作用非常明显。

PHP扩展下载:https://github.com/krakjoe/pthreads
PHP手册文档:http://php.net/manual/zh/book.pthreads.php

1、扩展的编译安装(Linux),编译参数 --enable-maintainer-zts 是必选项:

cd /Data/tgz/php-5.5.1
./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
make clean
make
make install        unzip pthreads-master.zip
cd pthreads-master
/Data/apps/php/bin/phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make
make install

php.ini中添加:

vi /Data/apps/php/etc/php.ini
extension = "pthreads.so"

给出一段PHP多线程、与For循环,抓取百度搜索页面的PHP代码示例:

<?php
  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);
          }
          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)."
";
  $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)."
";
?>
PHP 相关文章推荐
PHP文本数据库的搜索方法
Oct 09 PHP
URL Rewrite的设置方法
Jan 02 PHP
php 取得瑞年与平年的天数的代码
Aug 10 PHP
解析CodeIgniter自定义配置文件
Jun 18 PHP
兼容ie6浏览器的php下载文件代码分享
Jul 14 PHP
php实现按照权重随机排序数据的方法
Jan 09 PHP
php微信公众平台开发类实例
Apr 01 PHP
PHP创建word文档的方法(平台无关)
Mar 29 PHP
PHP精确计算功能示例
Nov 29 PHP
php图片合成方法(多张图片合成一张)
Nov 25 PHP
php7 图形用户界面GUI 开发示例
Feb 22 PHP
Yii中特殊行为ActionFilter的使用方法示例
Oct 18 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
May 04 #PHP
PHP图片裁剪函数(保持图像不变形)
May 04 #PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
May 04 #PHP
PHP按行读取文件时删除换行符的3种方法
May 04 #PHP
Linux中用PHP判断程序运行状态的2个方法
May 04 #PHP
PHP CURL获取返回值的方法
May 04 #PHP
PHP判断远程图片是否存在的几种方法
May 04 #PHP
You might like
记录PHP错误日志 display_errors与log_errors的区别
2012/10/09 PHP
分享PHP守护进程类
2015/12/30 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
PHP微信公众号开发之微信红包实现方法分析
2017/07/14 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
Gambit vs CL BO3 第二场 2.13
2021/03/10 DOTA
原型方法的不同写法居然会影响调试的解决方法
2007/03/08 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
深入理解ES6中let和闭包
2018/02/22 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
vue单页面在微信下只能分享落地页的解决方案
2019/04/15 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
Django MEDIA的配置及用法详解
2019/07/25 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
python中reload重载实例用法
2020/12/15 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
利用CSS3的transition属性实现滑动效果
2015/08/05 HTML / CSS
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
资深生产主管自我评价
2013/09/22 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
房屋租赁合同补充协议
2014/10/11 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
2015年工程师工作总结
2015/04/30 职场文书
创业项目大全(适合在家创业的项目)
2019/08/15 职场文书
python实现高效的遗传算法
2021/04/07 Python