123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- <?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;
- protected $process = null;
- /**
- * @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'];
- }
- }
|