Home  >  Article  >  Backend Development  >  How to implement true PHP multi-threading using pthreads

How to implement true PHP multi-threading using pthreads

不言
不言Original
2018-07-03 16:18:104113browse

This article mainly introduces the method of using pthreads to achieve real PHP multi-threading. It has a certain reference value. Now I share it with you. Friends in need can refer to

PHP 5.3 or above version. Using the pthreads PHP extension, PHP can truly support multi-threading. Multi-threading can greatly shorten program execution time when processing repetitive loop tasks

I said in my previous article that the performance bottleneck of most websites is not on the PHP server, because it can simply increase the server horizontally Or the number of CPU cores to easily cope with it (for various cloud hosts, it is more convenient to increase the VPS or the number of CPU cores. You can add VPS directly with the backup image, without even installing and configuring the operating system and environment). Instead, it lies in the MySQL database.

If you use a MySQL database and a joint query SQL, you may be able to handle the business logic. However, if you encounter a large number of concurrent requests, you will stop working.

If you use a NoSQL database, it may take ten queries to process the same business logic, but each query is faster than MySQL. Ten loop NoSQL queries may be faster than a MySQL joint query. Tens of thousands of queries/second are no problem at all.

If you add PHP multi-threading, query NoSQL through ten threads at the same time, and return the result summary output, the speed will be faster. In our actual APP product, we call a PHP interface that recommends products in real time based on user preferences. PHP needs to initiate 500 to 1,000 queries to the BigSea NoSQL database to calculate the user's personalized preference product data in real time. The role of PHP multi-threading is very obvious.

PHP extension download: https://github.com/krakjoe/pthreads

PHP manual document: http://php.net/manual/zh/book .pthreads.php

1. Extended compilation and installation (Linux), the compilation parameter --enable-maintainer-zts is a required option:

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

Add in php.ini:

vi /Data/apps/php/etc/php.ini
extension = "pthreads.so"

Gives a PHP multi-threading and For loop to capture the PHP code example of Baidu search page:

<?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)."
";
?>

The above is the entire content of this article. I hope it will be useful for everyone's learning. For help, please pay attention to the PHP Chinese website for more related content!

Related recommendations:

How to solve the problem of garbled characters when importing csv files into PHP

About thinkphp to implement sending email passwords Introduction to the retrieval function

The above is the detailed content of How to implement true PHP multi-threading using pthreads. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn