====== StarDust - менеджер процесів ======
Слугує для відслідковування виконання процесів, що можуть відбуватись в окремих потоках.
Використання надпросте. Наприклад, коли нам треба дізнатись "а чи не виконується десь в сусідньому потоці якийсь процес?" задля того, аби забезпечити його монопольність та уникнути race condition.
$pid = new StarDust('SOMEPROCESS');
if ($pid->isRunning()) {
show_warning(__('This process is already running'));
} else {
show_info(__('Process not running, starting it!'));
$pid->start();
//here we can run any part of code
sleep(10);
$pid->stop();
show_success(__('Process execution finished'));
}
ну або ж в зворотній бік перевіряючи його на notRunning
$pid = new StarDust('SOMEPROCESS');
if ($pid->notRunning()) {
show_info(__('Process not running now'));
} else {
show_warning(__('This process is already running'));
}
Також нам може захотітись взнати, як проходить виконання цього процесу зараз:
$processState=$pid->getState();
debarr($processState);
Array
(
[start] => 1661962409
[end] => 1661962419
[realtime] => 10.00102
[ms] => 1661962409.718
[me] => 1661962419.719
[finished] => 1
[pid] => 42847
)
Що це за значення?
* **start** - час початку роботи процесу в вигляді unix timestamp (int)
* **end** - час завершення роботи процесу в вигляді unix timestamp. 0 - якщо виконання ще не завершено. (int)
* **realtime** - реальний час виконання процесу, динамічно змінюється, якщо він ще виконується. В секундах. (float)
* **ms** - час початку виконання процесу з мікросекундами. 0 - якщо триває зараз. (float)
* **me** - час завершення виконання процесу з мікросекундами. 0 - якщо ще триває. (float)
* **finished** - стан завершеності виконання процесу. 1 - завершено, 0 - триває зараз. (int)
* **pid** - системний PID процесу в рамках якого було виконано процес, що менеджився StarDust.
та можливо визначити, які взагалі процеси там відбуваються чи відбувались і який в них поточний стан?
$allProcessStates=$pid->getAllStates();
debarr($allProcessStates);
Array
(
[PROCESS1] => Array
(
[start] => 1661961554
[end] => 1661961584
[realtime] => 30.00125
[ms] => 1661961554.6937
[me] => 1661961584.6949
[finished] => 1
[pid] => 52597
)
[PROCESS2] => Array
(
[start] => 1661961672
[end] => 1661961702
[realtime] => 30.00151
[ms] => 1661961672.1594
[me] => 1661961702.1609
[finished] => 1
[pid] => 24597
)
[SOMEPROCESS] => Array
(
[start] => 1661962409
[end] => 1661962419
[realtime] => 10.00102
[ms] => 1661962409.718
[me] => 1661962419.719
[finished] => 1
[pid] => 54597
)
[ANOTHERPROCESS] => Array
(
[start] => 1661983067
[end] => 0
[realtime] => 0.00055
[ms] => 1661983067.186
[me] => 0
[finished] => 0
[pid] => 28737
)
)
Також ми можемо, динамічно перемикати імена процесів (читаємо ідентифікатори) на ходу, для екземпляру StarDust за допомогою сеттера setProcess
$processManager = new StarDust();
$processManager->setProcess('SOMEPROCESSNAME');
$processState=$processManager->getState();
$processManager->setProcess('ANOTHERPROCESS');
$anotherState=$processManager->getState();
Починаючи з Ubilling 1.3.5 на StarDust також покладено функціонал запуску фонових процесів. Реалізовано це за допомогою наступного методу:
public function runBackgroundProcess(string $command, [integer $timeout = 0] )
runBackgroundProcess власне що тільки запускає процес в фоні, та забуває про нього. Ні, цей метод, не контролює його перебігу. Тому в нормі start() та stop() процес має робити самостійно всередині самого себе, оскільки у StarDust немає можливості визначити постфактум, що там з тим процесом відбуватиметься.