6

PHPSockets を使用するマルチプレイヤー サーバーを使用しているため、完全に PHP で記述されています。

現在、PHP サーバー スクリプトに変更を加えるたびに、スクリプトを強制終了してから、最初からやり直す必要があります。これは、オンラインのユーザーが切断されていることを意味します (現時点ではそれほど多くないため、通常は問題ありません)。

今、私はサーバー スクリプトを書き直してカスタム PHP クラスを使用し、物事を少し整理しています (今日の見栄えが悪いことは知りたくありません)。今日、私は考えていました:「スクリプト全体を再起動することなく、php ソースに変更を加えることは可能ではないでしょうか?」.

たとえば、 classを含むファイルと classmain.phpを含むファイルを作成する予定です。ここで、オンライン ユーザーを切断せずに変更を有効にするために、サーバーに変更を加えて "リロード" したいとしましょう。user.phpMyUsergame.phpMyGameuser.phpuser.php

これに答えた他の質問を見つけようとしましたが、最も近いのは次の質問です:実行中のスクリプトを変更し、それを強制終了せずにリロードする (php)、ただし、オンラインユーザーの切断は解決しないようです。

アップデート

これに対する私自身の解決策は次のとおりです。

  1. 特別な場合には、external.php ファイルをインクルードします。このファイルは、いくつかの変数にアクセスして、好きなように使用できます。これを行うとき、存在しないメソッドにアクセスしようとするとサーバー全体がクラッシュするため、コードにエラーがないことを確認する必要がありました。
  2. すべてを Javaに書き直しました。これにより、動的なクラスの再読み込みを使用してプラグイン システムを追加できるようになりました。魅力のように機能します。さよならPHP。
4

7 に答える 7

8

スクリプト全体を再起動しなくても、php ソースを変更できるはずではありませんか?

[...]

クラス MyUser を含む user.php を含む main.php ファイルを作成する予定です

あなたの場合、できません。クラスは、実行中のスクリプト内で 1 回だけ定義できます。これらのクラスを再定義するには、スクリプトを再起動する必要があります。

于 2012-06-05T20:54:19.060 に答える
2

私はPHPにあまり精通していませんが、スクリプトを実行するプロセスが作成されていると思います。そうすることで、プログラムの実行に必要な命令がコピーされ、CPUで実行が開始されます。この間、「更新」する必要があります。手順では、プロセスを最終的に強制終了して再起動する必要があります。インクルードは、クラスとファイルをリンクするための優れた方法ですが、最終的には、プロセッサはそれらのファイルが保存されている場所とは別の情報を持ち、プロセスを再開するまでは最終的に異なります。

コードを作成して積極的に編集し、そのコードの実行中に変更を確認できるシステムを私は知りません。ほとんどのアクティブなプログラムは、新しいソースコードをリロードするために再起動する必要があります。

于 2012-06-05T20:55:36.417 に答える
2

Runkitを使用すると、実行時に (とりわけ) メソッドを追加、削除、および再定義できます。クラスまたはその既存のインスタンスの定義済みプロパティを変更することはできませんが、それらのオブジェクトの動作を変更することはできます。

これを永続的な解決策としてはお勧めしませんが、開発中に役立つ場合があります。最終的には、ゲームの状態をファイル、データベース、 Memcacheなどに保存する必要があります。

于 2012-06-05T21:04:06.477 に答える
0

メイン スクリプトがキャッシュからロードされ、新しいオペコードを頻繁にチェックしている間に、ユーザー オブジェクトをAPCキャッシュに保存するのはどうでしょうか。

関数をキャッシュに含めるには、 SuperClosure Classを含める必要があります。例は次のとおりです。

if (!apc_exists('area')) {
  // simple closure
  // calculates area given length and width
  $area = new SuperClosure(
    function($length, $width) {
      return $length * $width;
    }
  );
  apc_store('area', $area);
  echo 'Added closure to cache.';
} else {
  $func = apc_fetch('area');
  echo 'Retrieved closure from cache. ';
  echo 'The area of a 6x5 polygon is: ' . $func(6,5);
}

APC のチュートリアルについては、こちらを参照してください

于 2012-06-05T21:18:56.190 に答える
0

include同じ を使用してファイルを再度作成することはできませんclassが、array. 本当に必要な場合は、からarrayに変換することもできます。classただし、これはデータにのみ適用され、動作 (メソッド) には適用されません。

于 2012-06-05T21:07:45.407 に答える
-1

私は PC 上のゲームでこれらのことについてあまり知りませんが、ユーザーのためにデータベースからすべての変数を取得し、それらの変数を使用してテキスト フィールドまたはボタンを更新することができます。

ウェブではAJAX(ページを更新せずにデータを変更)を使用しています。プログラミング用のものではありませんか?

于 2012-06-05T20:57:08.747 に答える