【问题标题】:PHP static variables across multiple .php pages跨多个 .php 页面的 PHP 静态变量
【发布时间】:2010-10-10 17:17:54
【问题描述】:

我正在用 PHP 构建一个 POP3 邮箱。 我有以下文件

  • server_access.php(从 POP3 服务器获取邮件)
  • data_access.php(获取/写入邮件到本地数据库)
  • mime_parser.php(解析 MIME 内容)
  • core.php(使用上述文件并将解析的邮件存储为名为 $inbox 的 assoc 数组)

现在,我有 pages 邮箱.php 来显示收件箱和 showmail.php 来显示每封邮件。用户的凭据存储在 .ini 文件中并在必要时使用。问题是,我在mailbox.php和showmail.php中都做了一个require_once('core.php')

我可以显示收件箱(即 $inbox 有值),但是,如果我选择阅读邮件(showmail.php 的弹出窗口),$inbox 是一个空数组。

$inbox 在 core.php 中定义为静态数组

【问题讨论】:

  • 请注意,require_once 是一种语言结构而非函数,因此不需要括号。

标签: php static-variables


【解决方案1】:

php Sessions 需要一个地方来存储请求之间的会话数据。在您的情况下,它是您主目录中的 temp\php\session\ 文件夹。创建该文件夹或更改 php.ini 中的 session.save_path 以指向有效目录。

【讨论】:

    【解决方案2】:

    静态数据仅在类的上下文中是静态的,这意味着类中的静态数据成员由该类的所有实例共享。

    您似乎在谈论的是跨多个 HTTP 请求持续存在的数据。静态数据不会为您做到这一点。这就是 $_SESSION 数据的用途。

    换句话说:一旦脚本完成了当前请求的服务,它就会完全死掉。所有数据已被完全清理。新请求重新开始。

    会话数据一直存在,直到 PHP 决定清理它或您手动销毁它。通常,使用会话数据所需要做的一切都放在脚本中:

    脚本 1:mailbox.php

    session_start();
    $_SESSION['mailbox'] = array( /* messages */ );
    

    脚本 2:showmail.php

    session_start();
    $mailbox = $_SESSION['mailbox'];
    

    需要注意的一点:如果您的脚本长时间运行,请尽快尝试放入 session_commit(),因为 PHP 中的会话访问会阻塞,这意味着如果另一个脚本尝试为同一用户执行 session_start(),它将阻塞直到第一个脚本完成执行或释放会话。

    【讨论】:

    • 我只为一个(本地)用户做这个应用程序。可以改用 $_SERVER 吗?
    • $_SERVER 不起作用(afaik)。它会自动创建并填充来自请求的数据(服务器名称等),而不是像 $_SESSION 那样持久化。
    • 嘿,在这种情况下,我应该将 session_close() 放在脚本的哪个位置?或者,我应该避免完全关闭脚本中的会话吗? Cos,如果我这样做了,那么不会每次都关闭会话,并且我将无法跨多个请求持久化变量,对吗?
    【解决方案3】:

    如果您的core 文件向mailbox.php 提供了正确的数据,但没有向showmail.php 提供正确的数据,则它与您在showmail.php 中正在(或未)执行的操作有关。

    【讨论】:

    • 在mailbox.php 中,我调用core.php 中的一个函数,该函数从DB 中获取邮件并将其放入$inbox。在 showmail.php 中,我假设 $inbox 已经包含数据。我不想再次访问数据库来获取一封邮件。
    • 那么 Cletus 可能是对的,您可能忽略了使用会话的需要。你需要另一个数据库调用(如果你做得对,这可能不会太贵)。让您的软件工作,然后担心减少数据库调用的数量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2015-12-30
    相关资源
    最近更新 更多