ホームページ  >  記事  >  バックエンド開発  >  pthread を使用して真の PHP マルチスレッドを実装する方法

pthread を使用して真の PHP マルチスレッドを実装する方法

不言
不言オリジナル
2018-07-03 16:18:104115ブラウズ

この記事では主に pthread を使用して実際の PHP マルチスレッドを実現する方法を紹介します。これには一定の参考値があります。ここで共有します。必要な友人は参照してください。

PHP 5.3 以降pthreads PHP 拡張機能を使用すると、PHP はマルチスレッドを真にサポートできます。マルチスレッドにより、反復的なループ タスクを処理するときにプログラムの実行時間を大幅に短縮できます。

前回の記事で、ほとんどの Web サイトのパフォーマンスのボトルネックは PHP サーバーにあるわけではないと言いました。なぜなら、PHP サーバーは単にサーバーを水平方向に拡張できるからです。 (さまざまなクラウド ホストの場合、VPS または CPU コアの数を増やす方が便利です。オペレーティング システムや環境をインストールして構成することなく、バックアップ イメージを使用して直接 VPS を追加できます) ).代わりに、それは MySQL データベースにあります。

MySQL データベースと結合クエリ SQL を使用すると、ビジネス ロジックを処理できる可能性がありますが、大量の同時リクエストが発生すると、作業が停止します。

NoSQL データベースを使用する場合、同じビジネス ロジックを処理するのに 10 個のクエリが必要になる可能性がありますが、各クエリは MySQL よりも高速です。10 個のループ NoSQL クエリは、MySQL 結合クエリよりも高速である可能性があります。クエリ/秒はまったく問題ありません。

PHP マルチスレッドを追加し、同時に 10 個のスレッドで NoSQL をクエリし、結果の概要出力を返すと、速度が速くなります。実際の APP 製品では、ユーザーの好みに基づいてリアルタイムで製品を推奨する PHP インターフェイスを呼び出します。PHP は、ユーザーのパーソナライズされた好みの製品データをリアルタイムで計算するために、BigSea NoSQL データベースに対して 500 ~ 1,000 のクエリを開始する必要があります。 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"

Baidu 検索ページの PHP コード例をキャプチャするための PHP マルチスレッドと For ループを提供します:

<?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 中国語 Web サイトに関連するコンテンツを参照してください。

関連する推奨事項:

csv ファイルを PHP にインポートする際の文字化けの問題を解決する方法

thinkphp についてメールパスワード送信の実装 取得機能の紹介

以上がpthread を使用して真の PHP マルチスレッドを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。