如何创建一个只初始化一次并供所有用户使用的PHP类


How to create a PHP class which only inits once and is used by all users

我编码了一个类,它处理socket_create、socket_connect并返回套接字的文件描述符。我想知道如何使这个文件描述符始终可用。

该类实例化后,所有会话都使用相同的实例(套接字的文件描述符)来发送和接收数据。此套接字连接不会自动关闭。

例如,

/*socket_class.php*/
class socket_class {
    private $socket;
    public function getSocket() {
        /*do socket_create and socket_connect*/
        return this->$socket;
    }
}
$socket_instance = new socket_class();
/*socket_user.php*/
require_once("socket_class.php");
$socket_file_descriptor = $socket_instance->getSocket();
/*Send and Recv data*/

我只希望所有会话都使用相同的$socket_instance。

您需要使属性为静态的(不需要实例化即可保存值)。

class socket_class {
    private static $socket;
    public function getSocket() {
        /*do socket_create and socket_connect*/
        return self::$socket;
    }
}

注意,根据上面的代码,您确实需要使用self伪变量;而不是CCD_ 2。

当web用户在apache上打开php页面时,每个调用都会启动一个独立于其他用户的单独进程。这意味着基于浏览器的调用将分别运行,每个会话都创建自己的类实例。

要绕过这一点,您需要运行一个"守护进程",这是一个在服务器端持续运行的php进程。

此链接提供了创建基于套接字的守护进程的示例过程。这个守护程序将在同一服务器上的不同端口上独立于其他代码运行。

从运行在apache上的主网站(端口80),您可以在以下url 中用html等从javascript调用这个守护进程

http://yoursite.com:6789/

其中6789是您在套接字服务器中使用的端口

<?php
class socket_class {
	private static $socket;
	public function getSocket() {
		return self::$socket;
	}
}
$obj_socket = new socket_class();
$obj_socket->getSocket();
?>

在您的代码中,公共函数getSocket()返回this->$socket;被return self::$socket替换;因为$socket是一个静态变量,所以不能使用$this调用它。