动态更改PHP变量(在执行时)

时间:2018-02-12 11:05:25

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

我目前在我的机器上启动了一个永久运行的PHP脚本。

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

现在,如果我想要应用这些更改,我可以停止并重新启动脚本,但之后我将放弃此脚本已经完成的所有计算。所以我想在不重新启动PHP解释器实例的情况下应用我所做的代码更改。

我能这样做吗?

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

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

我在没有debuger的情况下启动了这个脚本,但我知道Java在使用debuger启动时,可以选择“在不重新启动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'并确切与我展示的代码相同,然后开始挑战。

2 个答案:

答案 0 :(得分:1)

除了调用试图检查条件的函数之外,不在当前文件中:

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

答案 1 :(得分:0)

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

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

现在您可以将值写入第二个终端窗口,它将在第一个终端窗口中更改。