gearman — PHP Eval альтернатива для включения файла

В настоящее время я использую систему очередей с 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
];

1

Решение

$params = require($file);

Так как ваш файл имеет return заявление, возвращаемое значение будет передано.

1

Другие решения

После нескольких тестов мне наконец-то удалось найти решение, которое больше не требует создания версий.

$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, который указал мне правильное направление.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector