php维护状态

时间:2012-08-07 00:29:03

标签: php javascript get state persistent

这将是一个新手问题,但我正在学习php的唯一目的(atm)来实现一个解决方案 - 我在过去的18个小时内学到了所有关于php的知识。

目标是在我的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毫秒内发送了一个“目标”请求,将值转储到保存文件然后一遍又一遍地恢复它似乎有点浪费这不需要长时间保存在记忆中。

2 个答案:

答案 0 :(得分:2)

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

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

session_start()
$_SESSION
session_destroy()

答案 1 :(得分:2)

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

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

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

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

更一般地说,如果你想在多个请求中保留缓存,那么现在典型的事情就是使用memcached