Home >Backend Development >PHP Tutorial >Examples of PHP multi-threading (PHP multi-threading class)_PHP tutorial

Examples of PHP multi-threading (PHP multi-threading class)_PHP tutorial

WBOY
WBOYOriginal
2016-07-13 10:49:341083browse

The article has compiled two PHP multi-threads for you. One is to imitate Java's multi-threading, and the other is to use curl to implement a multi-thread program to collect pictures. Let's take a look together.

Realize PHP multi-threading function through WEB server.

Of course, anyone with a deep understanding of multi-threading knows that multi-threading implemented through a WEB server can only imitate some of the effects of multi-threading, and is not multi-threading in the true sense.

But no matter what, it can still meet some of our needs. This class can still be used when functions like multi-threading are needed.

The code is as follows Copy code
 代码如下 复制代码

 

    /**
    * @title: PHP多线程类(Thread)
    * @version: 1.0
    * @author: phper.org.cn < web@phper.org.cn >
    * @published: 2010-11-2
    *
    * PHP多线程应用示例:
    * require_once 'thread.class.php';
    * $thread = new thread();
    * $thread->addthread('action_log','a');
    * $thread->addthread('action_log','b');
    * $thread->addthread('action_log','c');
    * $thread->runthread();
    *
    * function action_log($info) {
    * $log = 'log/' . microtime() . '.log';
    * $txt = $info . "rnrn" . 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn";
    * $fp = fopen($log, 'w');
    * fwrite($fp, $txt);
    * fclose($fp);
    * }
    */
    class thread {
    var $hooks = array();
    var $args = array();
    function thread() {
    }
    function addthread($func)
    {
    $args = array_slice(func_get_args(), 1);
    $this->hooks[] = $func;
    $this->args[] = $args;
    return true;
    }
    function runthread()
    {
    if(isset($_GET['flag']))
    {
    $flag = intval($_GET['flag']);
    }
    if($flag || $flag === 0)
    {
    call_user_func_array($this->hooks[$flag], $this->args[$flag]);
    }
    else
    {
    for($i = 0, $size = count($this->hooks); $i < $size; $i++)
{
$fp=fsockopen($_SERVER['HTTP_HOST'],$_SERVER['SERVER_PORT']);
if($fp)
{
$out = "GET {$_SERVER['PHP_SELF']}?flag=$i HTTP/1.1rn";
$out .= "Host: {$_SERVER['HTTP_HOST']}rn";
$out .= "Connection: Closernrn";
fputs($fp,$out);
fclose($fp);
}
}
}
}
}


/**

    * @title: PHP多线程类(Thread)
代码如下 复制代码

$thread = new thread();

$thread->addthread('func1','info1');
    
    $thread->addthread('func2','info2');
    
    $thread->addthread('func3','info3');
    
    $thread->runthread();

    * @version: 1.0     * @author: phper.org.cn < web@phper.org.cn >     * @published: 2010-11-2     *     * PHP多线程应用示例:     * require_once 'thread.class.php';     * $thread = new thread();     * $thread->addthread('action_log','a');     * $thread->addthread('action_log','b');     * $thread->addthread('action_log','c');     * $thread->runthread();     *     * function action_log($info) {     * $log = 'log/' . microtime() . '.log';     * $txt = $info . "rnrn" . 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn";     * $fp = fopen($log, 'w');     * fwrite($fp, $txt);     * fclose($fp);     * }    */ class thread { var $hooks = array(); var $args = array(); Function thread() { } Function addthread($func) { $args = array_slice(func_get_args(), 1); $this->hooks[] = $func; $this->args[] = $args; Return true; } Function runthread() { If(isset($_GET['flag'])) { $flag = intval($_GET['flag']); } If($flag || $flag === 0) { Call_user_func_array($this->hooks[$flag], $this->args[$flag]); } else { for($i = 0, $size = count($this->hooks); $i < $size; $i++)<🎜> {<🎜> $fp=fsockopen($_SERVER['HTTP_HOST'],$_SERVER['SERVER_PORT']);<🎜> If($fp)<🎜> {<🎜> $out = "GET {$_SERVER['PHP_SELF']}?flag=$i HTTP/1.1rn";<🎜> $out .= "Host: {$_SERVER['HTTP_HOST']}rn";<🎜> $out .= "Connection: Closernrn";<🎜> fputs($fp,$out);<🎜> fclose($fp);<🎜> }<🎜> }<🎜> }<🎜> }<🎜> }<🎜>
<🎜><🎜> How to use: <🎜>
The code is as follows Copy code
<🎜> $thread = new thread();<🎜>      <🎜> $thread->addthread('func1','info1');       $thread->addthread('func2','info2');       $thread->addthread('func3','info3');       $thread->runthread();


Description:

addthread() is to add a thread function. The first parameter is the function name, and the subsequent parameters (optional) are the parameters passed to the specified function.

runthread() is the function of the execution thread.

Example 2.Using curl to implement multi-threaded image downloading

It is actually a multi-threaded class implemented by PHP using curl). With this class, we can also use this class to perform multi-threaded tasks!

The code is as follows Copy code

Class curl_multi{
         private $url_list=array();
         private $curl_setopt=array(
                'CURLOPT_RETURNTRANSFER' => 1,//The result is returned to the variable
               'CURLOPT_HEADER' => 0,//Whether the HTTP header needs to be returned
               'CURLOPT_NOBODY' => 0,//Whether the returned content is required
                'CURLOPT_FOLLOWLOCATION' => 0,//Automatic tracking
               'CURLOPT_TIMEOUT' => 6//Timeout time (s)
);
         function __construct($seconds=30){
               set_time_limit($seconds);
          }
            /*
* Set URL
* @list array
           */
          public function setUrlList($list=array()){
                   $this->url_list=$list;
          }
            /*
* Set parameters
* @cutPot array
           */
          public function setOpt($cutPot){
$this->curl_setopt=$cutPot+$this->curl_setopt;
          }
            /*
* Execute
* @return array
           */
Public function execute(){
                $mh=curl_multi_init();
foreach($this->url_list as $i=>$url){
                        $conn[$i]=curl_init($url);
foreach($this->curl_setopt as $key => $val){
                             curl_setopt($conn[$i],preg_replace('/(CURLOPT_w{1,})/ie','$0',$key),$val);
                                                                                                                          curl_multi_add_handle($mh,$conn[$i]);
               }
                 $active=false;
do{
                         $mrc=curl_multi_exec($mh,$active);
            }while($mrc == CURLM_CALL_MULTI_PERFORM);
     
​​​​​​while($active and $mrc ​​== CURLM_OK){
If(curl_multi_select($mh) != -1){
                      do{
$mrc=curl_multi_exec($mh,$active);
                                   }while($mrc == CURLM_CALL_MULTI_PERFORM);
                                                                                                                   }
                $res=array();
foreach($this->url_list as $i => $url){
                      $res[$i]=curl_multi_getcontent($conn[$i]);
                    curl_close($conn[$i]);
                     curl_multi_remove_handle($mh,$conn[$i]);//Release resources
               }
                curl_multi_close($mh);
                return $res;
          }
}

Example of php using multi-threaded download class: Download remote images

The code is as follows
 代码如下 复制代码


    $curl_mul=new curl_multi();
    $curl_mul->setUrlList(array('http://www.bKjia.c0m/img/logo.jpg','http://www.bKjia.c0m/img/logo.jpg','http://www.bKjia.c0m/img/logo.jpg'));
    $a=$curl_mul->execute();
    $i=1;
    foreach($a as $v){
        $filename=$i.'.gif';
        $fp2=@fopen($filename,'a');
        fwrite($fp2,$v);
        fclose($fp2);
        $i++;
    }

Copy code
$curl_mul=new curl_multi();

$curl_mul->setUrlList(array('http://www.bKjia.c0m/img/logo.jpg','http://www.bKjia.c0m/img/logo.jpg','http:// www.bKjia.c0m/img/logo.jpg'));

$a=$curl_mul->execute(); foreach($a as $v){           $filename=$i.'.gif';            $fp2=@fopen($filename,'a');             fwrite($fp2,$v);             fclose($fp2);          $i++; }
http://www.bkjia.com/PHPjc/632713.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/632713.htmlTechArticleThe article has compiled two PHP multi-threads for you. One is to imitate java's multi-threading, and the other is to use Curl has been used to implement a multi-line program to collect pictures. Let’s take a look. By W...
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