使用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 相关文章推荐
一个程序下载的管理程序(二)
Oct 09 PHP
php记录日志的实现代码
Aug 08 PHP
php正则表达匹配中文问题分析小结
Mar 25 PHP
PHP实现加密的几种方式介绍
Feb 22 PHP
php简单防盗链实现方法
Jul 29 PHP
Symfony2中被遗弃的getRequest()方法分析
Mar 17 PHP
Yii2创建表单(ActiveForm)方法详解
Jul 23 PHP
php 提交表单 关闭layer弹窗iframe的实例讲解
Aug 20 PHP
PDO::setAttribute讲解
Jan 29 PHP
laravel5 Eloquent 实现事务方式
Oct 21 PHP
php 命名空间(namespace)原理与用法实例小结
Nov 13 PHP
php实现根据身份证获取精准年龄
Feb 26 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函数
2010/01/11 PHP
php mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
初识Laravel
2014/10/30 PHP
Laravel自动生成UUID,从建表到使用详解
2019/10/24 PHP
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
2007/01/09 Javascript
js跳转页面方法实现汇总
2014/02/11 Javascript
javascript单引号和双引号的区别和处理
2014/05/14 Javascript
js怎么覆盖原有方法实现重写
2014/09/04 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
2018/01/09 jQuery
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
js实现全选和全不选
2020/07/28 Javascript
javascript实现时钟动画
2020/12/03 Javascript
[01:55]《走出家门看比赛》——DOTA2 2015国际邀请赛同城线下观战
2015/07/18 DOTA
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
python3.5仿微软计算器程序
2020/03/30 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
学习python需要有编程基础吗
2020/06/02 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
基于html5 DeviceOrientation 实现微信摇一摇功能
2015/09/25 HTML / CSS
html5 Canvas实现图片旋转的示例
2018/01/15 HTML / CSS
施华洛世奇英国官网:SWAROVSKI英国
2017/03/13 全球购物
澳大利亚领先的运动鞋商店:Hype DC
2018/03/31 全球购物
NYX Professional Makeup官方网站:专业彩妆和美容产品
2019/10/29 全球购物
年终奖发放方案
2014/06/02 职场文书
维护民族团结演讲稿
2014/08/27 职场文书
普通话演讲稿
2014/09/03 职场文书
银行委托书范本
2014/09/28 职场文书
党员查摆剖析材料
2014/10/10 职场文书
我收到了德劲DE1107
2022/04/05 无线电
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js
mysql字段为NULL索引是否会失效实例详解
2022/05/30 MySQL