<?php
require __DIR__.'/common.php';
$side=$argv[1]??'';$mode=$argv[2]??'';pp_need(in_array($side,['B','C'],true),'Known approved side');$env=[];foreach(['PATH','LANG','TZ','LD_LIBRARY_PATH','DM_HOME','NLS_LANG','DM_CHARSET','DM_SVC_PATH','LC_ALL','LC_CTYPE']as $k)if(getenv($k)!==false)$env[$k]=getenv($k);
if($side==='B'){$ini=parse_ini_file('/workspace/zhct/zhctproject/ai_api/.env.local',true,INI_SCANNER_RAW);foreach(['DATABASE'=>'AI','DATABASE_ZHCT'=>'ZHCT']as $section=>$db){$v=array_merge(['HOSTPORT'=>'3306','CHARSET'=>'utf8','PREFIX'=>$db==='AI'?'yoshop_':'ydy_'],$ini[$section]);foreach(['HOSTNAME'=>'HOST','HOSTPORT'=>'PORT','DATABASE'=>'SCHEMA','USERNAME'=>'USER','PASSWORD'=>'PASSWORD','CHARSET'=>'CHARSET','PREFIX'=>'PREFIX']as $f=>$t)$env['POC_'.$db.'_'.$t]=$v[$f];}$env['PP_STORE_PARENT']='/tmp/zhct-http-store-mysql.dQTTBP';$parent=10001;pp_need(strpos((string)file_get_contents('/proc/'.$parent.'/cmdline'),$env['PP_STORE_PARENT'].'/public')!==false,'Original B Store parent live');$env['POC_DIALECT']='mysql';}
else{foreach([[53772,'127.0.0.1:18102','AI'],[112175,'/tmp/zhct-dm-poc-20260928.fcpiiN/store','ZHCT']]as [$pid,$needle,$db]){pp_need(strpos((string)file_get_contents('/proc/'.$pid.'/cmdline'),$needle)!==false,'Original C nonproduction parent still live');foreach(explode("\0",(string)file_get_contents('/proc/'.$pid.'/environ'))as $entry){$pair=explode('=',$entry,2);if(count($pair)!==2)continue;if($db==='AI'&&in_array($pair[0],['PATH','LANG','TZ','LD_LIBRARY_PATH','DM_HOME','NLS_LANG','DM_CHARSET','DM_SVC_PATH','LC_ALL','LC_CTYPE'],true))$env[$pair[0]]=$pair[1];foreach(['HOST','PORT','SCHEMA','USER','PASSWORD']as $k)if($pair[0]===($db==='AI'?'POC_AI_':'POC_').$k)$env['POC_'.$db.'_'.$k]=$pair[1];}$env['POC_'.$db.'_CHARSET']='utf8';$env['POC_'.$db.'_PREFIX']=$db==='AI'?'yoshop_':'ydy_';}$env['PP_STORE_PARENT']='/tmp/zhct-dm-poc-20260928.fcpiiN/store';$env['POC_DIALECT']='dm';}
foreach(["HOST","PORT","SCHEMA","USER","PASSWORD","PREFIX","CHARSET"]as $k)$env["POC_".$k]=$env["POC_ZHCT_".$k];
$env['PP_SIDE']=$side;$env['POC_EXTERNAL_STUBS']='1';$env['POC_REAL_QUEUE']='0';$phase=['warm-store'=>'warm','warm-ai'=>'warm','auth'=>'auth','launch-store'=>'code','launch-ai'=>'scan'][$mode]??'observer';$env['PP_PHASE']=$phase;$store=in_array($mode,['warm-store','launch-store'],true);$ver=$store?'73':'74';$args=[$side==='B'?'/usr/local/php7.'.($store?'3':'4').'/bin/php':'/www/server/php/'.$ver.'/bin/php'];if($side==='C')array_push($args,'-c','/www/server/php/'.$ver.'/etc/php-cli.ini','-d','extension=/home/dmdba/dmdbms/drivers/php_pdo/libphp'.$ver.'_dm.so','-d','extension=/home/dmdba/dmdbms/drivers/php_pdo/php'.$ver.'_pdo_dm.so');array_push($args,'-d','display_errors=0','-d','log_errors=0');
if(strpos($mode,'launch-')===0){$port=$side==='B'?($store?19091:19093):($store?19092:19094);pp_need(!is_file(pp_private().'/worker-'.$mode.'.json'),'Exact worker lease collision');$s=@fsockopen('127.0.0.1',$port,$a,$b,.2);pp_need(!is_resource($s),'Exact own port collision0');array_push($args,'-d','allow_url_fopen=0','-d','disable_functions=curl_exec,curl_multi_exec,fsockopen,pfsockopen,stream_socket_client','-S','127.0.0.1:'.$port,'-t',pp_base(),__DIR__.'/router-v2.php');$cmd='nohup '.implode(' ',array_map('escapeshellarg',$args)).' </dev/null >/dev/null 2>&1 & echo $!';$p=proc_open($cmd,[1=>['pipe','w'],2=>['file',pp_private().'/worker-errors.log','a']],$pipes,null,$env);pp_need(is_resource($p),'Own worker spawn');$pid=(int)trim(stream_get_contents($pipes[1]));fclose($pipes[1]);pp_need(proc_close($p)===0&&$pid>1,'Own workerPID');pp_save('worker-'.$mode.'.json',['pid'=>$pid,'port'=>$port,'router'=>__DIR__.'/router-v2.php','phase'=>$phase]);echo pp_json(['status'=>'OWN_WORKER_LAUNCHED','side'=>$side,'phase'=>$phase,'pid'=>$pid,'port'=>$port])."\n";exit;}
array_push($args,__DIR__.'/run-v3.php',$mode);$p=proc_open(implode(' ',array_map('escapeshellarg',$args)),[0=>STDIN,1=>STDOUT,2=>STDERR],$pipes,null,$env);pp_need(is_resource($p),'Own scoped child');exit(proc_close($p));
