В настоящее время я использую систему очередей с beanstalk + supervisor + PHP.
Я бы хотел, чтобы мои работники автоматически умирали, когда появилась новая версия (в основном, обновление кода).
Мой текущий код выглядит следующим образом
class Job1Controller extends Controller
{
public $currentVersion = 5;
public function actionIndex()
{
while (true) {
// check if a new version of the worker is available
$file = '/config/params.php';
$paramsContent = file_get_contents($file);
$params = eval('?>' . file_get_contents($file));
if ($params['Job1Version'] != $this->currentVersion) {
echo "not the same version, exit worker \n";
sleep(2);
exit();
} else {
echo "same version, continue processing \n";
}
}
}
}
Когда я обновлю код, файл params изменится с новым номером версии, что заставит работника прекратить работу. Я не могу использовать include, поскольку файл будет загружен в память в цикле while. Зная, что файл params.php не является критичным с точки зрения безопасности, я хотел узнать, есть ли другой способ сделать это?
Изменить: params.php выглядит следующим образом:
<?php
return [
'Job1Version' => 5
];
$params = require($file);
Так как ваш файл имеет return
заявление, возвращаемое значение будет передано.
После нескольких тестов мне наконец-то удалось найти решение, которое больше не требует создания версий.
$reflectionClass = new \ReflectionClass($this);
$lastUpdatedTimeOnStart = filemtime($reflectionClass->getFileName());
while (true) {
clearstatcache();
$reflectionClass = new \ReflectionClass($this);
$lastUpdatedTime = filemtime($reflectionClass->getFileName());
if ($lastUpdatedTime != $lastUpdatedTimeOnStart) {
// An update has been made, exit
} else {
// worker hasn't been modified since running
}
}
Всякий раз, когда файл будет обновлен, работник автоматически выйдет
Спасибо @Rudie, который указал мне правильное направление.