php多线程简单例子,php多线程例子

如果用 MySQL 数据库,一条联合查询的SQL,也许就可以处理完业务逻辑,但是,遇到大量并发请求,就歇菜了。如果用 NoSQL

数据库,也许需要十次查询,才能处理完同样地业务逻辑,但每次查询都比 MySQL

要快,十次循环NoSQL查询也许比一次MySQL联合查询更快,应对几万次/秒的查询完全没问题。如果加上PHP多线程,通过十个线程同时查询

NoSQL,返回结果汇总输出,速度就要更快了。我们实际的APP产品中,调用一个通过用户喜好实时推荐商品的PHP接口,PHP需要对BigSea

NoSQL数据库发起500~1000次查询,来实时算出用户的个性喜好商品数据,PHP多线程的作用非常明显。

本人使用环境

win10 64位系统,wamp2.5(php5.5.12)

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 '
';

//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

任务越多的时候,优势越明显;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值