`
hongtoushizi
  • 浏览: 377146 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

详解:使用pthreads PHP扩展 PHP 真正多线程的使用

    博客分类:
  • php
 
阅读更多

PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程。多线程在处理重复性的循环任务,能够大大缩短程序执行时间。

  我之前的文章中说过,大多数网站的性能瓶颈不在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


vi /Data/apps/php/etc/php.ini


添加:

extension = "pthreads.so"


  2、给出一段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)."\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.php1.cn/Content/XiangJie_-_ShiYong_pthreadsPHP_KuoZhan_PHP_ZhenZhengDuoXianChengDeShiYong.html

分享到:
评论

相关推荐

    php线程pthreads扩展

    使用Pthreads时,应特别注意哪些函数在多线程下可能会出现问题。线程不安全的函数可能会导致数据损坏或意外的行为。使用线程安全的函数和数据结构是保证程序正确性的关键。 6. **线程生命周期** 一个线程从创建到...

    php实现多线程

    #### 二、PHP多线程与多进程 首先需要澄清的是,在当前的PHP版本中,其内核并不支持真正的多线程。但是,可以通过模拟的方式实现多进程,从而达到类似多线程的效果。这通常涉及到使用`pthreads`扩展或通过命令行...

    简单实用的PHP并发请求url类

    但是,可以借助于`pthreads`扩展(仅在ZTS模式下可用)来实现多线程,或者使用`pcntl`扩展实现多进程。然而,这些方法在某些共享主机环境下可能不被支持。 2. **CURL库**: PHP提供了强大的cURL库,可以方便地进行...

    基于PHP的虐神百度爬虫开源系统.zip

    6. **并发与多线程**:为了提高爬取效率,系统可能利用了多线程或多进程技术,如pthreads扩展,实现同时处理多个请求。 7. **延迟与请求间隔**:为了避免被目标网站封禁,爬虫通常会设置请求间隔,模拟人类浏览行为...

    php在线管理文件

    3. 多线程/异步处理:在处理大量文件操作时,可以利用PHP的多进程(如`pthreads`扩展)或异步IO(如`ReactPHP`库)提高处理效率。 总结来说,PHP在线管理文件系统的核心在于充分利用PHP的文件操作能力,结合前端...

    基于PHP的狂盗小说采集.zip

    5. **多线程与异步处理**:如果需要快速抓取大量数据,可以利用PHP的pthreads扩展实现多线程,或者使用curl_multi_exec进行并发请求,提高采集效率。 6. **异常处理与日志记录**:在编程过程中,应设置合理的错误...

    PHP实例开发源码—搜搜问问爬虫php天宇修改版.zip

    7. **性能优化**:考虑到爬虫可能需要处理大量页面,了解如何通过缓存、多线程(PHP的pthreads扩展)或者异步IO(ReactPHP等)来优化性能是非常重要的。 8. **爬虫伦理**:在实际使用爬虫时,应遵守网站的robots....

    php-5.5.11 WIN32 版

    同时,配合MySQL数据库、Pthreads扩展(多线程支持)以及各种Web框架,可以构建出强大而高效的Web应用程序。 总的来说,PHP 5.5.11在Windows 32位系统上的应用,为开发者提供了丰富的工具和资源,无论是小型项目...

    PHP-PORT-SCANER.zip_Free!

    - 为了提高扫描效率,开发者可能采用了多线程或多进程技术,例如使用pthreads扩展或通过shell_exec()调用外部进程来并行扫描多个端口。 7. **网络安全与道德规范**: - 虽然端口扫描是合法的网络管理工具,但滥用...

    spider:使用 PHP 进行爬虫

    3. **异步爬取**:使用多线程或多进程(如pthreads扩展)或异步I/O(如ReactPHP)提高爬取效率。 4. **数据存储**:将抓取的数据存储到数据库(如MySQL、MongoDB)或文件系统(如CSV、JSON)。 5. **反反爬策略**...

    PHP面试笔记.pdf

    PHP多线程** - **解释**: PHP本身不支持多线程,但在扩展库中提供了多线程的支持。 - **实现方式**: 通过扩展库如pthreads实现多线程功能。 **2. 静态文件存放位置** - **推荐做法**: 将静态文件(如图片、CSS、...

    mra-protocol:Mail.Ru 代理协议实现

    7. **并发与多线程**:为了提高性能,可能会使用多线程或多进程处理多个并发请求。PHP的pthreads扩展或异步I/O模型如ReactPHP可以实现这一目标。 8. **缓存策略**:为了减少网络延迟和减轻服务器压力,可以使用缓存...

    flight-benchmarks:Techempower.com飞行基准测试的实施

    尽管PHP自身不支持多线程,但可以借助像pthreads这样的扩展或通过FPM(FastCGI进程管理器)的池化机制来实现类似功能。 在flight-benchmarks-master项目中,你可以找到对应的PHP实现代码,研究其设计思路和优化手段...

Global site tag (gtag.js) - Google Analytics