如果用 MySQL 数据库,一条联合查询的SQL,也许就可以处理完业务逻辑,但是,遇到大量并发请求,就歇菜了。如果用 NoSQL 数据库,也许需要十次查询,才能处理完同样地业务逻辑,但每次查询都比 MySQL 要快,十次循环NoSQL查询也许比一次MySQL联合查询更快,应对几万次/秒的查询完全没问题。如果加上PHP多线程,通过十个线程同时查询 NoSQL,返回结果汇总输出,速度就要更快了。我们实际的APP产品中,调用一个通过用户喜好实时推荐商品的PHP接口,PHP需要对BigSea NoSQL数据库发起500~1000次查询,来实时算出用户的个性喜好商品数据,PHP多线程的作用非常明显。
本人使用环境
win10 64位系统,wamp2.5(php5.5.12)
一、下载pthreads扩展
下载地址:http://windows.php.net/downloads/pecl/releases/pthreads
根据本人环境,我下载的是http://windows.php.net/downloads/pecl/releases/pthreads/2.0.9/php_pthreads-2.0.9-5.5-ts-vc11-x64.zip
2.0.9代表pthreads的版本。
5.5代表php的版本。
ts表示php要线程安全版本的。
vc11表示php要Visual C++ 编译器编译的版本。
x86则表示32位的 x64表示64位,
怎么确定最后两项,用phpinfo()函数查看系统信息,红色那两项就是:
PHP Version 5.5.12
System Windows NT LENOVO-PC 6.2 build 9200 (Windows 8 Business Edition) AMD64
Build Date Apr 30 2014 11:15:47
Compiler MSVC11 (Visual C++ 2012)
Architecture x64
二、安装pthreads扩展
复制php_pthreads.dll 到目录 binphpext 下面。(本人路径D:wampbinphpphp5.5.12ext)
复制pthreadVC2.dll 到目录 binphp 下面。(本人路径D:wampbinphpphp5.5.11)
复制pthreadVC2.dll 到目录 C:windowssystem32 下面。
打开php配置文件php.ini。在后面加上extension=php_pthreads.dll
提示!Windows系统需要将 pthreadVC2.dll 所在路径加入到 PATH 环境变量中。我的电脑--->鼠标右键--->属
性--->高级--->环境变量--->系统变量--->找到名称为Path的--->编辑--->在变量值最后面
加上pthreadVC2.dll的完整路径(本人的为C:WINDOWSsystem32pthreadVC2.dll)。
重启apache
三、测试
/////////////////////////////////////////////////////////多线程例子///////////////////////////////////////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); //以指定的微秒数延迟执行,休息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);
//CURLOPT_RETURNTRANSFER将 curl_exec()获取的信息以文件流的形式返回,而不是
//直接输出。如果选项被设置,函数执行成功时会返回执行的结果,失败时返回 FALSE
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 5); //设置cURL允许执行的最长秒数
curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
for ($i=0; $i < 100; $i++)
{ //组装一百个百度的url搜索请求,mt_rand比rand产生随机数的速度快4倍
$urls_array[] = array("name" => "baidu", "url" => "http://www.baidu.com/s?wd=".mt_rand(10000,20000));
}
//microtime — 返回当前 Unix 时间戳和微秒数,参数为TRUE, microtime() 将返回一个浮点数。
//echo microtime(true); 输出类似:1463052528.9284
//echo '<br/>';
//echo microtime(); 输出类似:92837400 1463052528
$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";
/////////////////////////////////////////////////////////////////////////end/////////////////////////////////////////////////////
输行结果:
多线程:5.3671960830688 For循环:10.585718154907
任务越多的时候,优势越明显;
- 相关文章
- 大型网站及面临的问题及解决方法
- 网页静态化
- thinkphp网页静态化
- sphinx全文索引
- 高并发时表锁与文件锁
- 海量订单数据存储方法
- 高并发时商品库存处理方法
- 高并发测试及系统状态监测
- PHP解决抢购、秒杀、抢楼、抽奖等
- php上传到七牛
- 热门文章
- win7中将文件拷贝到虚拟机linux下
- phpexcel设置行高及列宽,背景颜色,
- rabbitmq无法启动
- intellij idea不显示git push按钮
- php7中使用mongodb的aggregate进行
- centos7.4 64位下swoole安装及配置
- laravel页面静态化的方法
- navicate连接mycat报1184错误
- 单点登录sso原理及php实现方式及de
- devops-jenkins容器为pending状态
- 好评文章
- phpexcel设置行高及列宽,背景颜色,
- php7中使用mongodb的aggregate进行
- intellij idea打开文件所在文件夹
- windows下使用MongoDB Compass Com
- win7中将文件拷贝到虚拟机linux下
- laravel 中悲观锁 & 乐观锁的使用
- 单点登录sso原理及php实现方式及de
- navicate连接mycat报1184错误
- rabbitmq无法启动
- laravel整合dingo/api方法步骤:jwt
- 我的项目
- 【github】www.github.com/hurong241
- 【码云】gitee.com/hu_rong/projects
- 【docker hub】hub.docker.com/repositories/hurong241
- 【packagist】packagist.org/users/hurong241/packages
- 站点信息
- 建站时间:2011年
- 文章数:607篇
- 浏览数:939802