1

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

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

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

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

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

4

3 回答 3

10

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

您似乎在谈论的是跨多个 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(),它将一直阻塞到第一个脚本完成执行或释放会话。

于 2009-03-02T05:01:43.743 回答
2

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

于 2009-03-02T07:21:41.083 回答
0

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

于 2009-03-02T05:05:01.207 回答