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 是必选项:
./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
添加:
2、给出一段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 : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)';
$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)."\n";
$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)."\n";
?>
转载: http://www.php1.cn/Content/XiangJie_-_ShiYong_pthreadsPHP_KuoZhan_PHP_ZhenZhengDuoXianChengDeShiYong.html
相关推荐
使用Pthreads时,应特别注意哪些函数在多线程下可能会出现问题。线程不安全的函数可能会导致数据损坏或意外的行为。使用线程安全的函数和数据结构是保证程序正确性的关键。 6. **线程生命周期** 一个线程从创建到...
#### 二、PHP多线程与多进程 首先需要澄清的是,在当前的PHP版本中,其内核并不支持真正的多线程。但是,可以通过模拟的方式实现多进程,从而达到类似多线程的效果。这通常涉及到使用`pthreads`扩展或通过命令行...
但是,可以借助于`pthreads`扩展(仅在ZTS模式下可用)来实现多线程,或者使用`pcntl`扩展实现多进程。然而,这些方法在某些共享主机环境下可能不被支持。 2. **CURL库**: PHP提供了强大的cURL库,可以方便地进行...
6. **并发与多线程**:为了提高爬取效率,系统可能利用了多线程或多进程技术,如pthreads扩展,实现同时处理多个请求。 7. **延迟与请求间隔**:为了避免被目标网站封禁,爬虫通常会设置请求间隔,模拟人类浏览行为...
3. 多线程/异步处理:在处理大量文件操作时,可以利用PHP的多进程(如`pthreads`扩展)或异步IO(如`ReactPHP`库)提高处理效率。 总结来说,PHP在线管理文件系统的核心在于充分利用PHP的文件操作能力,结合前端...
5. **多线程与异步处理**:如果需要快速抓取大量数据,可以利用PHP的pthreads扩展实现多线程,或者使用curl_multi_exec进行并发请求,提高采集效率。 6. **异常处理与日志记录**:在编程过程中,应设置合理的错误...
7. **性能优化**:考虑到爬虫可能需要处理大量页面,了解如何通过缓存、多线程(PHP的pthreads扩展)或者异步IO(ReactPHP等)来优化性能是非常重要的。 8. **爬虫伦理**:在实际使用爬虫时,应遵守网站的robots....
同时,配合MySQL数据库、Pthreads扩展(多线程支持)以及各种Web框架,可以构建出强大而高效的Web应用程序。 总的来说,PHP 5.5.11在Windows 32位系统上的应用,为开发者提供了丰富的工具和资源,无论是小型项目...
- 为了提高扫描效率,开发者可能采用了多线程或多进程技术,例如使用pthreads扩展或通过shell_exec()调用外部进程来并行扫描多个端口。 7. **网络安全与道德规范**: - 虽然端口扫描是合法的网络管理工具,但滥用...
3. **异步爬取**:使用多线程或多进程(如pthreads扩展)或异步I/O(如ReactPHP)提高爬取效率。 4. **数据存储**:将抓取的数据存储到数据库(如MySQL、MongoDB)或文件系统(如CSV、JSON)。 5. **反反爬策略**...
PHP多线程** - **解释**: PHP本身不支持多线程,但在扩展库中提供了多线程的支持。 - **实现方式**: 通过扩展库如pthreads实现多线程功能。 **2. 静态文件存放位置** - **推荐做法**: 将静态文件(如图片、CSS、...
7. **并发与多线程**:为了提高性能,可能会使用多线程或多进程处理多个并发请求。PHP的pthreads扩展或异步I/O模型如ReactPHP可以实现这一目标。 8. **缓存策略**:为了减少网络延迟和减轻服务器压力,可以使用缓存...
尽管PHP自身不支持多线程,但可以借助像pthreads这样的扩展或通过FPM(FastCGI进程管理器)的池化机制来实现类似功能。 在flight-benchmarks-master项目中,你可以找到对应的PHP实现代码,研究其设计思路和优化手段...