包含文件的PHP Eval替代方案

包含文件的PHP Eval替代方案,php,gearman,beanstalkd,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

我目前正在使用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文件将更改为一个新的版本号,这将迫使worker终止。我不能使用include,因为文件将在while循环中加载到内存中。知道params.php文件在安全性方面并不重要,我想知道是否有其他方法可以做到这一点

编辑:params.php如下所示:

<?php
return [
'Job1Version' => 5
];


由于您的文件有一个
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为我指明了正确的方向。

假设
params.php
只是一组变量,您可以使用ini、json或类似的序列化格式。序列化配置(json或序列化)比包含快(多),而且肯定比读取和评估快。JSON甚至是可读和可编辑的。只是说,使用ini文件来保存工作人员的版本确实是一个解决方案,因为代码将在一天内执行大量时间,我猜使用parse_ini将比eval更快。由于while循环,使用require不会捕获params.php文件的更新。嗯,php缓存包括。。。你可以重复多次,但每次都是一样的。我不知道<代码>clearstatcache()
似乎没有帮助。@实际上,我已经运行了两个测试,找到了一个更好的自动化解决方案,不再需要版本设置。在我调用的Job1Controller中:clearstatcache()$reflectionClass new\reflectionClass($this)$lastUpdated=filemtime($reflectionClass->getFileName());并将该值与运行时定义的值进行比较。谢谢你给我指出了正确的方向。但是你从哪里得到这些参数呢?这就是目的,不是吗?当新参数被更改时获取新参数?主要目的是在发布新版本的worker时进行检查并退出以运行新版本。起初,我认为为每个worker提供一个版本是唯一的解决方案,但依赖于params意味着每次更新worker时,我都必须更新文件中的版本。依赖filemtime实际上更灵活,因为它不需要我更新这些参数,因为代码会自动检查工作进程是否在运行后被修改。为这一混乱道歉。
$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
    }
}