我目前正在使用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
];
答案 0 :(得分:1)
$params = require($file);
由于您的文件具有return
语句,因此将返回返回的值。
答案 1 :(得分: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,他指出了我正确的方向。