如何为我站点的所有传入连接在 PHP(Laravel 5) 中保留 class 的单个实例?

How to Keep a Single Instance of class in PHP(Laravel 5) for all the incoming connections to my site?

我正在开发基于 Laravel 5 的 Web 应用程序,我有一个 class "Connection" 作为单例实现的

<?php

class Connection{

private static $instance = NULL;
private static $connection = NULL;

private function __construct(){
    self::connection=API::openConnection(); //just an example of connection (from other class) 
}

public function getInstance(){


    if(NULL==self::$instance)
    {
        self::$instance=new Connection;
    }  

    return self::$instance;

}

现在我面临的问题是,每当连接获取实例并首次实例化它并打开连接时,但是当其他用户访问同一页面(较早的用户访问过)时,连接将重新打开(即 class 再次实例化),openConnection() 一次只能提供一个连接,当新用户打开连接时,前一个关闭。

有什么解决方案可以让我对多个用户请求使用单一连接吗?

注意:- 以上代码只是对实际问题的抽象,以获得一个想法。

感谢您的帮助。

如果我没看错您的问题,您是在询问是否可以根据一个请求打开一个连接,然后让访问该页面的其他用户使用该连接而无需重新打开它。

从纯粹的 PHP 层面上,您的问题的答案是否定的。 PHP 被设计成一个无状态的系统。进入系统的每个请求都会强制程序建立其状态,然后该状态会在每次连接结束时丢失。这符合当时所有模仿 HTTP 的系统设计风格。您所描述的模式在桌面或服务器计算编程环境中更为常见,在这些环境中,应用程序驻留在内存中。

您将在 PHP 中找到的是启用您正在谈论的那种持久连接的第三方库。例如,oracle 驱动程序 (oci8) 有一个 connect function , and a pconnect function。后者实现了持久连接。这些库可以做到这一点,因为它们是在 C/C++ 中实现的——即,不是纯粹的 PHP。此外,每个图书馆对于 "persistent" 的含义都有自己的规则。

当您在 PHP 中实现单例时,您得到的对象将始终是该单例对象 仅针对该请求 。它与 java 中的单例概念相似,但由于 PHP 的 运行 时间模型大不相同,您最终在 PHP 中使用单例的方式与您完全不同会在 java.

这样的系统中

希望对您有所帮助,祝您好运!

您不能在两个不同的请求之间共享连接。 PHP 脚本被解释,然后当它到达文件末尾时,返回响应并释放资源(包括指向数据库连接的指针)。