Files
kiri-core/HttpServer/Shutdown.php
T

151 lines
2.6 KiB
PHP
Raw Normal View History

2021-03-28 16:09:18 +08:00
<?php
namespace HttpServer;
2021-03-29 16:27:12 +08:00
use Annotation\Aspect;
use Database\InjectProperty;
2021-03-28 16:09:18 +08:00
use Exception;
use Snowflake\Abstracts\Component;
2021-03-29 11:11:33 +08:00
use Snowflake\Abstracts\Config;
use Snowflake\Exception\ConfigException;
2021-03-28 16:09:18 +08:00
/**
* Class Shutdown
* @package HttpServer
*/
class Shutdown extends Component
{
2021-03-29 10:44:36 +08:00
private string $taskDirectory;
private string $workerDirectory;
private string $managerDirectory;
private string $processDirectory;
2021-03-29 11:32:01 +08:00
private array $_pids = [];
2021-03-29 10:44:36 +08:00
/**
* @throws Exception
*/
2021-03-29 17:00:53 +08:00
public function init()
2021-03-29 10:44:36 +08:00
{
$this->taskDirectory = storage(null, 'pid/task');
$this->workerDirectory = storage(null, 'pid/worker');
$this->managerDirectory = storage(null, 'pid/manager');
$this->processDirectory = storage(null, 'pid/process');
}
/**
* @throws Exception
*/
public function shutdown(): void
{
clearstatcache(storage());
2021-04-16 11:36:27 +08:00
exec('ls -alh /.dockerenv', $output, $cod);
if ($cod === 0 && !empty($output)) {
return;
}
2021-03-29 10:44:36 +08:00
$master_pid = Server()->setting['pid_file'] ?? PID_PATH;
if (file_exists($master_pid)) {
2021-03-29 10:49:42 +08:00
$this->close($master_pid);
2021-03-29 10:44:36 +08:00
}
$this->closeOther();
}
/**
* 关闭其他进程
*/
private function closeOther(): void
{
$this->directoryCheck($this->managerDirectory);
$this->directoryCheck($this->taskDirectory);
$this->directoryCheck($this->workerDirectory);
$this->directoryCheck($this->processDirectory);
}
/**
* @return bool
* @throws Exception
* check server is running.
*/
2021-03-29 10:48:59 +08:00
public function isRunning(): bool
2021-03-29 10:44:36 +08:00
{
$master_pid = Server()->setting['pid_file'] ?? PID_PATH;
if (!file_exists($master_pid)) {
return false;
}
2021-03-29 10:48:59 +08:00
return $this->pidIsExists(file_get_contents($master_pid));
2021-03-29 10:44:36 +08:00
}
/**
* @param $content
* @return bool
*/
public function pidIsExists($content): bool
{
if (intval($content) < 1) {
return false;
}
2021-03-29 12:13:53 +08:00
exec('ps -eo pid', $output);
$output = array_filter($output, function ($value) {
return intval($value);
});
2021-03-29 12:14:37 +08:00
return in_array(intval($content), $output);
2021-03-29 10:44:36 +08:00
}
/**
* @param string $path
2021-03-29 10:46:51 +08:00
* @return bool
2021-03-29 12:12:23 +08:00
* @throws ConfigException
2021-03-29 10:44:36 +08:00
*/
2021-03-29 10:46:51 +08:00
public function directoryCheck(string $path): bool
2021-03-29 10:44:36 +08:00
{
$dir = new \DirectoryIterator($path);
if ($dir->getSize() < 1) {
return true;
}
foreach ($dir as $value) {
if ($value->isDot()) continue;
if (!$value->valid()) continue;
$this->close($value->getRealPath());
}
return false;
}
/**
* @param string $value
*/
public function close(string $value)
{
2021-03-29 10:52:46 +08:00
$content = file_get_contents($value);
2021-03-29 10:44:36 +08:00
while ($this->pidIsExists($content)) {
2021-03-29 12:15:21 +08:00
exec('kill -15 ' . $content);
2021-03-29 10:44:36 +08:00
sleep(1);
}
clearstatcache($value);
if (file_exists($value)) {
@unlink($value);
}
}
2021-03-28 16:09:18 +08:00
}