这将是一个新手问题,但我学习 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 文件的每个“get”请求是否都会启动脚本的新实例,或者它是否可以“唤醒” '同样的脚本。原因是我希望跟踪它是否已经在最后 n 毫秒内向“目标”发送了请求,并且将值转储到保存文件然后一遍又一遍地恢复它似乎有点浪费不需要在内存中保存很长时间。
最佳答案
每个 HTTP 请求都会启动一个新的解释器实例;它基本上是一个实现细节,无论这是一个全新的流程,还是现有流程的重用。
这通常会插入您走向良好的简单且可扩展的设计:您可以运行多个服务器进程和线程,并且不会根据请求是否返回到同一实例而获得不同的行为。
在 Linux 上加载最近访问的文件会非常快,因为它直接来自缓存。别担心。
请担心,通过直接将请求参数附加到路径中,您会遇到严重的安全漏洞:人们可以获取 data=../../../etc/passwd
等等在。阅读 http://www.php.net/manual/en/security.variables.php等等。 (在这个特定的示例中,您在将输入放入路径之前对输入进行哈希处理,因此这不是一个实际问题,但需要注意。)
更一般地说,如果您想跨多个请求保存缓存,现在典型的做法是使用 memcached .
关于php 维护状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11837772/