PHP静态变量持续多长时间?

17

PHP静态变量持续的时间是多久,即一个“PHP运行”持续的时间有多长?例如,对于命令行程序,有一个定义好的开始和结束时间,但在使用AJAX的Web中,我不知道如何定义它。

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

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

在我的实际应用程序中,我让Javascript通过AJAX调用PHP脚本,并使用header()重新加载网站。这将被视为两个不同的运行。每个运行都有自己的静态变量,它们没有关联。

7个回答

24

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

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

  1. 通过用户、Ajax、通过PHP的curl或其他途径向服务器发送请求
  2. 执行相关的PHP脚本,无论是作为Web服务器上的模块、CGI工作进程还是其他选项
  3. 脚本被执行,响应请求(如果有的话)被创建并发送
  4. (可选)脚本继续执行某些其他作业,直到最终终止,在此时所有变量都将随之死亡。

所以说,我的Ajax调用调用了file1.php,它包括file2.php,并实例化一个发送标头的对象。这将被视为两次运行。文件1仅包括File2,因此这是一次运行,但我调用header()重新加载页面。这是第二次运行吗?它是从run1调用的。 - user656925
您的 AJAX 调用生成一个请求,执行 file1.php,包括 file2.php 的内容,该文件发送了一个标头表示运行 #1 结束。由运行 #1 发送的重新加载标头生成了一个新的请求(为重新加载的页面),因此启动了运行 #2。如果运行 #2 再次请求 file1.php,则它不是与运行 #1 相同的 file1.php 运行! - shelhamer
在 PHP 中包含文件 不等于 发起另一个网络请求。变量将跨 includerequire 调用保留,但是它们不会通过 curl 调用传递,除非您使用其他数据共享方法,例如数据库、Cookies 和 Sessions。 - zzzzBov
@zzzzBov,你的评论是为了更加明确地说明includerequire在同一个请求中,还是我的评论不够清晰?只是好奇想要衡量一下我的写作水平,谢谢。 - shelhamer
1
您好,根据您上面的评论,PHP脚本中的静态变量是否会在多次调用该PHP脚本时保留? - Rahul Patwa

4

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

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


3

PHP中的静态变量(在过程式编程中可视为“全局”)在任何情况下都不会持久存在。

在每种情况下,都会执行新的HTTP请求并且PHP变量状态会丢失。


3
这取决于服务器设置。通常,当您发出请求时,PHP解释器会被加载,解析脚本,您的服务器会输出结果并销毁解释器。无论请求是来自用户浏览还是AJAX,这都会发生。这意味着“静态”变量仅在解释器被销毁之前有效,而这在每个请求结束时都会发生。(HTTP是无状态的)
您所说的“通过header()调用更多PHP”,是指重定向吗?在这种情况下,这是一个新请求。如果您指的是“通过include调用更多PHP”,通常不是一个新请求(边缘情况是您正在从第三方包含PHP脚本..这是危险的,不建议这样做)。使用include时,PHP只是在与原始脚本相同的上下文中加载和执行文件。

2
在命令行中有一个定义的开始和结束。PHP在服务器上运行时没有区别。当向脚本发出Web请求时,脚本会一直运行到脚本的结尾,或者直到它崩溃或超时(可能还有其他类似的问题)。AJAX不在服务器端运行。AJAX是对服务器资源的另一个客户端异步调用。每个后续请求都必须执行与第一个请求相同的身份验证、验证、输入检查等操作。 AJAX响应的区别在于PHP脚本可能仅返回请求的内容。只有在程序被告知继续运行时,才会“持久化”。PHP可以被告知等待,并通过Web套接字执行操作,但这似乎超出了您的问题范围。

1

这三个是相同的。

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


1

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


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