首页 后端开发 php教程 使用pthreads实现真正的PHP多线程的方法

使用pthreads实现真正的PHP多线程的方法

Jul 03, 2018 pm 04:18 PM
php多线程

这篇文章主要介绍了关于使用pthreads实现真正的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
登录后复制

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 : &#39;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)&#39;; 
      $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导入csv文件碰到乱码的问题

关于thinkphp实现发送邮件密码找回功能的介绍

以上是使用pthreads实现真正的PHP多线程的方法的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

php是否支持多线程 php是否支持多线程 Jun 01, 2023 am 11:12 AM

php不支持多线程的,原因是:PHP默认并不支持多线程,要使用多线程需要安装pthread扩展,而要安装pthread扩展,必须使用--enable-maintainer-zts参数重新编译PHP。

如何使用PHP多线程实现高性能的RPC服务器 如何使用PHP多线程实现高性能的RPC服务器 Jun 29, 2023 pm 12:51 PM

如何使用PHP多线程实现高性能的RPC服务器随着互联网的不断发展,分布式系统的需求越来越多。而远程过程调用(RemoteProcedureCall,RPC)是这些分布式系统中经常使用的通信机制之一。它可以让不同机器上的程序像调用本地函数一样调用远程函数,从而实现系统之间的数据传输和功能调用。在实际开发中,为了提高系统的性能和并发处理能力,使用多线程技术来

优化PHP多线程操作,提升数据库性能 优化PHP多线程操作,提升数据库性能 Jun 30, 2023 am 10:27 AM

如何通过PHP多线程提高数据库读写性能随着互联网的快速发展,数据库读写性能已成为了一个关键的问题。当我们的应用程序需要频繁地读取和写入数据库时,使用单线程的方式往往会导致性能瓶颈。而采用多线程的方式可以提高数据库读写的效率,从而提高整体的性能。PHP作为一种常用的服务器端脚本语言,有着灵活的语法和强大的数据库操作能力。本文将介绍如何通过PHP多线程技术来提高

如何通过PHP多线程提高大规模数据排序的速度 如何通过PHP多线程提高大规模数据排序的速度 Jun 29, 2023 pm 04:15 PM

如何通过PHP多线程提高大规模数据排序的速度随着互联网的高速发展和大数据的普及,对于处理海量数据的需求也越来越大。其中,对于数据排序这一常见问题,如何提高处理速度成为了一个亟待解决的问题。在PHP领域,多线程技术被认为是一种有效的解决方案。本文将介绍如何通过PHP多线程提高大规模数据排序的速度。一、多线程的原理多线程是指同时存在多个线程,多个线程可同时执行不

如何通过PHP多线程提高数据库查询性能 如何通过PHP多线程提高数据库查询性能 Jun 29, 2023 pm 08:27 PM

如何通过PHP多线程提高数据库查询性能引言:随着互联网的迅猛发展,数据库查询性能成为了开发者面临的重要挑战之一。而PHP作为一种广泛使用的服务器端脚本语言,对于数据库查询也扮演着重要的角色。本文将探讨如何通过PHP多线程技术提高数据库查询性能,以满足高并发请求的需求。一、什么是多线程在讨论如何利用多线程提高数据库查询性能前,我们首先需要了解什么是多线程。通俗

协程实现PHP多线程编程,高效并发处理 协程实现PHP多线程编程,高效并发处理 Jun 30, 2023 pm 05:09 PM

PHP多线程编程实践:使用协程实现并发任务处理随着互联网应用的发展,对于服务器的性能和并发处理能力的要求也越来越高。传统的多线程编程在PHP中并不是很容易实现,因此为了提高PHP的并发处理能力,可以尝试使用协程来实现多线程编程。协程(Coroutine)是一种轻量级的并发处理模型,它可以在单线程中实现多个任务的并发执行。与传统的多线程相比,协程的切换成本更低

如何通过PHP多线程加速大文件下载 如何通过PHP多线程加速大文件下载 Jul 02, 2023 pm 04:09 PM

如何通过PHP多线程加速大文件下载在现今互联网时代,文件的传输变得越来越常见和重要。然而,对于较大的文件,下载时间会明显增加,给用户带来不便。为了提高大文件的下载速度,我们可以通过PHP多线程来实现加速。本文将介绍如何通过PHP多线程加速大文件下载的方法。首先,为了能够实现PHP多线程下载,我们需要做一些准备工作。确保服务器上已安装了最新版本的PHP,并启用

PHP中的多线程 PHP中的多线程 May 23, 2023 pm 08:31 PM

在PHP编程中,如果我们需要执行多个任务或同时处理多个请求,多线程是一种非常重要的编程技术。多线程可以实现多个线程同时运行,提高程序效率,提升用户体验。一、PHP多线程介绍PHP多线程是指同时执行两个或多个线程的程序,每个线程都是一个独立的子进程,都可以独立的执行任务。在PHP中,多线程可以通过pcntl扩展进行处理。pcntl扩展是PHP支持的进程控制扩展

See all articles