PHP генерирует список перенаправлений 301 из CSV, а затем проверяет список перенаправлений 301 на 404 ошибки - PullRequest
1 голос
/ 26 января 2011

У меня сегодня было интересное задание, и я не мог найти много по этому вопросу. Я хотел бы поделиться этим и попросить любые предложения о том, как это можно было бы сделать более элегантно. Я считаю себя посредственным программистом, который действительно хочет совершенствоваться, поэтому любая обратная связь высоко ценится. Есть также странная ошибка, которую я не могу выяснить. Итак, идем ... и, надеюсь, это поможет кому-то, кто когда-либо делал что-то подобное.

Клиент переделывал сайт, перемещал контент и имел пару тысяч перенаправлений, которые нужно было сделать. Маркетинг отправил мне XLS со старыми URL-адресами в одном столбце, новые 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);

Проверка на 404 с:

<?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 Ответ

1 голос
/ 26 января 2011

Вы должны были использовать fgetcsv() для создания исходного списка URL.Это разбивает файлы CSV в массив, упрощая преобразование.

Не могу ничего сказать о 404-х или причине ошибки.Но использование дурацких функций скручивания почти всегда является плохим показателем.Вместо этого я бы использовал инструмент командной строки, например wget, чтобы результаты можно было проверять вручную.

Но, возможно, вы могли бы вместо этого попробовать собственный PHP get_headers().Это должно показать необработанные заголовки результата;не должен сам следовать за перенаправлениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...