Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正在从外部拥有的服务器检查目录或文件_Php_Linux_Nusoap - Fatal编程技术网

Php 正在从外部拥有的服务器检查目录或文件

Php 正在从外部拥有的服务器检查目录或文件,php,linux,nusoap,Php,Linux,Nusoap,我正在用PHP为一家音乐公司开发一个脚本,该公司有不同的服务器,因此如果外部服务器上存在或不存在文件,他们需要显示该文件 就像他们有3个版本的音乐文件mp3 mp4等。。。。。他们从特定的外部服务器访问文件(每个版本)。我已经为它做了三个解决方案,它们都像魅力一样工作,但它们使服务器速度变慢 第一种方法: $handle = curl_init($url); curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE); /* Get the HTML

我正在用PHP为一家音乐公司开发一个脚本,该公司有不同的服务器,因此如果外部服务器上存在或不存在文件,他们需要显示该文件

就像他们有3个版本的音乐文件mp3 mp4等。。。。。他们从特定的外部服务器访问文件(每个版本)。我已经为它做了三个解决方案,它们都像魅力一样工作,但它们使服务器速度变慢

第一种方法

$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);