243 lines
5.6 KiB
PHP
243 lines
5.6 KiB
PHP
![]() |
<?php
|
|||
|
// +----------------------------------------------------------------------
|
|||
|
// | CatchAdmin [Just Like ~ ]
|
|||
|
// +----------------------------------------------------------------------
|
|||
|
// | Copyright (c) 2017~{$year} http://catchadmin.com All rights reserved.
|
|||
|
// +----------------------------------------------------------------------
|
|||
|
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
|
|||
|
// +----------------------------------------------------------------------
|
|||
|
// | Author: JaguarJack [ njphper@gmail.com ]
|
|||
|
// +----------------------------------------------------------------------
|
|||
|
|
|||
|
namespace catchAdmin\monitor\command\process;
|
|||
|
|
|||
|
use catcher\facade\FileSystem;
|
|||
|
|
|||
|
trait Store
|
|||
|
{
|
|||
|
/**
|
|||
|
* worker 根目录
|
|||
|
*
|
|||
|
* @time 2020年07月23日
|
|||
|
* @return string
|
|||
|
*/
|
|||
|
public static function storeTaskPath()
|
|||
|
{
|
|||
|
$path = config('catch.crontab.store_path');
|
|||
|
|
|||
|
if (!Filesystem::exists($path)) {
|
|||
|
FileSystem::makeDirectory($path, 0777, true);
|
|||
|
}
|
|||
|
|
|||
|
return $path;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 保存信息备用
|
|||
|
*
|
|||
|
* @time 2020年07月29日
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
protected function saveTaskInfo()
|
|||
|
{
|
|||
|
FileSystem::put(self::storeTaskPath() . 'information.json', \json_encode([
|
|||
|
'name' => $this->name,
|
|||
|
'static' => $this->static,
|
|||
|
'dynamic' => $this->dynamic,
|
|||
|
'interval' => $this->interval,
|
|||
|
], JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* worker master pid
|
|||
|
*
|
|||
|
* @time 2020年07月23日
|
|||
|
* @return string
|
|||
|
*/
|
|||
|
public static function masterPidStorePath()
|
|||
|
{
|
|||
|
return self::storeTaskPath() . 'master.pid';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* worker master status
|
|||
|
*
|
|||
|
* @time 2020年07月23日
|
|||
|
* @return string
|
|||
|
*/
|
|||
|
public static function statusPath()
|
|||
|
{
|
|||
|
return self::storeTaskPath() . 'master.status';
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* worker status
|
|||
|
*
|
|||
|
* @time 2020年07月23日
|
|||
|
* @param string $name
|
|||
|
* @return string
|
|||
|
*/
|
|||
|
public static function workerStatusPath($name)
|
|||
|
{
|
|||
|
$path = self::storeTaskPath() . 'status/';
|
|||
|
|
|||
|
if (!FileSystem::exists($path)) {
|
|||
|
FileSystem::makeDirectory($path, 0777, true);
|
|||
|
}
|
|||
|
|
|||
|
return $path . $name . '.status';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* @time 2020年07月23日
|
|||
|
* @return string
|
|||
|
*/
|
|||
|
public static function getWorkerStatusPath()
|
|||
|
{
|
|||
|
return self::storeTaskPath() . 'status/';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* worker log
|
|||
|
*
|
|||
|
* @time 2020年07月23日
|
|||
|
* @return string
|
|||
|
*/
|
|||
|
public static function stdoutPath()
|
|||
|
{
|
|||
|
return self::storeTaskPath() . 'errors.log';
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* 获取 master pid
|
|||
|
*
|
|||
|
* @time 2020年07月21日
|
|||
|
* @return false|string
|
|||
|
*/
|
|||
|
public static function getMasterPid()
|
|||
|
{
|
|||
|
$pidFile = config('catch.crontab.master_pid_file');
|
|||
|
|
|||
|
if (!file_exists($pidFile)) {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
return FileSystem::sharedGet($pidFile);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* status
|
|||
|
*
|
|||
|
* @time 2020年07月21日
|
|||
|
* @return false|string
|
|||
|
*/
|
|||
|
public function renderStatus()
|
|||
|
{
|
|||
|
return file_get_contents(self::statusPath());
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 运行时间
|
|||
|
*
|
|||
|
* @time 2020年07月23日
|
|||
|
* @param $runtime
|
|||
|
* @return string
|
|||
|
*/
|
|||
|
protected function getRunningTime($runtime)
|
|||
|
{
|
|||
|
$day = 3600 * 24;
|
|||
|
if ($runtime > $day) {
|
|||
|
$days = floor($runtime / $day);
|
|||
|
return $days . '天:' . gmstrftime('%H:%M:%S', $runtime % $day);
|
|||
|
} else {
|
|||
|
return gmstrftime('%H:%M:%S', $runtime);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 获取工作进程
|
|||
|
*
|
|||
|
* @time 2020年07月23日
|
|||
|
* @return mixed
|
|||
|
*/
|
|||
|
public function getWorkerStatus()
|
|||
|
{
|
|||
|
usleep(500 * 1000);
|
|||
|
|
|||
|
$files = FileSystem::glob(self::storeTaskPath() . 'status/*.status');
|
|||
|
|
|||
|
$workerStatus = [];
|
|||
|
|
|||
|
foreach ($files as $file) {
|
|||
|
$workerStatus[] = explode("\t", FileSystem::sharedGet($file));
|
|||
|
}
|
|||
|
|
|||
|
return $workerStatus;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 设置进程状态
|
|||
|
*
|
|||
|
* @time 2020年07月23日
|
|||
|
* @param $name
|
|||
|
* @param int $dealNum
|
|||
|
* @param string $status
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
protected function setWorkerStatus($name, $dealNum = 0, $status = 'running')
|
|||
|
{
|
|||
|
$startAt = strpos($name, 'worker') ? $this->worker_start_at : $this->start_at;
|
|||
|
|
|||
|
if ($this->daemon) {
|
|||
|
FileSystem::put($this->workerStatusPath($this->workerStatusFileName($name)), implode("\t", [
|
|||
|
posix_getpid(),
|
|||
|
$name,
|
|||
|
floor(memory_get_usage() / 1024 / 1024) . 'M',
|
|||
|
$dealNum,
|
|||
|
date('Y-m-d H:i:s', $startAt),
|
|||
|
$this->getRunningTime(time() - $startAt),
|
|||
|
$status
|
|||
|
]));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 进程名称
|
|||
|
*
|
|||
|
* @time 2020年09月15日
|
|||
|
* @param $name
|
|||
|
* @return string
|
|||
|
*/
|
|||
|
protected function workerStatusFileName($name)
|
|||
|
{
|
|||
|
return $name . '_' . posix_getpid();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 删除进程状态文件
|
|||
|
*
|
|||
|
* @time 2020年09月15日
|
|||
|
* @param $pid
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
protected function deleteWorkerStatusFile($pid)
|
|||
|
{
|
|||
|
@unlink(self::workerStatusPath($this->name . ' worker_' . $pid));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 退出
|
|||
|
*
|
|||
|
* @time 2020年09月15日
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
public static function exitMasterDo()
|
|||
|
{
|
|||
|
@unlink(self::masterPidStorePath());
|
|||
|
@unlink(self::statusPath());
|
|||
|
Filesystem::deleteDirectory(self::getWorkerStatusPath());
|
|||
|
}
|
|||
|
}
|