<?php
// Rehearsal-only. Arguments are test metadata, never credentials or business data.
if($argc!==6){fwrite(STDERR,"arguments required\n");exit(2);}
list($_,$phase,$port,$pid,$conf,$prefix)=$argv;
if(!in_array($phase,['write','verify','save'],true)||!in_array($port,['16379','16380'],true)||!preg_match('/^__zhct_rehearsal_[a-f0-9]{24}:$/',$prefix)||strpos($conf,'/workspace/front-redis627-runtime-20261027/isolated-test-')!==0){fwrite(STDERR,"scope rejected\n");exit(2);}
$r=null;
try{
 if(PHP_VERSION!=='7.3.32'||phpversion('redis')!=='5.3.7')throw new RuntimeException('client version');
 $r=new Redis();if(!$r->connect('127.0.0.1',(int)$port,3))throw new RuntimeException('connect');
 $i=$r->info('server');if(($i['redis_version']??'')!=='6.2.7'||(string)($i['process_id']??'')!==$pid||($i['config_file']??'')!==$conf||($i['tcp_port']??0)!=(int)$port)throw new RuntimeException('server binding');
 $k=$prefix.'same';$u='中文菜牌𠮷😀';
 if($phase==='write'){
  foreach([8,9]as$db){$r->select($db);if($r->dbSize()!==0)throw new RuntimeException('nonempty isolated database');}
  $r->select(8);$r->set($k,$u);$r->setex($prefix.'ttl',300,$u);$r->setex($prefix.'expires',1,'ephemeral');
  $r->hMSet($prefix.'hash',['name'=>$u,'count'=>'3']);$r->rPush($prefix.'list',$u,'second');
  $r->multi();$r->set($prefix.'tx','1');$r->incr($prefix.'tx');$tx=$r->exec();if($tx!==[true,2])throw new RuntimeException('transaction');
  $lua=$r->eval("redis.call('SET',KEYS[1],ARGV[1]); return redis.call('GET',KEYS[1])",[$prefix.'lua',$u],1);if($lua!==$u)throw new RuntimeException('lua');
  $r->select(9);if($r->exists($k))throw new RuntimeException('database isolation');$r->set($k,'front2');$r->set($prefix.'db9',$u);
 }
 if($phase==='save'){if($r->save()!==true)throw new RuntimeException('save');}
 else{
  $r->select(8);if($r->get($k)!==$u||$r->hGetAll($prefix.'hash')!==['name'=>$u,'count'=>'3']||$r->lRange($prefix.'list',0,-1)!==[$u,'second']||$r->get($prefix.'tx')!=='2'||$r->get($prefix.'lua')!==$u)throw new RuntimeException('data roundtrip');
  $ttl=$r->ttl($prefix.'ttl');if($ttl<1||$ttl>300||$r->get($prefix.'ttl')!==$u)throw new RuntimeException('ttl');
  if($phase==='verify'&&$r->exists($prefix.'expires'))throw new RuntimeException('expiry');
  $r->select(9);if($r->get($k)!=='front2'||$r->get($prefix.'db9')!==$u)throw new RuntimeException('db9 persistence');
 }
 $persist=$r->info('persistence');
 echo json_encode(['passed'=>true,'phase'=>$phase,'php'=>PHP_VERSION,'phpredis'=>phpversion('redis'),'redis'=>$i['redis_version'],'pid'=>(int)$pid,'port'=>(int)$port,'database_isolation'=>[8,9],'aof_enabled'=>(int)$persist['aof_enabled'],'aof_last_write_status'=>$persist['aof_last_write_status']??null,'rdb_last_bgsave_status'=>$persist['rdb_last_bgsave_status']??null],JSON_UNESCAPED_UNICODE),"\n";
}catch(Throwable$e){fwrite(STDERR,json_encode(['passed'=>false,'phase'=>$phase,'error_class'=>get_class($e),'message'=>$e->getMessage()])."\n");exit(1);}finally{if($r)$r->close();}
