这篇文章主要为大家详细介绍了php多线程模拟实现秒杀抢单功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
应集团要求给服务号做了个抢单秒杀的功能,需要对秒杀做个测试,想试试PHP多线程,就模拟了下抢单功能。
先说秒杀模块的思路:
正常情况下的用户秒杀操作
1、发起秒杀请求
2、进入秒杀队列
3、随机滞后 1 - 2 秒进行秒杀结果查询请求(算是变相分流吧)
4、成功则生成订单
5、返回结果
立即学习“PHP免费学习笔记(深入)”;
以下是模拟秒杀的代码:
<?php
set_time_limit(0);
/**
* 线程的执行任务
*/
class Threadrun extends Thread
{
public $url;
public $data;
public $params;
public function __construct($url, $params=[])
{
$this->url = $url;
$this->params = $params;
}
public function run()
{
if(($url = $this->url))
{
$params = [
'goods_id' => 1,
'activity_id' => 1,
'user_id' => isset($this->params['user_id']) ? $this->params['user_id'] : $this->getCurrentThreadId(),
];
$startTime = microtime(true);
$this->data = [
'id' => $params['user_id'],
'result' => model_http_curl_get( $url, $params ),
'time' => microtime(true)-$startTime,
'now' => microtime(true),
];
}
}
}
/**
* 执行多线程
*/
function model_thread_result_get($urls_array)
{
foreach ($urls_array as $key => $value)
{
$threadPool[$key] = new Threadrun($value["url"],['user_id'=>$value['user_id']]);
$threadPool[$key]->start();
}
foreach ($threadPool as $thread_key => $thread_value)
{
while($threadPool[$thread_key]->isRunning())
{
usleep(10);
}
if($threadPool[$thread_key]->join())
{
$variable_data[$thread_key] = $threadPool[$thread_key]->data;
}
}
return $variable_data;
}
/**
* 发送 HTTP 请求
*/
function model_http_curl_get($url,$data=[],$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);
curl_setopt($curl, CURLOPT_POST, true);
if( !empty($data) ) {
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
/**
* 友好的打印变量
* @param $val
*/
function dump( $val )
{
echo '<pre class="brush:php;toolbar:false;">';
var_dump($val);
echo '测试代码机器性能(开发机):

订单代码机器性能(测试机):
小邮包-包月订购包年服务网,该程序由好买卖商城开发,程序采用PHP+MYSQL架设,程序商业模式为目前最为火爆的包月订制包年服务模式,这种包年订购在国外网站已经热火很多年了,并且已经发展到一定规模,像英国的男士用品网站BlackSocks,一年的袜子购买量更是达到了1000万双。功能:1、实现多产品上线,2、不用注册也可以直接下单购买,3、集成目前主流支付接口,4、下单发货均有邮件提醒。
0

系统测试结果:
模拟 1000 并发的情况,单机每秒 300+ 订单,服务器毫无压力。
反倒是测试机受不了了,CPU 飙升 100%。 Apache 偶尔崩溃。
不知道是 PHP 多线程和 Windows 环境的支持不好,还是 PHP 多线程本身的问题,区区 1000 线程跑不动。多线程的地方还是比较需要 Python 和 C 出马。
相关推荐:
以上就是PHP多线程模拟实现秒杀抢单的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号