PHP多线程模拟实现秒杀抢单
(编辑:jimmy 日期: 2025/10/30 浏览:3 次 )
应集团要求给服务号做了个抢单秒杀的功能,需要对秒杀做个测试,想试试PHP多线程,就模拟了下抢单功能。
先说秒杀模块的思路:
正常情况下的用户秒杀操作
1、发起秒杀请求
2、进入秒杀队列
3、随机滞后 1 - 2 秒进行秒杀结果查询请求(算是变相分流吧)
4、成功则生成订单
5、返回结果
以下是模拟秒杀的代码:
<"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 "总执行时间:" . $timeDiff . PHP_EOL;
foreach( $result as $v ) {
$msg = '用户【' . $v['id'] . '】秒杀商品, 返回结果 ' . $v['result'] . ' 用时【' . $v['time'] . ' 秒】 当前时间【'.$v['now'].'】';
writeLog( $msg,$logPath );
}
$logStr = createLog( $result, $timeDiff);
writeLog( $logStr, $logPath );
return $result;
}
//发起秒杀请求
for ($i=0; $i < 1000; $i++)
{
$urls_array[] = array("name" => "baidu", "url" => "http://***.***.com/seckill/shopping/listinsert");
}
$list = insertList( $urls_array, './inset.log' );
//发起秒杀结果查询请求
$urls_array = [];
foreach( $list as $v ) {
if( $v['result'] === false ) {
continue;
}
$urls_array[] = array(
"name" => "baidu",
"url" => "http://***.***.com/seckill/shopping/query",
'user_id' => $v['id'],
);
}
insertList( $urls_array, './query.log' );
测试代码机器性能(开发机):
订单代码机器性能(测试机):
系统测试结果:
模拟 1000 并发的情况,单机每秒 300+ 订单,服务器毫无压力。
反倒是测试机受不了了,CPU 飙升 100%。 Apache 偶尔崩溃。
不知道是 PHP 多线程和 Windows 环境的支持不好,还是 PHP 多线程本身的问题,区区 1000 线程跑不动。多线程的地方还是比较需要 Python 和 C 出马。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇:PHP设计模式之装饰器模式实例详解

