简单的抢购队列功能

两个PHP客户端脚本在循环中检查并写入共享的queue.txt文件,模拟抢购行为。每个客户端在文件为空时开始抢购,完成10次循环后宣布成功。客户端1耗时10秒,客户端2耗时18秒,展示了并发执行的不同步情况。
摘要由CSDN通过智能技术生成

客户端1

<?php
set_time_limit(0);

$startTime = date('Y-m-d H:i:s');

function rob($startTime)
{
    $clientName = 'client1';
    $fp = fopen('queue.txt', "w");
    fwrite($fp, '【' . $clientName . '】 正在抢购中...' . "\r\n");
    fclose($fp);
    $a = 0;
    while (true) {
        sleep(1);
        $a++;
        if ($a === 10) {
            file_put_contents('queue.txt', '');
            $endTime = strtotime(date('Y-m-d H:i:s')) - strtotime($startTime);
            exit('抢购成功-总耗时 ' . $endTime . ' 秒');
        }
    }
}

while (true) {
    $fp = fopen('queue.txt', "a+");
    if (!feof($fp)) {
        $firstRow = fgets($fp);
        fclose($fp);
        if (!$firstRow) {
            rob($startTime);
        }
    } else {
        fclose($fp);
    }
    sleep(1);
    if (strtotime(date('Y-m-d H:i:s')) - strtotime($startTime) > 60) {
        exit('抢购超时,请重试');
    }
}

客户端2

<?php
set_time_limit(0);

$startTime = date('Y-m-d H:i:s');

function rob($startTime)
{
    $clientName = 'client2';
    $fp = fopen('queue.txt', "w");
    fwrite($fp, '【' . $clientName . '】 正在抢购中...' . "\r\n");
    fclose($fp);
    $a = 0;
    while (true) {
        sleep(1);
        $a++;
        if ($a === 10) {
            file_put_contents('queue.txt', '');
            $endTime = strtotime(date('Y-m-d H:i:s')) - strtotime($startTime);
            exit('抢购成功-总耗时 ' . $endTime . ' 秒');
        }
    }
}

while (true) {
    $fp = fopen('queue.txt', "a+");
    if (!feof($fp)) {
        $firstRow = fgets($fp);
        fclose($fp);
        if (!$firstRow) {
            rob($startTime);
        }
    } else {
        fclose($fp);
    }
    sleep(1);
    if (strtotime(date('Y-m-d H:i:s')) - strtotime($startTime) > 60) {
        exit('抢购超时,请重试');
    }
}

客户端1网页输出如下

抢购成功-总耗时 10 秒

客户端2网页输出如下

抢购成功-总耗时 18 秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伴随着编程慢慢长大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值