0

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

4

2 回答 2

2

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

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

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

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

更一般地说,如果您想跨多个请求保存缓存,那么这些天的典型做法是使用memcached

于 2012-08-07T00:36:11.977 回答
2

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

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

session_start()
$_SESSION
session_destroy()
于 2012-08-07T00:30:38.923 回答