这将是一个新手问题,但我学习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()