командная строка — изменение переменной PHP на лету (во время выполнения)

У меня есть постоянно работающий PHP-скрипт, который сейчас запущен на моей машине.

Я сделал некоторые изменения в исходном коде этого скрипта: я изменил значение одной переменной в глобальной области видимости.

Теперь, если я хочу, чтобы эти изменения были применены, я мог бы остановить и перезапустить скрипт, но тогда я потерял бы все вычисления, которые этот скрипт уже сделал. Поэтому я хочу применить сделанные мной изменения кода без перезапуска экземпляра интерпретатора PHP.

Могу ли я сделать это?

Я подумал о том, чтобы подключить XDebug к существующему процессу «php.exe» и попытаться изменить переменную оттуда, но я не знаю, как это сделать.

Другой идеей было бы использовать программное обеспечение, которое могло бы изменить память интерпретатора 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 от «Привет» до «Мир» (который представляет значение переменной, которое я изменил в моем случае реального мира), но без потери текущего значения $i (который представляет сделанные в настоящее время вычисления).

Помни, что ты не могу перед первым запуском скрипта измените код myfile.php: вы должен запустите файл myfile.php с тем же кодом, который я показал, и затем начните испытание.

0

Решение

Не в текущем файле, кроме вызова функции, которая пытается проверить условие:

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

Другие решения

Вы не можете, вам нужно прочитать новое значение откуда-то! Вы можете использовать базу данных или временный файл, например:

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

Теперь вы можете записать значение во второе окно терминала, и оно будет меняться в первом.

0

По вопросам рекламы [email protected]