从外部服务器检查目录或文件

时间:2013-05-23 08:04:05

标签: php linux nusoap

我正在为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;
}

所以我需要一个不会使服务器减慢任何建议的解决方案

2 个答案:

答案 0 :(得分:0)

请务必发出HEAD请求,而不是GET ,因为您不想获取文件内容。也许你需要遵循重定向,或者不是......

卷曲示例(感谢this blog post):

<?php
$url = 'http://localhost/c.txt';

echo "\n checking: $url";

$c = curl_init(); 
curl_setopt( $c, CURLOPT_RETURNTRANSFER, true ); 
curl_setopt( $c, CURLOPT_FOLLOWLOCATION, true ); 
curl_setopt( $c, CURLOPT_MAXREDIRS, 5 ); 
curl_setopt( $c, CURLOPT_CUSTOMREQUEST, 'HEAD' ); 
curl_setopt( $c, CURLOPT_HEADER, 1 ); 
curl_setopt( $c, CURLOPT_NOBODY, true ); 
curl_setopt( $c, CURLOPT_URL, $url ); 
$res = curl_exec( $c );

echo "\n\ncurl:\n";
var_dump($res);

echo "\nis 200: ";
var_dump(false !== strpos($res, 'HTTP/1.1 200 OK'));

如果HTTP无法使用该文件,则可以选择SOAP或其他Web服务实现。

如果您想使用get_headers(),请注意默认情况下it's slow because it issues a GET request。要使用HEAD请求,您应该更改默认流上下文(请在php手册上查看get_headers()):

stream_context_set_default(
    array(
        'http' => array(
            'method' => 'HEAD'
        )
    )
);

答案 1 :(得分:0)

我认为它适用于上面的答案,但它没有在有太多请求的地方工作所以我终于一次又一次地尝试找到这个解决方案它的工作完全实际上问题是重定向太多了所以我在卷曲中设置time_out 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); 
相关问题