2

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

就像他们有每个音乐文件 mp3 mp4 等的 3 个版本......并且他们正在从那里特定的外部服务器访问文件(每个版本)。我为此制定了三个解决方案,它们都像魅力一样工作,但它们使服务器变慢。

第一种方法

$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,它在内部检查文件并返回是/否

第三种方法

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;
}

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

4

2 回答 2

0

我认为它适用于上述答案,但是在请求太多的情况下它不起作用所以我终于一次又一次地尝试并发现这个解决方案它工作得很好实际上问题是重定向了太多的问题所以我在 curl 中设置了 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); 
于 2013-05-30T14:53:57.687 回答
0

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

curl 示例(感谢这篇博文):

<?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(),请注意默认情况下它很慢,因为它发出 GET 请求。要使用 HEAD 请求,您应该更改默认流上下文(请查看 php 手册中的 get_headers()):

stream_context_set_default(
    array(
        'http' => array(
            'method' => 'HEAD'
        )
    )
);
于 2013-05-24T02:11:20.763 回答