控制使用某些参数加载php类的次数

控制使用某些参数加载php类的次数,php,Php,我有一个php类,它通过ssh连接到某些设备。 我想添加逻辑来控制每个设备的连接数。 这就是我的类构造函数的外观: public function __construct($hostname, $password, $username = "", $timeout = 10) { set_include_path(get_include_path() . PATH_SEPARATOR . '/var/www/phpseclib'); include_on

我有一个php类,它通过ssh连接到某些设备。 我想添加逻辑来控制每个设备的连接数。 这就是我的类构造函数的外观:

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
我读过其他一些帖子,比如:

我想我只想确认以下几点:

  • 我认为数据库会比文件更好,因为在这种情况下,多个会话试图写入/更新类计数器
  • 类构造函数和析构函数是添加此类逻辑的最佳/唯一位置 唯一的问题是,目前,我没有一个与我的应用程序相关联的数据库,所以我讨厌添加这种“依赖关系”,但这似乎是最好的方法。如果您有任何意见/建议,请告诉我

    谢谢

    编辑1:

    在我的构造器中添加逻辑的另一个问题是。。。 假设我有以下逻辑(伪代码)

    public function\u构造($hostname)
    {
    如果(!确定连接($hostname))
    {
    出口
    }
    }
    公用功能正常连接($hostname)
    {
    $filelist=glob($counterslocation.$hostname.'*.tmp');
    如果(计数($filelist)<4){
    $handle=fopen($counterslocation.$hostname.rand(1,4)。“.tmp”,“r”);
    返回true;
    }       
    否则{
    返回false;
    }
    }
    
    在我已经有4个活动连接的情况下,在构造函数中调用exit()是否仍然会引发析构函数?这意味着析构函数将尝试删除其中一个临时文件,即使ok_to_connect()函数实际上没有创建文件。我想我可以让ok_to_connect()方法在类中设置一个公共变量,并让析构函数在删除任何文件之前检查这一点。
    这是最好的方法吗?

    我在这里看到了两种解决方案

    1-使用内存缓存(如APC)。当然,如果服务器重新启动,您将失去计数器,但您可能也会失去ssh连接。 要使用APC处理并发问题,您可以查看

    2-使用数据库: php中包含的一个非常轻的数据库,如sqlite,将提供与内存解决方案相反的计数器持久性

    数据库解决方案更健壮,但速度较慢。在重新启动的情况下,由于持久性,您还需要清理所有计数器


    你只需要知道你的数据有多重要就可以选择好的解决方案。

    你可以

    • \u construct
      上,在公共目录中创建一个文件
    • 然后在
      \u destruct
      上删除该文件

    这样,您就不会有同步写入操作的问题。文件总数将显示打开的连接数。

    1。)对于每个连接,您可以在公共目录中创建一个带有随机文件名的文件。这样,您就不会有写/更新问题。当然,如果你有大量的联系,这可能会有问题;这不应该被移动,因为这不是具体问题。这是一个观察者可以很好解决的问题吗?@yoshi,如果我使用随机文件名创建,我如何跟踪我有多少个连接?对不起,你能澄清一下吗?谢谢。@dot只需计算目录中的文件数即可。。)当然,
    \uu destruct
    需要删除与该特定连接关联的文件。@dot我个人会将
    确定\u连接
    分为两种方法。作为一个方法/函数,它应该只做一件事。当前的一个正在做两个。检查连接是否正常,如果正常,创建tmp文件。我认为您应该有第二个方法
    create\u connection\u file
    ,您可以从构造函数调用它,以防
    ok\u to\u connect
    返回true。
      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;
        }
       }
    
    if(!apc_exists($this->_hostname)) {
        apc_store($this->_hostname,1);
    } else {
        apc_inc($this->_hostname);
    }