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


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

我正在开发一个基于Laravel 5的web应用程序,我有一个类"Connection",它被实现为Singleton

<?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;
}

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

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

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

谢谢你的帮助。

如果我正确阅读了你的问题,你会问是否有可能在一个请求中打开一个连接,然后让访问该页面的其他用户使用该连接而不重新打开它。

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

在PHP中,您会发现第三方库可以实现您所说的那种持久连接。例如,oracle驱动程序(oci8)有一个连接函数和一个pconnect函数。后者实现了持久连接。这些库之所以能够做到这一点,是因为它们是用C/C++实现的——也就是说,不是纯PHP。此外,对于"持久性"的含义,每个库都有自己的规则。

当您在PHP中实现singleton时,您得到的对象将始终是该请求的singleton对象。这与java中的singleton概念相似,但由于PHP的运行时模型大不相同,因此在PHP中使用singleton的方式与在java等系统中使用singletons的方式非常不同。

希望这能有所帮助,祝你好运!

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