使用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 相关文章推荐
超强分页类2.0发布,支持自定义风格,默认4种显示模式
Jan 02 PHP
详解PHP显示MySQL数据的三种方法
Jun 05 PHP
让你成为更出色的PHP开发者的10个技巧
Feb 25 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
May 29 PHP
php连接mssql的一些相关经验及注意事项
Feb 05 PHP
PHP静态调用非静态方法的应用分析
May 02 PHP
php发送邮件的问题详解
Jun 22 PHP
PHP中的函数声明与使用详解
May 27 PHP
php 猴子摘桃的算法
Jun 20 PHP
php实现的统计字数函数定义与使用示例
Jul 26 PHP
php生成条形码的图片的实例详解
Sep 13 PHP
PHP+iframe模拟Ajax上传文件功能示例
Jul 02 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下使用strpos需要注意 === 运算符
2010/07/17 PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
2011/11/02 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
PHP+MySql+jQuery实现的&quot;顶&quot;和&quot;踩&quot;投票功能
2016/05/21 PHP
php二维码生成以及下载实现
2017/09/28 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
Javascript----文件操作
2007/01/18 Javascript
你需要知道的JavsScript可以做什么?
2007/06/29 Javascript
fckeditor 获取文本框值的实现代码
2009/02/09 Javascript
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
js确认删除对话框效果的示例代码
2014/02/20 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
详解如何更好的使用module vuex
2019/03/27 Javascript
python简单获取本机计算机名和IP地址的方法
2015/06/03 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
详解Python 正则表达式模块
2018/11/05 Python
python中PS 图像调整算法原理之亮度调整
2019/06/28 Python
使用APScheduler3.0.1 实现定时任务的方法
2019/07/22 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
英国珠宝和手表专家:Pleasance & Harper
2020/10/21 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
大学生毕业求职的自我评价
2013/09/29 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
写给导师的自荐信
2015/03/06 职场文书
启动Tomcat时出现大量乱码的解决方法
2021/06/21 Java/Android
python中的3种定义类方法
2021/11/27 Python