【发布时间】: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