103 lines
2.3 KiB
PHP
103 lines
2.3 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Created by PhpStorm
|
||
|
* User Julyssn
|
||
|
* Date 2022/12/15 11:03
|
||
|
*/
|
||
|
|
||
|
namespace easyTask;
|
||
|
|
||
|
class Terminal
|
||
|
{
|
||
|
/**
|
||
|
* @var object 对象实例
|
||
|
*/
|
||
|
protected static $instance;
|
||
|
|
||
|
protected $rootPath;
|
||
|
|
||
|
/**
|
||
|
* 命令执行输出文件
|
||
|
*/
|
||
|
protected $outputFile = null;
|
||
|
|
||
|
/**
|
||
|
* proc_open 的参数
|
||
|
*/
|
||
|
protected $descriptorsPec = [];
|
||
|
|
||
|
|
||
|
protected $pipes = null;
|
||
|
|
||
|
protected $procStatus = null;
|
||
|
protected $runType = 1;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @param int $runType 1 task使用 输出连续记录 2 普通使用 输出读取后删除
|
||
|
* @return object|static
|
||
|
*/
|
||
|
public static function instance($runType, $outputName = null)
|
||
|
{
|
||
|
if (is_null(self::$instance)) {
|
||
|
self::$instance = new static($runType, $outputName);
|
||
|
}
|
||
|
return self::$instance;
|
||
|
}
|
||
|
|
||
|
public function __construct($runType, $outputName = null)
|
||
|
{
|
||
|
$this->rootPath = root_path();
|
||
|
$this->runType = $runType;
|
||
|
|
||
|
// 初始化日志文件
|
||
|
|
||
|
if ($this->runType === 1) {
|
||
|
$outputDir = Helper::getStdPath();
|
||
|
|
||
|
$this->outputFile = $outputDir . 'exec_' . $outputName . '.std';
|
||
|
} else {
|
||
|
$outputDir = $this->rootPath . 'runtime' . DIRECTORY_SEPARATOR;
|
||
|
|
||
|
$this->outputFile = $outputDir . 'exec_' . getOnlyToken() . '.log';
|
||
|
file_put_contents($this->outputFile, '');
|
||
|
}
|
||
|
|
||
|
|
||
|
// 命令执行结果输出到文件而不是管道
|
||
|
$this->descriptorsPec = [0 => ['pipe', 'r'], 1 => ['file', $this->outputFile, 'a'], 2 => ['file', $this->outputFile, 'a']];
|
||
|
}
|
||
|
|
||
|
public function __destruct()
|
||
|
{
|
||
|
// 类销毁 删除文件,type为2才删除
|
||
|
if ($this->runType == 2) {
|
||
|
unlink($this->outputFile);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function exec(string $command)
|
||
|
{
|
||
|
|
||
|
$this->process = proc_open($command, $this->descriptorsPec, $this->pipes, $this->rootPath);
|
||
|
|
||
|
foreach ($this->pipes as $pipe) {
|
||
|
fclose($pipe);
|
||
|
}
|
||
|
|
||
|
proc_close($this->process);
|
||
|
|
||
|
if ($this->runType == 2) {
|
||
|
$contents = file_get_contents($this->outputFile);
|
||
|
return $contents;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function getProcStatus(): bool
|
||
|
{
|
||
|
$status = proc_get_status($this->process);
|
||
|
return (bool)$status['running'];
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|