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. 类构造函数和析构函数是添加此类逻辑的最佳/唯一位置。

唯一的问题是,目前,我没有与我的应用程序关联的数据库 - 所以我讨厌添加这种“依赖项”,但这似乎是最好的方法。如果您有任何意见/建议,请告诉我。

谢谢。

编辑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() 函数实际上并未创建文件。我想我可以让 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 回答