2011-08-11 6 views
2

で、実行時にクラスをリロード私はPHPのIRCボットが実行されている間、私はコードベースの変更として、モジュールをリロードすることができ、実行時のように「事実」、私のクラスを再宣言できるようにする必要があり、そのクラスを取得する必要がありますが、PHPは、それが再宣言することができません、またクラスの宣言を解除する方法があります。再宣言の変数、または、事実PHP

私はこれをacheiveすることができます方法はありますか?おそらくいくつかの他の方法?私は "runkit"を試しましたが、失敗しました。

私の現在のコードはここにある: http://pastie.org/private/ptj7c0t0teh3nnzn7ehcg

ので明確にするために、私はeffecivly、私のクラスをリロードすることができ、それをinstatiateとコードがで変更されていたら、私のメインのボットクラスのプロパティに置く必要があるモジュールを言いました、ボットは実行中(実行時)です。

+1

基本クラスを作成してから、「MyClassV123 extends MyBase」のようにするのはどうですか?そうすれば、常に新しいバージョンを読み込むことができます。あなたは、多くの場合、それを行う場合はもちろん、これはメモリリークが発生しますが、その後、私はPHPはとにかく長いランタイムのための完璧ではないと言うでしょう。 – Chronial

答えて

0

アプリケーションを簡単に見には、アクションのあなたの最高のコースでは、上記のコメントで示唆されているように、基本クラスを使用することであると信じて私をリードしています。範囲に

何か:

class IRCModule { 

    private static $module_dir = ''; //put your module directory here w/o trailing slash 

    public static function getModule($module) { 

     //if the module directory doesn't exist, don't do anything 
     if(!is_dir(self::$module_dir.DIRECTORY_SEPARATOR.$module)) return false; 

     //load the module file 
     $fname = scandir(self::$module_dir.DIRECTORY_SEPARATOR.$module); 
     $fname = $fname[2]; //first 2 elements will be . and .. 

     require_once(self::$module_dir.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$fname); 

     $className = str_replace('.class.php',NULL,$fname); 

     return new $className(); 

    } 

} 

は、次に、あなたのモジュールを使用していることを延長します。それはあなたが単に古いファイル/my/module/dir/moduleName/moduleNameV1.0.class.phpだ削除して新しいバージョン/my/module/dir/moduleName/moduleNameV1.1でそれを置き換えることにより、モジュールを上書きすることができるようになります。 class.php

コメントに記載されているように、これは最終的にサーバー上のメモリを満たすので、大幅に変更するたびにサービスの再起動をスケジュールする必要がありますが、要求に応じて新しいバージョンを読み込むこともできますサービスを停止することなく。

より安定したアプローチは、親スクリプトからの接続ごとにプロセス制御とデーモンをスピンオフすること、またはディスク/データベースのすべてのデータを格納するキャッシュシステムを実装することです。モジュールのバージョンを確認し、すぐにサーバーを再起動します。しかし、上記の解決策は当分あなたのために働くはずです:)

関連する問題