Php 正在从外部拥有的服务器检查目录或文件
我正在用PHP为一家音乐公司开发一个脚本,该公司有不同的服务器,因此如果外部服务器上存在或不存在文件,他们需要显示该文件 就像他们有3个版本的音乐文件mp3 mp4等。。。。。他们从特定的外部服务器访问文件(每个版本)。我已经为它做了三个解决方案,它们都像魅力一样工作,但它们使服务器速度变慢 第一种方法:Php 正在从外部拥有的服务器检查目录或文件,php,linux,nusoap,Php,Linux,Nusoap,我正在用PHP为一家音乐公司开发一个脚本,该公司有不同的服务器,因此如果外部服务器上存在或不存在文件,他们需要显示该文件 就像他们有3个版本的音乐文件mp3 mp4等。。。。。他们从特定的外部服务器访问文件(每个版本)。我已经为它做了三个解决方案,它们都像魅力一样工作,但它们使服务器速度变慢 第一种方法: $handle = curl_init($url); curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE); /* Get the HTML
$handle = curl_init($url);
curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
/* Get the HTML or whatever is linked in $url. */
$response = curl_exec($handle);
/* Check for 404 (file not found). */
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
if($httpCode == 404) {
/* Handle 404 here. */
}
curl_close($handle);
/* Handle $response here. */
第二种方法:我使用NuSOAP制作了一个api,它在内部检查文件并返回yes/no
第三种方法:
function checkurl($url)
{
return true;
$file_headers = @get_headers($url);
//var_dump($file_headers);
if($file_headers[0] == 'HTTP/1.1 302 Moved Temporarily' || $file_headers[0] =='HTTP/1.1 302 Found') {
$exists = false;
}
else {
$exists = true;
}
return $exists;
}
因此,我需要一个不会使服务器减慢任何建议速度的解决方案,因为您不想获取文件内容,所以请确保发出HEAD请求,而不是GET。也许你需要遵循重定向,或者不 卷曲示例(感谢):
我认为上面的答案是可行的,但在有太多请求的情况下它不起作用,所以我最后一次又一次地尝试,发现这个解决方案非常有效,实际上问题是重定向了太多请求,所以我将time_设置为curl 15,它起作用了
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$r = curl_exec($ch);
$r = split("\n", $r);
var_dump($r);
你不能直接调用文件吗。。。缓存结果可能是有意义的。我认为文件_不适用于外部服务器,它只适用于本地服务器。我想我已经尝试过,首先在开始编写本脚本时,您必须使用JQuery Ajax从外部服务器调用到内部服务器,检查是否存在folderIll。对此进行研究,也可以缓存查找结果吗本地,以便下次请求文件时不必调用外部服务器,第二,如果你每页发出多个请求,你可以使用curl\u multi,它允许你发出多个并发请求,这通常比串行发出请求快。如果你能看到我的第三种方法,我得到的请求也带有标题,但它不能解决服务器太慢的问题。你的curl和get\u headers()示例发出GET请求,这意味着传输文件的所有内容。我已更新了答案。HEAD HTTP请求仅获取GET请求的结果头:。
stream_context_set_default(
array(
'http' => array(
'method' => 'HEAD'
)
)
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$r = curl_exec($ch);
$r = split("\n", $r);
var_dump($r);