php维护状态


php maintaining state

这将是一个新手问题,但我学习php的唯一目的是实现一个解决方案——我所学到的关于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"]);
  }
?>

据我所知,它运行得很好(没有考虑到不太可能的校验和冲突)。现在我想知道的是,我在谷歌上的搜索查询拒绝为我获取的是php实际上是如何启动以及何时结束的。

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

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

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

这通常会促使您采用简单且可扩展的设计:您可以运行多个服务器进程和线程,并且不会根据请求是否返回到同一实例而获得不同的行为。

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

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

更普遍地说,如果您想在多个请求之间保持缓存,那么现在的典型做法就是使用memcached。

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

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

session_start()
$_SESSION
session_destroy()