有没有一种方法可以在PHP页面之间共享对象?

12

我对php还很陌生,但在其他Web技术中,可以在页面之间共享对象。例如,在Java JSP页面中,您可以轻松地拥有一个存在于整个服务器实例中的静态类。在php中如何做到这一点?

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

我也尝试过使用php单例模式类,但我认为该类仅在同一页内共享,而不跨页共享。

更具体地说,我正在寻找一种方法,可帮助我共享一些东西(比如连接到connectSocket.php页面的套接字),以使所有加载该页面的用户都使用相同的套接字,并且不打开新的套接字。

5个回答

15
这是一个有点困难的答案,可能不完全符合你的要求。
PHP建立在“无共享”架构之上。如果你需要在应用程序中保持某种状态,你必须通过其他方式实现。
首先,我建议你深入了解问题的核心...你真的需要吗?如果你假设PHP应用程序可能会崩溃(丢失状态),那么丢失数据是否可以接受?
如果你必须在应用程序崩溃或其他情况下保持状态,那么你应该假设最好的地方是将数据放在MySQL中。PHP旨在作为你的业务逻辑周围的薄层,所以我强烈推荐这样做。
如果你不在意重启后丢失数据,那么你可能需要考虑的是缓存问题。我建议你研究一下memcached,或者如果你在单台机器上,可以考虑apc。APC在单台机器上与Apache一起使用肯定可以解决你的问题,但你仍然需要编写应用程序时考虑到可能会丢失数据。
如果您担心底层数据存储(MySQL)速度太慢,但仍然需要在重新启动后保留数据,您应该考虑使用这两个系统的组合。您可以随时从缓存中推送和拉取数据,但只有在更新时才将其发送到MySQL。
如果数据纯粹是用户或会话相关的,您可能只需要考虑会话系统。
我个人开发过一个相当复杂的多租户应用程序,尽管它是一个相当复杂的应用程序,但我从来没有需要您所寻找的真实状态。
更新:抱歉,我没有阅读到您关于共享套接字的说明。您将需要一个单独的守护进程来处理此问题,也许如果您能进一步解释您的问题,可能会有其他方法。这是什么类型的套接字?

13

Web服务的Java与PHP、Perl等解释性语言在本质上存在基本差别。在Java中,您的Web服务器将拥有一个维护状态的操作环境(例如Tomcat),而在解释性语言中,对Web服务器的请求通常会生成一个新的Web服务器线程,该线程会载入一个新的操作环境,比如PHP环境。

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

因此,在Web请求之间共享套接字并不是真正可行的。


不是这样的,那么 memcache 呢? - Pacerier

3

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


1

大多数PHP数据库库已经使用连接池。例如,您可以调用pg_connect来请求新连接,但如果连接字符串与已存在的连接相同,则会返回已建立的连接。如果您只关心数据库访问的连接池,则可以确认它是否存在于您正在使用的db库中。


1
虽然你的答案是正确的,但通常不建议使用这些持久连接。创建新连接通常非常便宜,这意味着您不必长时间保留所有连接。作为一条规则,我只在进行第一个查询时连接到数据库,并尽快将其删除。数据库很难扩展,而PHP则容易得多。 - Evert

0

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

敬礼!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接