【问题标题】:How long do PHP static variables persist?PHP 静态变量会持续多久?
【发布时间】:2011-10-05 16:10:57
【问题描述】:

PHP 静态变量会持续多久,即“PHP 运行”会持续多久?比如说一个命令行程序有一个定义的开始和结束,但是在带有 AJAX 的 web 中我不知道如何定义它。

以下是我看到 PHP 脚本启动的 3 种方式。

  1. 用户(请求 PHP 页面)
  2. Javacript 调用 PHP (AJAX)
  3. PHP 通过 header() 调用更多 PHP

在我的实际应用程序中,我有 javascript 通过 AJAX 调用 php 脚本,该脚本使用 header() 重新加载站点。这将被视为两次不同的运行。每个都有自己不相关的静态变量。

【问题讨论】:

    标签: php class session static


    【解决方案1】:

    PHP 变量在通过解释器运行的脚本的生命周期内持续存在。在 Web 请求的情况下,这是处理请求的生命周期。您的三种情况都是对服务器的请求,因此处理方式相同:静态变量在处理请求后脚本终止之前一直存在。

    请求中 PHP(及其变量)的生命周期:

    1. 请求被发送到服务器,无论是通过用户、ajax、通过 PHP 的 curl 还是你有什么方法
    2. 相关的 PHP 脚本被执行,无论是作为 Web 服务器上的模块、CGI 工作进程还是其他选项
    3. 执行脚本,创建并发送对请求的响应(如果有)
    4. (可选)脚本继续执行其他一些作业,直到最终终止,此时它的所有变量都随之消失。

    【讨论】:

    • 所以说我的 Ajax 调用调用了 file1.php,它包括 file2.php,并创建了一个发送标头的 ojbect。这将被视为两次运行。文件 1 只包含文件 2,所以这是一次运行,但我调用 header() 来重新加载页面。这是第二次运行,header() 调用吗?它是从 run1 调用的
    • 您的 ajax 调用会生成一个执行 file1.php 的请求,包括 file2.php 的内容,该请求会发送一个标头,然后在运行 #1 结束时终止。运行#1 发送的重新加载标头生成一个新请求(针对重新加载的页面),从而启动运行#2。如果运行 #2 是对 file1.php 的另一个请求,则它与运行 #1 的 file1.php 不同!
    • 在 PHP 中包含一个文件与发出另一个 Web 请求相同。变量在includerequire 调用中保持不变,但它们不会通过curl 调用传递,除非您使用其他数据共享方法,例如数据库、Cookie 和会话。
    • @zzzzBov,您的评论是为了更精确地说明includerequire 在同一个请求中,还是我的评论不清楚?只是好奇,所以我可以衡量我的写作,谢谢。
    • 您好,根据您的上述评论,静态变量(在 PHP 脚本中)是否会在对该 PHP 脚本的多次调用中持续存在?
    【解决方案2】:

    “PHP 运行”总是从执行开始到脚本结束。因此,如果您使用 ajax 调用 PHP 脚本或 PHP 通过 header() 调用另一个 PHP,则每次调用都是一次运行。之前实例化的静态变量没有持久化状态,会被重新定义。

    无论是否是静态变量...如果您希望在这些请求中保持数据的持久状态,您必须将其保存在会话、cookie、数据库或缓存中。

    【讨论】:

      【解决方案3】:

      在命令行中定义了开始和结束。

      在服务器上运行 PHP 没有区别。当向脚本发出 Web 请求时,脚本会一直运行到脚本结束,或者直到它崩溃或超时(可能还有其他类似问题)。

      AJAX 不运行服务器端。 AJAX 是另一个客户端异步调用服务器资源。就身份验证、验证、输入检查等而言,为第一个请求所做的一切都必须在每个后续请求中完成。 AJAX 响应的不同之处在于 PHP 脚本可能只返回请求的内容

      程序“持续”的唯一情况是它被告知要继续运行。可以告诉 PHP 等待,并通过 Web 套接字执行操作,但这似乎超出了您的问题范围。

      【讨论】:

        【解决方案4】:

        这取决于服务器设置。通常,当您发出请求时,PHP 解释器被加载,解析脚本,您的服务器吐出结果并且解释器被销毁。对于每个请求都会发生这种情况,无论它来自用户浏览还是 AJAX。这意味着“静态”变量仅在解释器被销毁之前才有效,这也是在每个请求结束时。 (HTTP 是无状态的)

        “PHP 通过 header() 调用更多 PHP”是什么意思?你指的是重定向吗?在这种情况下,这是一个新请求。如果您的意思是“PHP 通过包含调用更多 PHP”,这通常不是一个新请求(边缘情况是您包含来自第 3 方的 PHP 脚本......危险且不推荐)。使用包含,PHP 只需在与原始脚本相同的上下文中加载和执行文件。

        【讨论】:

          【解决方案5】:

          PHP 静态(在程序上可以被视为“全局”)在您的任何情况下都不会持续存在。

          在它们中的每一个中都会执行一个新的 HTTP 请求,并且 Php 变量状态会丢失。

          【讨论】:

            【解决方案6】:

            三个都是一样的。

            在每种情况下,用户的浏览器都会对 url 发出 http 请求。运行时间是从服务器收到请求到请求完成为止。

            【讨论】:

              【解决方案7】:

              PHP 脚本在您退出、到达脚本末尾或失败时停止。

              【讨论】:

                猜你喜欢
                • 2014-05-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-07-28
                • 2012-12-07
                • 2021-05-19
                • 1970-01-01
                相关资源
                最近更新 更多