Это в основном эксперимент , но я думаю, что он имеет практическое применение.
Идея состоит в том, чтобы иметь возможность исправлять сценарий PHP во время выполнения без перезагрузкиrequest.
Например, допустим, я написал сервер WebSocket на PHP, и этот сервер работает под управлением следующего класса ...
class MyServerApp extends WebSocketServerApp {
protected $clients = array();
public function onConnect($client){
$this->clients[$client->getId()] = $client;
}
public function onDisconnect($client){
unset($this->clients[$client->getId()]);
}
public function onData($client, $data){
$client->send($data); // perform echo functionality
}
}
По сути, сервер создает один экземплярMyServerApp
класс и вызывает его соответственно.Вышеуказанное приложение является эхо-сервером;он отвечает на все запросы клиентов в точности так, как они просили.
Теперь предположим, что я изменил исходный код сервера и хочу, чтобы существующий сервер работал, но изменил поведение (чтобы не потерять существующих клиентов),Сервер приложений удобно имеет событие onTick()
, которое мы можем использовать для проверки изменений в исходном коде:
class MyServerApp extends WebSocketServerApp {
// the existing code from above goes here
/**
* @var integer Timestamp of when the server was last patched.
*/
public $last_patch = 0;
public function __construct(){
$this->last_patch = time();
}
public function onTick(){
if($this->last_patch < filemtime(__FILE__)){
// include __FILE__;
}
}
}
Проверка исправлений, вероятно, будет работать хорошо, , но фактический метод исправления выиграл 't (это, кстати, в настоящее время прокомментировано). Основная причина в том, что класс сервера уже определен.
Так как бы вы сделали фактическое исправление?Каким-то образом перезаписать функции или классы?
Возможные решения
- Использовать более подходящий язык (например, js / node.js), который позволяет перезаписывать (@teresko)
- Использование classkit (и / или альтернатив) для перезаписи функций / классов PHP (@ MatějZábský)
- Разгрузка логики сервера для анонимных функций и просто перезапись таких функций *
- Переименование дублированных классов и загрузка их в обычном режиме(безусловно, утечка памяти) (@chris)
[*] server.php
будет выглядеть так:
$server['onData'] = function(){ /* new function body */ };
Примечания
С другой стороны,эта архитектура ставит некоторые проблемы, которые действительно необходимо устранить:
- постоянное повреждение работающего сервера
- утечки памяти (некоторые ресурсы будут утекать, вероятновключая функции)
- (есть ли в PHP GC для функций?)