【问题标题】:PHP Eval alternative to include a filePHP Eval 替代包含文件
【发布时间】:2014-10-26 13:29:58
【问题描述】:

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

编辑:params.php 如下所示:

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

【问题讨论】:

  • 假设params.php只是一堆变量,你可以使用ini、json或类似的序列化格式。
  • 序列化你的配置(json 或序列化)比 include 快(很多),而且肯定比 read 和 eval 快。 JSON 甚至是可读和可编辑的。只是说。
  • 使用 ini 文件只是为了保留工人的版本确实可能是一个解决方案,因为代码将在一天内执行大量时间,我猜使用 parse_ini 仍然比 eval 快.

标签: php gearman beanstalkd


【解决方案1】:
$params = require($file);

由于您的文件有 return 语句,返回的值将被传递。

【讨论】:

  • 由于 while 循环,使用 require 不会捕获 params.php 文件的更新。
  • 嗯,PHP 缓存包括...您可以多次执行,但每次都相同。不知道那个。 clearstatcache() 似乎没有帮助。
  • @Rudie 实际上我已经运行了几个测试并找到了一个更好的自动化解决方案,它不再需要版本控制。在我调用的 Job1Controller 中: clearstatcache(); $reflectionClass 新 \ReflectionClass($this) $lastUpdated = filemtime($reflectionClass->getFileName());并将该值与运行时定义的值进行比较。感谢您为我指明正确的方向。
【解决方案2】:

经过几次测试,我终于找到了一个不再需要版本控制的解决方案。

$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
    }
}

每当文件更新时,worker会自动退出 感谢@Rudie 为我指明了正确的方向。

【讨论】:

  • 但是你从哪里得到参数?那不是目的吗?获取更改后的新参数?
  • 主要目的是检查worker的新版本何时发布并退出以运行新版本。一开始我认为为每个工作人员提供一个版本是唯一的解决方案,但依赖参数意味着每次我更新工作人员时,我都必须在文件中更新其版本。依赖 filemtime 实际上更灵活,因为它不需要我更新这些参数,因为代码会自动检查 worker 自运行以来是否已被修改。为混乱道歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 2011-08-02
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
相关资源
最近更新 更多