12

我是 php 新手,但在其他 Web 技术中,您可以在页面实例之间共享对象。例如,在 java jsp 页面中,您很容易拥有作为整个服务器实例的静态类存在的类。如何在php中做到这一点?

我不是指会话变量(至少我不这么认为)。这更多是出于资源池的目的(可能是要共享的套接字,或数据库连接等)。所以需要在后续加载之间共享整个类,而不仅仅是我可以存储在会话中的一些原始变量。

我也研究过做 php 单例类,但我相信该类只在同一页面内共享,而不是跨页面共享。

为了让事情更清楚,我正在寻找可以帮助我共享连接到服务器的连接到 connectSocket.php 页面的套接字的东西,这样加载该页面的所有用户都使用相同的套接字并且不打开新的一个。

4

5 回答 5

15

这是一个有点困难的答案,可能不是您正在寻找的。

PHP 建立在“无共享”架构之上。如果您在应用程序中需要某种类型的状态,则必须通过其他方式执行此操作。

首先,我建议您研究问题的核心。您真的需要它吗?如果您假设 PHP 应用程序可能会死掉(并丢失状态),是否可以丢失数据?

如果您必须维护状态,即使在应用程序死亡或其他情况下,您也应该假设放置数据的最佳位置可能是 MySQL。PHP 旨在作为您业务逻辑的薄层,因此我强烈推荐它。

如果您不关心重新启动后丢失数据,那么您正在寻找的问题域可能是缓存。我建议查看memcached,或者如果您在单台机器上,apc。APC 肯定会在单台机器上与 Apache 一起为您工作,但您仍然必须为您的应用程序编写代码,假设您可能会丢失数据。

如果您担心底层数据存储 (MySQL) 太慢,但重启后仍需要维护数据,您应该研究这两个系统的组合。您始终可以从缓存中推送和拉取数据,但只有在更新时才将其发送到 Mysql。

如果数据纯粹是用户或会话绑定的,您可能只想查看会话系统。

我个人开发了一个相当大的多租户应用程序,虽然它是一个相当复杂的应用程序,但我从来不需要你正在寻找的真实状态。

更新:抱歉,我没有阅读您关于共享套接字的说明。您将需要一个单独的守护程序来处理此问题,也许如果您可以进一步解释您的问题,可能还有其他方法。这是什么类型的插座?

于 2009-05-25T21:46:22.100 回答
13

网络服务的 Java 和网络服务的解释性语言(如 PHP 和 Perl)之间存在根本区别。在 Java 中,您的 Web 服务器将拥有一个维护状态的操作环境(即 Tomcat)。对于解释型语言,对您的 Web 服务器的请求通常会产生一个新的 Web 服务器线程,进而为该线程加载一个新的操作环境,在本例中为 PHP 环境。

因此,在 PHP 中,没有页面实例的概念。对 Web 服务器的每个请求都是一个新的开始。所有的类都是重新加载的,所以没有类共享的概念,也没有资源池的概念,除非是外部实现。

因此,在 Web 请求之间共享套接字实际上是不可能的。

于 2009-05-25T21:56:28.337 回答
3

这可能是部分答案,但您可以将类的实例保存到 Session 变量中并在其他时间访问它。

于 2009-05-25T21:55:27.217 回答
1

大多数 PHP 数据库库已经使用连接池。例如,您调用 pg_connect 就好像您正在请求一个新连接,但如果连接字符串与已经存在的连接相同,您将取回已建立的连接。如果您只关心数据库访问池,那么您只需确认它存在于您正在使用的 db 库中。

于 2009-05-25T21:54:42.240 回答
0

另一个可怕的解决方案可能是将对象的数据加载到任何 $_SESSION 变量中,然后将其返回到另一个页面的对象中。事实上,这是我将在我的项目中遵循的解决方案,直到我得到更好的解决方案。

问候!

于 2010-04-14T16:33:02.937 回答