如何创建一个只有一次并被所有用户使用的PHP类

时间:2015-03-18 05:46:38

标签: php sockets

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

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

例如,

/*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。

3 个答案:

答案 0 :(得分:0)

您需要将属性设置为静态(不需要实例化以保存值)。

class socket_class {
    private static $socket;

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

请注意,根据上面的代码,您需要使用self伪变量;不是$this

答案 1 :(得分:0)

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

要绕过此问题,您需要运行一个' 守护程序'这是一个在服务器端继续运行的php进程。

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

从运行在apache(端口80)上的主网站,您可以通过以下网址从javascript,html等调用此守护程序

http://yoursite.com:6789/

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

答案 2 :(得分:0)

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

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