php维护状态

Posted

技术标签:

【中文标题】php维护状态【英文标题】:php maintaining state 【发布时间】:2012-08-07 00:29:03 【问题描述】:

这将是一个新手问题,但我学习 php 的唯一目的(atm)是为了实现一个解决方案——我学到的关于 php 的一切都是在过去 18 小时内学会的。

目标是向我的 javascript get 请求添加间接性,以允许跨域访问另一个网站。我也不希望限制上述网站,并希望采取保护措施。我不能依赖他们在 javascript 中,因为这不能说明其他同行发送他们的请求。

所以现在我有以下临时代码,没有任何限制措施:

<?php

  $expires = 15;

  if(!$_GET["target"])
    exit();
  $fn = md5($_GET["target"]);
  if(!$_GET["cache"]) 
    if(!array_search($fn, scandir("cache/")) ||
      time() - filemtime($file) > $expires)
      echo file_get_contents("cache/".$fn);
    else
      echo file_get_contents(file);
  
  else if($_GET["data"]) 
    file_put_contents("cache/".$fn, $_GET["data"]);
  
?>

据我所知,它运行良好(不考虑不可能的校验和冲突)。现在我想知道的是,我在 google 中的搜索查询拒绝为我采购的是 php 的实际启动方式和结束时间。

显然,如果我运行自己的 Web 服务器,我会对此有更深入的了解:我不是,我也没有 shell 访问权限。

基本上,我想弄清楚我是否可以控制脚本何时在代码中结束,以及对 php 文件的每个“获取”请求是否会启动脚本的新实例,或者它是否可以“唤醒” ' 相同的脚本。原因是我希望跟踪它是否已经在过去 n 毫秒内向“目标”发送了请求,并且将值转储到保存文件然后一遍又一遍地恢复它似乎有点浪费不需要在内存中保存很长时间。

【问题讨论】:

【参考方案1】:

每个 HTTP 请求都会启动一个新的解释器实例;这基本上是一个实现细节,无论这是一个全新的流程,还是对现有流程的重用。

这通常会将您推向简单且可扩展的良好设计:您可以运行多个服务器进程和线程,并且您不会获得不同的行为,具体取决于请求是否返回到同一个实例。

在 Linux 上加载最近接触过的文件会非常快,因为它会直接来自缓存。不用担心。

请不要担心,通过直接将请求参数附加到路径会存在严重的安全漏洞:人们可以获得data=../../../etc/passwd 等等。阅读http://www.php.net/manual/en/security.variables.php 等等。 (在这个特定示例中,您在将输入放入路径之前对其进行哈希处理,因此这不是一个实际问题,但需要注意。)

更一般地说,如果你想在多个请求中保存一个缓存,现在典型的做法是使用memcached。

【讨论】:

谢谢。这个特定的脚本不会接受任何需要保护的参数(javascript检索的页面部分将是只读的——因此它为什么只在存在某个参数时才缓存,以便只传递检索到的部分出于缓存目的将页面返回到脚本),但我会记住它以备将来使用。【参考方案2】:

php 是基于每个连接完成的。 IE:对 php 文件的每个请求都被视为一个新实例。每个实例通常在连接关闭时结束。但是,您可以使用会话在特定用户的连接之间保存数据

对于会话的基本使用,请查看:

session_start()
$_SESSION
session_destroy()

【讨论】:

嗯,这对我来说是直截了当的回答。 :) 我想知道跨脚本维护变量的最佳方法是什么。我一直在关注 php.net 参考资料上的“序列化”内容,但冒着听起来像假的风险,我无法理解如何使用它(我看到示例将参数传递给函数并没有帮助声明的文件不接受任何参数)。有没有更清晰的教程? 查看 php.net 并记得为我点击上述答案左侧的检查:D ...我只是说 php.net 的东西没有为我回答。 the best way to maintain variables across scripts 实际上是在使用 $_SESSIONS。 $_SESSION 是一个变量 - 可以像 $_POST["var"] 一样访问 - 除了它的内容将存储在服务器端并附加到一个 php 会话 cookie 中,该 cookie 将被放入您的客户端浏览器中。 @AlexLynch 我不会说这是最好的方法。但它是最突出的。每个 session_start() 会话文件都被锁定,直到会话关闭或销毁。对于 COMET 等应用程序,这可能会导致新连接等待和超时

以上是关于php维护状态的主要内容,如果未能解决你的问题,请参考以下文章

php状态设计模式

PHP设计模式 - 状态模式

如何为 HTTPS 配置 503 状态?

php session详解

国内常见php的CMS建站系统情况分析

在由上下文 API 管理的状态旁边维护类中的状态是不是有意义?