【问题标题】:Change a PHP variable on the fly (while being executed)动态更改 PHP 变量(在执行时)
【发布时间】:2018-02-12 11:05:25
【问题描述】:

我的机器上当前启动了一个永远运行的 PHP 脚本。

我对该脚本的源代码进行了一些更改:我更改了全局范围内的一个变量的值。

现在,如果我想应用这些更改,我可以停止并重新启动脚本,但是我会丢失该脚本已经进行的所有计算。所以我想在不重新启动 PHP 解释器实例的情况下应用我所做的代码更改。

我可以这样做吗?

我想到的可能是在现有的“php.exe”进程中插入XDebug,并尝试从那里更改变量,但我不知道如何。

另一个想法是使用可以改变 PHP 解释器内存或符号表的软件,但我不知道有这样的工具。

我在没有调试器的情况下启动了这个脚本,但我知道当使用调试器启动 Java 时,有一些选项可以“应用代码更改而不重新启动 Java 实例”。 PHP解释器有类似的东西吗?


您可以自己尝试一个示例。使用以下代码创建 PHP 文件“myfile.php”:

<?php
if (ob_get_status()) {
    ob_end_clean();
}
$variable = 'Hello';
$i = mt_rand(0, 1000);
while (true) {
    $i++;
    echo $variable . ' ' . $i . PHP_EOL;
    sleep(1);
}

在命令行中运行:php -f myfile.php

你现在处于我现在的情况:脚本永远运行,它包含一个动态变量$i(在我的真实世界案例中我实际上无法知道当前值,因为那个真实世界案例没有输出)。

现在的挑战是$variable 的值从 'Hello' 更改为 'World'(代表我在现实世界案例中更改的变量值),但没有丢失$i 的当前值(表示当前完成的计算)。

请记住,在第一次运行脚本之前,您不能更改“myfile.php”代码:您必须准确地运行“myfile.php”与我展示的代码相同,然后开始挑战。

【问题讨论】:

  • 是什么阻止你在 while 循环中改变它?
  • @ManuelMannhardt 因为 PHP 进程已经启动:如果我更改 PHP 代码,我需要停止并重新启动 PHP 进程以应用新代码,在我的实际示例中,我需要保持运行
  • 使用环境变量/文件/db来存储数据并在每次循环迭代时检索它?尽管 PHP 并不意味着无限期地运行。肯定会有更好的解决方案,但我们不知道您要做什么。
  • @JonStirling 我编辑并试图使需求更清晰,但我现在不能使用环境变量(它需要更改 PHP 代码并重新启动 CLI):问题是 PHP 进程是已经在运行,因此更改代码需要重新启动它AFAIK。确实,无限期运行 PHP 并不常见,但这可能是这种脚本语言和解释器的一种用法:)
  • 环境变量不起作用,因为它们是在脚本启动时读取的,但是关于需要将此值存储在脚本外部的一般观点是正确的。它可以在数据库、nosql 存储、文本文件、shared memory segment 或任何数量的其他东西中。了解更多为什么您需要这样做可能有助于缩小范围 - 现在感觉有点像XY Problem

标签: php command-line on-the-fly


【解决方案1】:

不在当前文件中,除非调用一个尝试检查条件的函数:

$variable = function() {
    return date('l') == 'Saturday' ? ':)' : ':(';
};
while (true) {
    echo $variable() . PHP_EOL;
    sleep(1);
}

【讨论】:

    【解决方案2】:

    你不能,你需要从某个地方读取一个新值!您可以像这样使用数据库或临时文件:

    file1.php

    <?php
    
    file_put_contents('var.tmp','hello');
    
    while(true) {
        $var = file_get_contents('var.tmp');
        print $var . PHP_EOL;
        sleep(1);
    }
    

    file2.php

    <?php
    
    while(true){
        $var = readline('$var > ');
        file_put_content('var.tmp',$var);
    }
    

    打开2个终端,在第一个:

    php -f file1.php

    还有第二个

    php -f file2.php

    现在您可以将值写入第二个终端窗口,它会在第一个窗口中发生变化。

    【讨论】:

    • 下次可以使用,但我的file1.php 已经在运行,所以我无法在其中进行更改而无需重新启动当前正在运行的实例
    • 您无法更改文件中已启动的变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2016-08-31
    • 1970-01-01
    相关资源
    最近更新 更多