- 浏览: 564498 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (618)
- java (109)
- Java web (43)
- javascript (52)
- js (15)
- 闭包 (2)
- maven (8)
- 杂 (28)
- python (47)
- linux (51)
- git (18)
- (1)
- mysql (31)
- 管理 (1)
- redis (6)
- 操作系统 (12)
- 网络 (13)
- mongo (1)
- nginx (17)
- web (8)
- ffmpeg (1)
- python安装包 (0)
- php (49)
- imagemagic (1)
- eclipse (21)
- django (4)
- 学习 (1)
- 书籍 (1)
- uml (3)
- emacs (19)
- svn (2)
- netty (9)
- joomla (1)
- css (1)
- 推送 (2)
- android (6)
- memcached (2)
- docker、 (0)
- docker (7)
- go (1)
- resin (1)
- groovy (1)
- spring (1)
最新评论
-
chokee:
...
Spring3 MVC 深入研究 -
googleyufei:
很有用, 我现在打算学学Python. 这些资料的很及时.
python的几个实用网站(转的) -
hujingwei1001:
太好了找的就是它
easy explore -
xiangtui:
例子举得不错。。。学习了
java callback -
幻影桃花源:
太好了,謝謝
Spring3 MVC 深入研究
原文地址:http://zyan.cc/pthreads/
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 是必选项:
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
vi /Data/apps/php/etc/php.ini
添加:
extension = "pthreads.so"
2、给出一段PHP多线程、与For循环,抓取百度搜索页面的PHP代码示例:
view plainprint?
<?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";
?>
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 是必选项:
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
vi /Data/apps/php/etc/php.ini
添加:
extension = "pthreads.so"
2、给出一段PHP多线程、与For循环,抓取百度搜索页面的PHP代码示例:
view plainprint?
<?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";
?>
发表评论
-
关于PHP堆栈与列队的学习
2015-05-25 15:48 765原文地址:http://www.jb51.net/articl ... -
PHP中的ob_start用法详解
2015-03-13 17:57 740原文地址:http://www.jcwcn ... -
深入解析PHP中的(伪)多线程与多进程
2015-01-30 13:33 533原文地址:http://www.jb51.net/articl ... -
细说Drupal,Joomla,Wordpress的区别
2015-01-27 17:56 1937原文地址:http://xiangfeipy.blog.163 ... -
Joomla 和 Drupal 的比较(之二)
2015-01-27 17:19 1173原文地址:http://blog.chin ... -
PHP中spl_autoload_register函数的用法
2015-01-20 10:34 991原文地址:http://www.cnblogs.com/myl ... -
PHP5中的this,self和parent关键字详解
2014-12-30 11:21 478原文地址:http://www.hbjjrb.com/Jish ... -
查看字符串编码
2014-12-26 16:56 529原文地址:http://zhidao.baidu.com/li ... -
【问底】徐汉彬:PHP7和HHVM的性能之争
2014-12-26 15:41 675原文地址:http://www.iteye ... -
模块详细缓存
2014-12-10 17:59 627原文地址:http://www.phpcms.cn/doc/P ... -
【phpcms-v9】缓存目录caches下的各个文件的作用
2014-12-09 13:45 637原文地址:http://blog.csdn.net/yanhu ... -
phpcms使用的缓存方式总结
2014-12-09 11:58 931原文地址:http://blog.csdn ... -
Emacs 中的查找
2014-12-03 18:03 504原文地址:http://emacser.c ... -
使用phpize建立php扩展 Cannot find config.m4.
2014-12-03 14:31 633原文地址:http://lxsym.blog.51cto.co ... -
Ubuntu环境下的php-Redis 配置与php使用入门
2014-12-03 14:18 598原文地址:http://www.linuxidc.com/Li ... -
Ubuntu下安装php扩展
2014-11-27 15:31 477原文地址:http://koda.itey ... -
解决apache启动错误"httpd:Could not reliably determine..."
2014-11-27 14:02 523原文地址:http://www.2cto.com/os/201 ... -
Ubuntu下配置PHP开发环境
2014-11-27 13:25 581原文地址:http://blog.sina ... -
Ubuntu下的PHP开发环境架设
2014-11-25 17:38 551原文地址:http://www.cnblo ... -
PHP时间戳函数总结一览(转)
2014-10-30 10:51 521原文地址:http://www.cnblogs.com/che ...
相关推荐
在实际应用中,"php-多线程扩展"可以与PHP的其他组件如PDO(数据库访问)、cURL(HTTP客户端)或者Redis(内存数据存储)结合使用,以多线程方式并行处理数据库查询、网络请求或者缓存操作,大大提高系统的并发处理...
虽然不是真正的多线程,但在某些情况下,它可以提供类似的并发处理能力。 总结一下,虽然PHP不是一种原生支持多线程的语言,但通过pthreads扩展或者使用`pcntl_fork()`函数,我们可以创建和管理多线程(或进程)的...
7. **线程安全的数据共享**:虽然我们不是在真正的多线程环境中工作,但仍然需要注意数据的安全性。如果需要在不同的CURL请求之间共享数据,应确保这些操作是线程安全的,或者通过回调函数传递结果,避免直接修改...
通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程。利用curl实现多线程下载图片类,其实是php利用curl实现的一个...
PHP默认不支持真正的多线程,但可以通过以下两种方式实现: 1. **pthreads扩展**:这是一个用户空间的线程实现,可以创建线程对象并实现同步机制。每个线程可以拥有自己的`cURL`会话,实现并行采集。不过,pthreads...
通过以上分析可以看出,虽然PHP本身不支持真正的多线程,但通过模拟多进程的方式,我们仍然可以在一定程度上实现并行处理,提高程序的执行效率。此外,需要注意的是,这种实现方式仅适用于CLI模式下的PHP程序,且在...
通过WEB服务器来实现PHP多线程功能,当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程。利用curl实现多线程下载图片类,其实是php利用curl实现的一个...
需要注意的是,虽然这种方法可以实现并发,但是并非真正的多线程。PHP的多进程并发模型会受到系统资源的限制,尤其是内存和CPU资源。过多的进程可能会导致系统过载,影响性能和稳定性。 为了提高性能和并发量,可以...
GIL使得PHP的多线程并不能真正实现CPU核心的并行计算,更多的是时间片轮转的形式。 9. **适用场景**: PHP多线程适用于需要并发处理大量任务的情况,如异步I/O、定时任务、并行数据处理等。然而,对于CPU密集型...
pthreads是PHP的一个扩展,提供了真正的多线程支持。使用pthreads,开发者可以直接在PHP中创建和管理线程,进行并发操作。以下是使用pthreads的步骤: a. **环境配置**:确保使用的是线程安全版本的PHP。可以从PHP...
总的来说,PHP中实现多线程主要依靠模拟,如使用子进程、异步I/O或者第三方扩展。选择哪种方法取决于应用场景、服务器环境以及对并发处理的需求。在某些场景下,使用队列和异步任务处理(如Redis、Beanstalkd或...
在PHP7及以上版本中,可以利用其内部的多线程扩展,例如使用swoole扩展来创建真正的多线程程序,swoole提供了协程、通道、多线程等多种并发编程模型,非常适合用于需要高并发处理的场景。 需要注意的是,这些方法...
在PHP5.3以上版本,开发者们可以通过使用pthreads扩展来弥补这一不足,实现真正的PHP多线程编程。 pthreads是PHP的一个扩展,它为PHP带来了POSIX线程(pthread)的功能,允许开发者创建和管理多线程,从而实现并发...
PHP通过cURL模拟多线程发送请求的知识点涵盖了PHP网络编程的多个方面,包括cURL的基本使用、多线程的概念、以及如何在PHP中模拟多线程行为。在讨论这些知识点之前,首先要明确,PHP作为一种脚本语言,其自身的执行...
而PHP作为一种广泛使用的服务器端脚本语言,虽然本身不支持原生的多线程技术,但可以通过模拟多线程的方式实现高效处理秒杀抢单需求。本文将详细介绍PHP模拟多线程实现秒杀抢单的过程和关键技术点。 首先,模拟多...
- PHP模拟的多线程并不是真正意义上的多线程,因为它依赖于HTTP请求的异步特性,并且受到脚本执行时间和服务器性能的限制。 - 在使用这类方法时,需要注意脚本的执行时间限制。由于PHP脚本执行默认是有时间限制的,...
但 PHP 在默认情况下是没有多线程的,必须要使用 pthreads PHP 扩展,这个扩展能真正的支持和实现多线程。多线程在处理重复性的循环任务,能够大大缩短程序执行时间。 要使用这个扩展,就必须使用线程安全的版本。 ...
然而,由于PHP不支持真正的多线程,因此同步问题变得尤为重要。在多线程环境中,当多个线程试图访问同一资源时,可能会引发数据竞争和一致性问题。在PHP中处理这种情况的方法包括: 1. **避免共享资源**:尽可能...