/*
Gb16978
*/
protected static function monitorWorkersForWindows()
{
Timer::add(1, "\\Workerman\\Worker::checkWorkerStatusForWindows");
static::$globalEvent->loop();
}
/**
* Exit current process.
*
* @return void
*/
protected static function exitAndClearAll()
{
foreach (static::$_workers as $worker) {
$socket_name = $worker->getSocketName();
if ($worker->transport === 'unix' && $socket_name) {
list(, $address) = explode(':', $socket_name, 2);
@unlink($address);
}
}
@unlink(static::$pidFile);
static::log("Workerman[" . basename(static::$_startFile) . "] has been stopped");
if (static::$onMasterStop) {
call_user_func(static::$onMasterStop);
}
exit(0);
}
/**
* Execute reload.
*
* @return void
*/
protected static function reload()
{
// For master process.
if (static::$_masterPid === posix_getpid()) {
// Set reloading state.
if (static::$_status !== static::STATUS_RELOADING && static::$_status !== static::STATUS_SHUTDOWN) {
static::log("Workerman[" . basename(static::$_startFile) . "] reloading");
static::$_status = static::STATUS_RELOADING;
// Try to emit onMasterReload callback.
if (static::$onMasterReload) {
try {
call_user_func(static::$onMasterReload);
} catch (\Exception $e) {
static::log($e);
exit(250);
} catch (\Error $e) {
static::log($e);
exit(250);
}
static::initId();
}
}
if (static::$_gracefulStop) {
$sig = SIGQUIT;
} else {
$sig = SIGUSR1;
}
// Send reload signal to all child processes.
$reloadable_pid_array = array();
foreach (static::$_pidMap as $worker_id => $worker_pid_array) {
$worker = static::$_workers[$worker_id];
if ($worker->reloadable) {
foreach ($worker_pid_array as $pid) {
$reloadable_pid_array[$pid] = $pid;
}
} else {
foreach ($worker_pid_array as $pid) {
// Send reload signal to a worker process which reloadable is false.
posix_kill($pid, $sig);
}
}
}
// Get all pids that are waiting reload.
static::$_pidsToRestart = array_intersect(static::$_pidsToRestart, $reloadable_pid_array);
// Reload complete.
if (empty(static::$_pidsToRestart)) {
if (static::$_status !== static::STATUS_SHUTDOWN) {
static::$_status = static::STATUS_RUNNING;
}
return;
}
// Continue reload.
$one_worker_pid = current(static::$_pidsToRestart);
// Send reload signal to a worker process.
posix_kill($one_worker_pid, $sig);
// If the process does not exit after static::KILL_WORKER_TIMER_TIME seconds try to kill it.
if(!static::$_gracefulStop){
Timer::add(static::KILL_WORKER_TIMER_TIME, 'posix_kill', array($one_worker_pid, SIGKILL), false);
}
} // For child processes.
else {
reset(static::$_workers);
$worker = current(static::$_workers);
// Try to emit onWorkerReload callback.
if ($worker->onWorkerReload) {
try {
call_user_func($worker->onWorkerReload, $worker);
} catch (\Exception $e) {
static::log($e);
exit(250);
} catch (\Error $e) {
static::log($e);
exit(250);
}
}
if ($worker->reloadable) {
static::stopAll();
}
}
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70019421/viewspace-2907187/ ,如需转载,请注明出处,否则将追究法律责任。