<?php
// Runs extracted production helper only. No framework or external Redis/database.
class Cache {
    public static $value = null;
    public static function get($key) { $v=self::$value; Fiber::suspend(); return $v; }
    public static function set($key,$value,$expire) { self::$value=$value; return true; }
}
function getRedis() { return null; }
function prevent_repeat_submit($cache_key, $expire = 5) {
    $cache_key = (string)$cache_key;
    if ($cache_key === '') {
        return false;
    }
    $expire = (int)$expire;
    $expire = $expire > 0 ? $expire : 1;

    $redis = getRedis();
    if ($redis instanceof \Redis) {
        try {
            $count = $redis->incr($cache_key);
            if ($count === 1) {
                $redis->expire($cache_key, $expire);
                return true;
            }
            return false;
        } catch (\Throwable $e) {
            // 回退到缓存驱动，保证功能可用
        }
    }

    $cache_value = Cache::get($cache_key);
    if (!empty($cache_value)) {
        return false;
    }
    Cache::set($cache_key, 1, $expire);
    return true;
}

$a=new Fiber(fn()=>prevent_repeat_submit('same-business-request',300));
$b=new Fiber(fn()=>prevent_repeat_submit('same-business-request',300));
$a->start(); $b->start(); $a->resume(); $b->resume();
$results=[$a->getReturn(),$b->getReturn()];
if ($results !== [true,true]) throw new RuntimeException('Unexpected result');
echo json_encode(['test'=>'cache fallback concurrent get-before-set','allowed'=>$results,'expected_after_fix'=>[true,false],'result'=>'DEFECT_REPRODUCED','scope'=>'actual PHP helper with Fiber-controlled in-memory cache interleaving; no live Redis']).PHP_EOL;
