`

PHP 真正多线程的使用

    博客分类:
  • php
 
阅读更多
原文地址:http://zyan.cc/pthreads/


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代码示例:
view plainprint?
<?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"; 
?> 
分享到:
评论

相关推荐

    php-多线程扩展

    在实际应用中,"php-多线程扩展"可以与PHP的其他组件如PDO(数据库访问)、cURL(HTTP客户端)或者Redis(内存数据存储)结合使用,以多线程方式并行处理数据库查询、网络请求或者缓存操作,大大提高系统的并发处理...

    php_work php实现多线程

    虽然不是真正的多线程,但在某些情况下,它可以提供类似的并发处理能力。 总结一下,虽然PHP不是一种原生支持多线程的语言,但通过pthreads扩展或者使用`pcntl_fork()`函数,我们可以创建和管理多线程(或进程)的...

    PHP多线程图片处理

    7. **线程安全的数据共享**:虽然我们不是在真正的多线程环境中工作,但仍然需要注意数据的安全性。如果需要在不同的CURL请求之间共享数据,应确保这些操作是线程安全的,或者通过回调函数传递结果,避免直接修改...

    php利用curl实现多线程下载图片类

    通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程。利用curl实现多线程下载图片类,其实是php利用curl实现的一个...

    php的curl多线程采集

    PHP默认不支持真正的多线程,但可以通过以下两种方式实现: 1. **pthreads扩展**:这是一个用户空间的线程实现,可以创建线程对象并实现同步机制。每个线程可以拥有自己的`cURL`会话,实现并行采集。不过,pthreads...

    php实现多线程

    通过以上分析可以看出,虽然PHP本身不支持真正的多线程,但通过模拟多进程的方式,我们仍然可以在一定程度上实现并行处理,提高程序的执行效率。此外,需要注意的是,这种实现方式仅适用于CLI模式下的PHP程序,且在...

    php利用curl实现多线程下载图片类.zip

    通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程。利用curl实现多线程下载图片类,其实是php利用curl实现的一个...

    php多线程并发实现方法

    需要注意的是,虽然这种方法可以实现并发,但是并非真正的多线程。PHP的多进程并发模型会受到系统资源的限制,尤其是内存和CPU资源。过多的进程可能会导致系统过载,影响性能和稳定性。 为了提高性能和并发量,可以...

    PHP实现多线程.pdf

    GIL使得PHP的多线程并不能真正实现CPU核心的并行计算,更多的是时间片轮转的形式。 9. **适用场景**: PHP多线程适用于需要并发处理大量任务的情况,如异步I/O、定时任务、并行数据处理等。然而,对于CPU密集型...

    实例讲解php实现多线程

    pthreads是PHP的一个扩展,提供了真正的多线程支持。使用pthreads,开发者可以直接在PHP中创建和管理线程,进行并发操作。以下是使用pthreads的步骤: a. **环境配置**:确保使用的是线程安全版本的PHP。可以从PHP...

    PHP中多线程的两个实现方法

    总的来说,PHP中实现多线程主要依靠模拟,如使用子进程、异步I/O或者第三方扩展。选择哪种方法取决于应用场景、服务器环境以及对并发处理的需求。在某些场景下,使用队列和异步任务处理(如Redis、Beanstalkd或...

    php三种实现多线程类似的方法

    在PHP7及以上版本中,可以利用其内部的多线程扩展,例如使用swoole扩展来创建真正的多线程程序,swoole提供了协程、通道、多线程等多种并发编程模型,非常适合用于需要高并发处理的场景。 需要注意的是,这些方法...

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

    在PHP5.3以上版本,开发者们可以通过使用pthreads扩展来弥补这一不足,实现真正的PHP多线程编程。 pthreads是PHP的一个扩展,它为PHP带来了POSIX线程(pthread)的功能,允许开发者创建和管理多线程,从而实现并发...

    浅谈php使用curl模拟多线程发送请求

    PHP通过cURL模拟多线程发送请求的知识点涵盖了PHP网络编程的多个方面,包括cURL的基本使用、多线程的概念、以及如何在PHP中模拟多线程行为。在讨论这些知识点之前,首先要明确,PHP作为一种脚本语言,其自身的执行...

    PHP多线程模拟实现秒杀抢单

    而PHP作为一种广泛使用的服务器端脚本语言,虽然本身不支持原生的多线程技术,但可以通过模拟多线程的方式实现高效处理秒杀抢单需求。本文将详细介绍PHP模拟多线程实现秒杀抢单的过程和关键技术点。 首先,模拟多...

    PHP多线程类及用法实例

    - PHP模拟的多线程并不是真正意义上的多线程,因为它依赖于HTTP请求的异步特性,并且受到脚本执行时间和服务器性能的限制。 - 在使用这类方法时,需要注意脚本的执行时间限制。由于PHP脚本执行默认是有时间限制的,...

    基于PHP pthreads实现多线程代码实例

    但 PHP 在默认情况下是没有多线程的,必须要使用 pthreads PHP 扩展,这个扩展能真正的支持和实现多线程。多线程在处理重复性的循环任务,能够大大缩短程序执行时间。 要使用这个扩展,就必须使用线程安全的版本。 ...

    深入解析PHP中的(伪)多线程与多进程

    然而,由于PHP不支持真正的多线程,因此同步问题变得尤为重要。在多线程环境中,当多个线程试图访问同一资源时,可能会引发数据竞争和一致性问题。在PHP中处理这种情况的方法包括: 1. **避免共享资源**:尽可能...

Global site tag (gtag.js) - Google Analytics