Php 存在性检查和获取一次性URL的内容
我知道有足够的方法在抛出你通常的Php 存在性检查和获取一次性URL的内容,php,Php,我知道有足够的方法在抛出你通常的文件\u get\u内容之前检查URL的存在,但有一个问题。所有的人都试图请求文件,我什么也得不到,除了真假 当处理只能调用一次的URL时(例如,如果它们有一个只能使用一次的授权令牌以避免重复攻击),那么我无法真正检查文件是否存在,并再次请求获取实际输出 因此,本质上我需要一种调用URL的方法,如果它返回某种可用的URL,那么就给我输出,如果没有,就不要给我错误,只返回false。通常,您可以执行HTTP头请求,获取头的预览 $fd = @ fopen('url'
文件\u get\u内容之前检查URL的存在,但有一个问题。所有的人都试图请求文件,我什么也得不到,除了真假
当处理只能调用一次的URL时(例如,如果它们有一个只能使用一次的授权令牌以避免重复攻击),那么我无法真正检查文件是否存在,并再次请求获取实际输出
因此,本质上我需要一种调用URL的方法,如果它返回某种可用的URL,那么就给我输出,如果没有,就不要给我错误,只返回false。通常,您可以执行HTTP头请求,获取头的预览
$fd = @ fopen('url', 'rb');
if ($fd) {
fclose($fd);
$contents = file_get_contents('url');
}
UPD:
您应该这样写(例如控制器的动作):
为什么你不能做文件获取内容,然后检查($contents!==false)?是的,但是文件获取内容会抛出一个错误,这是我不想看到的。在文件前面放一个@以抑制E\u警告,然后检查它是否返回false。@通常不是很糟糕的编码标准吗?你并没有被选项淹没。就标准而言,在本例中,您在下一行显式地处理故障,这基本上是错误抑制的目的。如果可能的话,头部预览也是合理的,但这是一个普遍接受的选项。嗯,当服务器存在时,它不会向服务器启动一个完整的新请求吗。问题是,一旦请求,您将无法再次获得它。@My1$url='1!'scheme://host[:port][/path][?secret_key=12345678]'当密钥只有一次有效时。但是为什么你不能在DB上存储访问关系和/或这个键呢?url的工作原理和你说的差不多,但是你的代码看起来像是它首先尝试访问它,如果它得到什么,它会关闭连接并再次调用。此外,该密钥仅有效一次,以避免重复攻击。但是,请稍候,如果您打开它,您基本上会打开连接并准备好读取。因此,如果我们在获得某个内容时不关闭该内容,而是使用fopen的ressource指针,则可能会关闭该内容work@My1但这是用户的隐藏URL。关于此URL,只有您知道应用程序。您可以选择其他协议nfs、rsync、webdav、ftp、ssh或amazon clouds。但问题是服务器如何处理它,而不是在head请求后将其锁定。最好的想法是,如果可以得到HTTP状态码,任何输出都不会产生错误
...
public function download()
{
// chek auth and access rights
// get and sanitize key
// check existence of remote file
// check key (try get available from DB)
// get contents of existence file
// set key (in DB) has used and/or generate new unique key for this file
}
...