1 Star 1 Fork 2

宏哥 / run

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
run.php 2.98 KB
一键复制 编辑 原始数据 按行查看 历史
<?PHP
define('SYSPATH',__DIR__.'/');
require 'classes/cli.php';
require 'classes/arr.php';
$helpdoc = <<< EOT
php run.php --n=<NUMBER OF PROCESS> --e=<EXECUTABLE>
EOT;
set_time_limit(0);
$g_run_cycles = 0;
$g_run = true;
$g_reload = false;
declare(ticks = 30);
$g_options = [];
$g_options = Cli::options('e','n');
$g_num_process = Arr::get($g_options,'n');
if(!$g_num_process){
die($helpdoc);
}else{
define('WANT_PROCESSORS', $g_num_process);
}
$g_executable = Arr::get($g_options,'e');
if(!$g_executable){
die($helpdoc);
}else{
define('PROCESSOR_EXECUTABLE', $g_executable);
}
echo 'Starting '.posix_getpid().PHP_EOL;
function signal_handler($signal) {
switch($signal) {
case SIGINT:
case SIGTERM :
global $g_run;
$g_run = false;
echo posix_getpid().' Catch SIGTERM/SIGINT'.PHP_EOL;
break;
case SIGHUP :
global $g_reload;
$g_reload = true;
echo posix_getpid().' Catch SIGHUP'.PHP_EOL;
break;
default:
echo posix_getpid().' Catch Signal='.$signal.PHP_EOL;
}
}
pcntl_signal(SIGTERM, 'signal_handler');
pcntl_signal(SIGHUP, 'signal_handler');
pcntl_signal(SIGINT, 'signal_handler');
function spawn_processor() {
$pid = pcntl_fork();
if($pid) {
global $processors;
$processors[] = $pid;
} else {
if(posix_setsid() == -1)
die("Forked process could not detach from terminal\n");
fclose(stdin);
fclose(stdout);
fclose(stderr);
pcntl_exec(PROCESSOR_EXECUTABLE);
die('Failed to fork ' . PROCESSOR_EXECUTABLE . "\n");
}
}
function spawn_processors() {
global $processors;
if($processors)
kill_processors();
$processors = array();
for($ix = 0; $ix < WANT_PROCESSORS; $ix++)
spawn_processor();
}
function kill_processors() {
global $processors;
foreach($processors as $processor)
posix_kill($processor, SIGTERM);
foreach($processors as $processor)
pcntl_waitpid($processor);
unset($processors);
}
function check_processors() {
global $processors;
$valid = array();
foreach($processors as $processor) {
pcntl_waitpid($processor, $status, WNOHANG);
if(posix_getsid($processor))
$valid[] = $processor;
}
$processors = $valid;
if(count($processors) > WANT_PROCESSORS) {
for($ix = count($processors) - 1; $ix >= WANT_PROCESSORS; $ix--)
posix_kill($processors[$ix], SIGTERM);
for($ix = count($processors) - 1; $ix >= WANT_PROCESSORS; $ix--)
pcntl_waitpid($processors[$ix]);
} elseif(count($processors) < WANT_PROCESSORS) {
for($ix = count($processors); $ix < WANT_PROCESSORS; $ix++)
spawn_processor();
}
}
spawn_processors();
while($g_run) {
$g_run_cycles++;
if($g_reload) {
$g_reload = false;
kill_processors();
spawn_processors();
} else {
check_processors();
}
usleep(150000);
pcntl_signal_dispatch();
}
kill_processors();
pcntl_wait();
PHP
1
https://gitee.com/brh/run.git
git@gitee.com:brh/run.git
brh
run
run
master

搜索帮助