1

ssh経由で特定のデバイスに接続するphpクラスがあります。デバイスごとの接続数を制御するロジックを追加したいと思います。これは私のクラスコンストラクターがどのように見えるかです:

public function __construct($hostname, $password, $username = "", $timeout = 10) 
    {
        set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/phpseclib');
        include_once('Net/SSH2.php');
        $this->_hostname = $hostname;
        $this->_password = $password;
        $this->_username = $username;

    } // __construct

私は次のような他のいくつかの投稿を読みました:phpでアプリケーションレベルで変数を保存する方法は?

そして、私は次のことを確認したいと思います:

  1. 複数のセッションがクラスカウンターを書き込んだり更新したりしようとしているシナリオがあるため、データベースはファイルよりも優れていると思います。
  2. クラスcontructorとdestructorsは、このタイプのロジックを追加するのに最適な/唯一の場所です。

唯一のことは、現在、アプリに関連付けられたデータベースがないことです。そのため、この「依存関係」を追加するのは嫌いですが、それが最善の方法のようです。コメント/提案があれば、私に知らせてください。

ありがとう。

編集1:

コンストラクターにロジックを追加する際のもう1つの質問は、次のとおりです...次のロジック(擬似コード)があると仮定します。

  public function __construct($hostname) 
  {
     if (!  ok_to_connect($hostname)  )
     {
         exit;
     }
  }

  public function ok_to_connect($hostname)
  {
    $filelist = glob($counterslocation.$hostname.'*.tmp');

    if ( count($filelist)  < 4) {
        $handle = fopen($counterslocation.$hostname.rand(1,4).".tmp", "r");
        return true;
    }       
    else {
        return false;
    }
   }

すでに4つのアクティブな接続がある場合でも、コンストラクターでexit()を呼び出すと、デストラクタが呼び出されませんか?これは、ok_to_connect()関数が実際にファイルを作成しなかった場合でも、デストラクタが一時ファイルの1つを削除しようとすることを意味します。ok_to_connect()メソッドにクラスのパブリック変数を設定させ、ファイルを削除する前にデストラクタにこれをチェックさせることができると思います。これが最善の方法ですか?

4

2 に答える 2

1

ここに2つの解決策があります。

1- APC のようなメモリ内キャッシュを使用します。もちろん、サーバーを再起動するとカウンターが失われますが、おそらく ssh 接続も失われるでしょう。APC での同時実行の問題に対処するには、この質問をご覧ください。

if(!apc_exists($this->_hostname)) {
    apc_store($this->_hostname,1);
} else {
    apc_inc($this->_hostname);
}

2- データベースの使用: php に含まれる sqlite のような非常に軽いデータベースは、インメモリ ソリューションとは対照的に、カウンターに永続性を提供します。

データベース ソリューションはより堅牢ですが、低速です。再起動の場合、永続性のためにすべてのカウンターを消去する必要もあります。

良い解決策を選択するには、データがどれほど批判的であるかを知る必要があります。

于 2013-01-14T15:45:59.843 に答える
1

単一のファイルにカウントを保持する代わりに、次のことができます。

  • __construct共通ディレクトリにファイルを作成するとき、
  • そして__destructそのファイルを削除します。

これにより、同時書き込み操作で問題が発生することはありません。ファイルの総数は、開いている接続の数を示します。

于 2013-01-14T16:57:09.177 に答える