У меня есть постоянно работающий 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 с тем же кодом, который я показал, и затем начните испытание.
Не в текущем файле, кроме вызова функции, которая пытается проверить условие:
$variable = function() {
return date('l') == 'Saturday' ? ':)' : ':(';
};
while (true) {
echo $variable() . PHP_EOL;
sleep(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
Теперь вы можете записать значение во второе окно терминала, и оно будет меняться в первом.