我目前在我的机器上启动了一个永久运行的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'并确切与我展示的代码相同,然后开始挑战。
答案 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
现在您可以将值写入第二个终端窗口,它将在第一个终端窗口中更改。