首頁 後端開發 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