Recommended manual:php complete self-study manual##PHP processing multi-threading
Notes
1, php5.3 or above, and it is a thread-safe version. The compilers used by apache and php must be consistent. 2. If Thread Safety is enabled through phpinfo(), it is a thread-safe version. 3. You can know the compiler used by viewing the Compiler item through phpinfo(). Mine is: MSVC9 (Visual C 2008).My usage environment
32-bit windows xp sp3, wampserver2.2d (php5.3.10-vc9 apache2.2.21-vc9).1. Download pthreads extension
According to my environment, I downloaded pthreads-2.0.8-5.3-ts-vc9-x86. 2.0.8 represents the version of pthreads. 5.3 represents the php version. ts means that php requires a thread-safe version. vc9 means that php needs to be compiled with Visual C 2008 compiler. x86 means 32-bit 2. Install pthreads extension 1. Copy php_pthreads.dll to the directory bin\php\ext\. (My path is D:\wamp\bin\php\php5.3.10\ext)
prompt at the end!
Windows system needs to add the path of pthreadVC2.dll to the PATH environment variable. My Computer--->right mouse button--->Properties--->Advanced--->Environment Variables--->System Variables--->Find the path named Path---> ;Edit--->Add the full path of pthreadVC2.dll at the end of the variable value.3. Test the pthreads extension
class AsyncOperation extends \Thread { public function __construct($arg){ $this->arg = $arg; } public function run(){ if($this->arg){ printf("Hello %s\n", $this->arg); } } } $thread = new AsyncOperation("World"); if($thread->start()) $thread->join(); ?>
2. curl_multi_init()
<?php echo date("Y-m-d H:m:s",time()); echo " "; echo floor(microtime()*1000); echo "<br>"; $mtime = explode(" ", microtime()); $mtime = $mtime[1].($mtime[0] * 1000); $mtime2 = explode(".", $mtime); $mtime = $mtime2[0]; echo $mtime; echo "<br>"; $urls = array( 'http://www.webkaka.com', 'http://www.webkaka.com', 'http://www.webkaka.com', 'http://www.webkaka.com', 'http://www.webkaka.com'); print_r(async_get_url($urls)); // [0] => example1, [1] => example2 echo "<br>"; echo date("Y-m-d H:m:s",time()); echo " "; echo floor(microtime()*1000); echo "<br>"; $mtime_ = explode(" ", microtime()); $mtime_ = $mtime_[1].($mtime_[0] * 1000); $mtime2_ = explode(".", $mtime_); $mtime_ = $mtime2_[0]; echo $mtime_; echo "<br>"; echo $mtime_ - $mtime; function async_get_url($url_array, $wait_usec = 0) { if (!is_array($url_array)) return false; $wait_usec = intval($wait_usec); $data = array(); $handle = array(); $running = 0; $mh = curl_multi_init(); // multi curl handler $i = 0; foreach($url_array as $url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect curl_setopt($ch, CURLOPT_MAXREDIRS, 7); curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里 $handle[$i++] = $ch; } /* 执行 */ do { curl_multi_exec($mh, $running); if ($wait_usec > 0) /* 每个 connect 要间隔多久 */ usleep($wait_usec); // 250000 = 0.25 sec } while ($running > 0); /* 读取资料 */ foreach($handle as $i => $ch) { $content = curl_multi_getcontent($ch); $data[$i] = (curl_errno($ch) == 0) ? $content : false; } /* 移除 handle*/ foreach($handle as $ch) { curl_multi_remove_handle($mh, $ch); } curl_multi_close($mh); return $data; } ?>
About curl_multi_init()
Generally speaking, think of using curl_multi_init() When, the purpose is to request multiple URLs at the same time, rather than requesting them one by one, otherwise curl_init() will be required. However, when using curl_multi, you may encounter phenomena such as excessive CPU consumption and suspended webpages. You can take a look at how to solve the problem of suspended webpages caused by curl_multi. The steps for using curl_multi are summarized as follows: Step one: Call curl_multi_initStep two: Call curl_multi_add_handle in a loopWhat you need to pay attention to in this step is , the second parameter of curl_multi_add_handle is the subhandle from curl_init. Step 3: Continuously call curl_multi_execStep 4: Cyclically call curl_multi_getcontent to obtain the results as neededStep 5: Call curl_multi_remove_handle and call it for each word handle curl_closeStep 6: Call curl_multi_closeExplanation of each function:
curl_multi_init()
curl_multi_add_handle()
curl_multi_exec()
curl_multi_remove_handle()
curl_multi_close()
curl_multi_getcontent()
curl_multi_info_read()
Recommended related articles:
1.How to implement multi-threading in PHP
2.Three ways to implement multi-threading in PHP
Related video recommendations:
1.Dugu Jiujian (4)_PHP video tutorial
Recommended tutorial: PHP video Tutorial
The above is the detailed content of How php handles multithreading. For more information, please follow other related articles on the PHP Chinese website!