PHP生成来自CSV的301重定向列表,然后检查301重定向列表中的404错误

时间:2011-01-26 17:06:51

标签: php curl

我今天有一项有趣的任务,但在这个问题上找不到多少。 我想分享一下,并就如何更优雅地完成这项工作提出任何建议。我认为自己是一个平庸的程序员,他真的想要提高,所以任何反馈都会受到高度赞赏。还有一个我无法弄清楚的奇怪的错误。所以这就是......希望这能帮助那些曾经做过类似事情的人。

客户正在重做网站,移动内容,并且需要进行几千次重定向。营销部门在一列中向我发送了带有旧URL的XLS,下一页是新的URL。这些是我采取的行动:

  • 将XLS保存为CSV

写了一个脚本:

  • 将列表格式化为有效301重定向
  • 将列表导出为文本文件

然后我将所有新指令复制/粘贴到我的.htaccess文件中。

然后,我编写了另一个脚本,检查以确保每个新链接都有效(没有404)。第一个脚本完全按预期工作。 出于某种原因,我可以得到第二个脚本来打印出所有404错误(有几个),但脚本在完成遍历循环时不会死,而且它不会写到文件,它只是在命令行中挂起。没有错误报告。知道发生了什么吗?以下是这两个脚本的代码:

格式化301s:

<?php
$source = "301.csv";
$output = "301.txt";

//grab the contents of the source file as an array, prepare the output file for writing
$sourceArray = file($source);
$handleOutput = fopen($output, "w");

//Set the strings we want to replace in an array.  The first array are the original lines and the second are the strings to be replaced
$originalLines = array(
    'http://hipaasecurityassessment.com',
    ','
);
$replacementStrings = array(
    '',
    ' '
);

//Split each item from the array into two strings, one which occurs before the comma and the other which occurs after
function setContent($sourceArray, $originalLines = array(), $replacementStrings = array()){
    $outputArray = array();
    $text = 'redirect 301 ';
    foreach ($sourceArray as $number => $item){
        $pattern = '/[,]/';
        $item = preg_split($pattern, $item);
        $item = array(
            $item[0],
            preg_replace('#"#', '', $item[1])
        );
        $item = implode(' ', $item);
        $item = str_replace($originalLines, $replacementStrings, $item);
        array_push($outputArray,$text,$item);
    }   
    $outputString = implode('', $outputArray);
    return $outputString;
}


//Invoke the set content function
$outputString = setContent($sourceArray, $originalLines, $replacementStrings);

//Finally, write to the text file!
fwrite($handleOutput, $outputString);

检查404s:

<?php
$source = "301.txt";
$output = "print404.txt";

//grab the contents of the source file as an array, prepare the output file for writing
$sourceArray = file($source);
$handleOutput = fopen($output, "w");

//Split each item from the array into two strings, one which occurs before the space and the other which occurs after
function getUrls($sourceArray = array()){
    $outputArray = array();
    foreach ($sourceArray as $number => $item){
        $item = str_replace('redirect 301', '', $item);
        $pattern = '#[ ]+#';
        $item = preg_split($pattern, $item);
        $item = array(
            $item[0],
            $item[1],
            $item[2]
        );
        array_push($outputArray, $item[2]);
    }   
    return $outputArray;
}

//Check each URL for a 404 error via a curl request
function check404($url = array(), $handleOutput){

    $handle = curl_init($url);
    curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);

    $content = curl_exec( $handle );
    $response = curl_getinfo( $handle );

    $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
    if($httpCode == 404) {
        //fwrite($handleOutput, $url);
        print $url;
    }
};


$outputArray = getUrls($sourceArray);

foreach ($outputArray as $url)
{
    $errors = check404($url, $handleOutput);
}

1 个答案:

答案 0 :(得分:1)

您应该使用fgetcsv()来生成原始网址列表。这会将CSV文件拆分为数组,从而简化了转换。

无法说出404或错误原因。但使用古怪的卷曲功能几乎总是一个不好的指标。出于测试目的,我会使用wget之类的命令行工具,以便可以手动校对结果。

但也许您可以尝试PHP自己的get_headers()。它应该显示原始结果标题;不应该不遵循重定向本身。