Updated \TamerLib\Objects > WorkerInstance to pass through the parent process arguments to the sub-process

This commit is contained in:
Netkas 2023-06-16 02:31:17 -04:00
parent ee70a733db
commit dc02826079
No known key found for this signature in database
GPG key ID: 5DAF58535614062B

View file

@ -6,9 +6,10 @@
use Exception; use Exception;
use LogLib\Log; use LogLib\Log;
use RuntimeException;
use Symfony\Component\Process\PhpExecutableFinder; use Symfony\Component\Process\PhpExecutableFinder;
use Symfony\Component\Process\Process; use Symfony\Component\Process\Process;
use TamerLib\Classes\Utilities;
use TamerLib\Exceptions\WorkerFailedException;
class WorkerInstance class WorkerInstance
{ {
@ -27,7 +28,6 @@
*/ */
private $process; private $process;
/** /**
* WorkerInstance constructor. * WorkerInstance constructor.
* *
@ -73,12 +73,12 @@
} }
catch(Exception $e) catch(Exception $e)
{ {
Log::warning('net.nosial.tamerlib', sprintf('Failed to stop worker %s', $this->configuration->getWorkerId()), $e); Log::warning(Utilities::getName(), sprintf('Failed to stop worker %s', $this->configuration->getWorkerId()), $e);
} }
finally finally
{ {
$this->process = null; $this->process = null;
Log::debug('net.nosial.tamerlib', sprintf('Stopped worker %s', $this->configuration->getWorkerId())); Log::debug(Utilities::getName(), sprintf('Stopped worker %s', $this->configuration->getWorkerId()));
} }
} }
@ -86,6 +86,7 @@
* Starts the process for the worker. * Starts the process for the worker.
* *
* @return void * @return void
* @throws WorkerFailedException
*/ */
public function start(): void public function start(): void
{ {
@ -94,71 +95,57 @@
return; return;
} }
// Get the current processes arguments and pass them to the new process.
$pass_args = $_SERVER['argv'];
if(count($pass_args) > 1)
{
array_shift($pass_args);
}
$php_bin = (new PhpExecutableFinder())->find(); $php_bin = (new PhpExecutableFinder())->find();
$process = new Process([$php_bin, $this->path]); $process = new Process(array_merge([$php_bin, $this->path], $pass_args));
$process->setEnv($this->configuration->toEnvironment()); $process->setEnv($this->configuration->toEnvironment());
try try
{ {
Log::debug(Utilities::getName(), sprintf('Executing %s', $process->getCommandLine()));
$process->start(); $process->start();
} }
catch(Exception $e) catch(Exception $e)
{ {
Log::warning('net.nosial.tamerlib', sprintf('Failed to start worker %s', $this->configuration->getWorkerId()), $e); throw new WorkerFailedException(sprintf('Failed to start worker %s', $this->configuration->getWorkerId()), $e);
return;
} }
finally finally
{ {
$this->process = $process; $this->process = $process;
Log::debug('net.nosial.tamerlib', sprintf('Started worker %s', $this->configuration->getWorkerId()));
} }
} }
/**
* Restarts the worker.
*
* @return void
* @throws WorkerFailedException
*/
public function restart(): void
{
$this->stop();
$this->start();
}
/** /**
* Returns the last output from the worker. * Returns the last output from the worker.
* *
* @return string|null * @return string
*/ */
public function getOutput(): ?string public function getOutput(): string
{ {
if(is_null($this->process)) if(is_null($this->process))
{ {
return ''; return '';
} }
$output = $this->process->getIncrementalOutput(); return Utilities::getLatestOutput($this->process);
return empty($output) ? null : $output;
}
/**
* Monitors the worker for a given amount of time, or indefinitely if no timeout is given.
* Throws an exception if the worker is not running.
* Outputs the worker's output to the console.
*
* @param int $timeout
* @return void
*/
public function monitor(int $timeout=0): void
{
$time_start = time();
while(true)
{
if(!$this->isRunning())
{
throw new RuntimeException(sprintf('Worker %s is not running', $this->configuration->getWorkerId()));
}
$output = $this->getOutput();
if(!is_null($output))
{
print($output);
}
if($timeout > 0 && (time() - $time_start) > $timeout)
{
break;
}
}
} }
/** /**
@ -176,12 +163,4 @@
{ {
return $this->configuration; return $this->configuration;
} }
/**
* @return string|null
*/
public function getPath(): ?string
{
return $this->path;
}
} }