1

当我运行下面的代码时,它只显示可通过“domainslist.txt”中列出的最后一个 url 访问的网页。它不显示早期的网页。

例如,如果“domainslist.txt”包含:

http://example[1].com
http://example[2].com
http://example[3].com

然后代码只显示来自 example[3].com 的网页。

为什么不显示所有三个?

function url_get_contents($Url) {
        if (!function_exists('curl_init')) {
            die('CURL is not installed!');
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $Url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    }

    $urls = file("domainslist.txt", FILE_SKIP_EMPTY_LINES);

    foreach ($urls as $url) {

        echo(url_get_contents($url)); 

    }

注意如果我手动创建 URL 数组,如下所示:

$urls = array();
$urls[0] = "http://example[1].com";
$urls[1] = "http://example[2].com";
$urls[2] = "http://example[3].com";

然后它工作正常,显示所有 3 页。

编辑:

当我使用时var_dump($urls);,形成数组的两种不同方法的结果之间存在微小差异。使用创建的数组中的前两个 URL 在file()字符串长度中报告了两个额外的字符 - 但最终 URL(显示的 URL)是正确的字符数。但是,手动创建数组时,没有多余的字符。

4

3 回答 3

1

你的代码看起来不错,所以我猜 domainlist.txt 有点奇怪

您需要检查的第一件事foreach ($urls as $url)是执行的频率以及 $url 的内容是什么。应该是 3 次,显然是 3 个不同的 URL。还要检查附加到 $url 的额外数据,以防文件采用奇怪的编码格式。

简而言之,试试这个进行调试并让我们知道输出。

function url_get_contents($Url) {
    if (!function_exists('curl_init')) {
        die('CURL is not installed!');
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, trim($Url)); //added trim to fix unintented chars from domainlist.txt
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $output = curl_exec($ch);
    curl_close($ch);
    return $output;
}

$urls = file("domainslist.txt", FILE_SKIP_EMPTY_LINES);

var_dump($urls);

foreach ($urls as $url) {
    var_dump($url);
    var_dump(url_get_contents($url));
}
于 2012-12-06T10:15:57.590 回答
1

添加标志FILE_IGNORE_NEW_LINES

file('domainslist.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

手动函数文件()

于 2012-12-06T10:20:51.217 回答
1

假设您的“domainslist.txt”文件示例是文件本身的外观,请在 URL 的末尾添加一个斜杠 ( / ),您的代码将正常工作。

打开文件时添加标志 FILE_IGNORE_NEW_LINES 也应该这样做。

于 2012-12-06T10:26:58.957 回答