PHP Eval替代包含文件

时间:2014-10-26 13:29:59

标签: php gearman beanstalkd

我目前正在使用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
];

2 个答案:

答案 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,他指出了我正确的方向。