У меня есть скрипт, который по сути является сканером для индексации новостных статей. Сценарий отлично работает на одном сервере (основной http-сервер), но я пытаюсь переместить его на выделенную платформу, и один из разделов не будет работать.
Неудачная часть использует простую функцию (из SO), чтобы проверить, соответствует ли строка (URL, найденный искателем) списку исключений, хранящемуся локально в файле .txt.
Я проверил, чтобы убедиться, что файл .txt получен с помощью var_dump, и все показывает нормально.
Это не позволяет постоянно сбрасывать или отображать позитивы, но на другом сервере все работает нормально.
Важная часть заключается в следующем:
<?php
ini_set('display_errors', 1);
$linkurl_reg = '/href="http:\/\/metro.co.uk(.+?)"/is';function endsWith($haystack, $needle)
{
return $needle === "" || substr($haystack, -strlen($needle)) === $needle;
}
$data = file_get_contents("http://metro.co.uk");
preg_match_all($linkurl_reg,$data,$new_links);
$exclusion_list = explode("\n",file_get_contents('../F/exclusion_list.txt'));
var_dump($exclusion_list); //just to check we got the file ok
for($i = '0';$i < count($new_links[1]) ; $i++){
for ($ii = '0';$ii < count($exclusion_list);$ii++){
if(endsWith($new_links[1][$i], $exclusion_list[$ii])){echo 'unset ';unset($new_links[1][$i]);}else{echo'not unset ';}
}
}?>
Странно, если я использую только одно значение при настройке списка исключений, например
$exclusion_list[0] = "xmlrpc.php";
вместо
$exclusion_list = explode("\n",file_get_contents('../F/exclusion_list.txt'));
это будет работать для этой конкретной строки.
Пожалуйста, если у кого-то есть что-нибудь, я смотрю на это уже 3 дня и я совершенно в замешательстве.
Вещи, которые я пробовал:
кодирование массива $ exclusion_list в UTF перед взрывом.
кодирование строк $ exclusion_list в UTF в цикле
проверил функцию с нормальными строками
запись строк вручную, а не из массива или fileget (работает раздражающе)
изменение расширения файла с .txt на различные другие вещи
обновление версии php на сервере (нерабочая)
замена «\ n» на «\ r» и «\ n \ r» во время разнесения
Я даже пытался изменить функцию на некоторые другие, найденные в SO, странным образом я получаю те же результаты (работает со строками, которые я определяю, но не с чем-либо, извлеченным из файла exclusion_list).
Из жизни я понятия не имею, почему один будет работать, а не другой.
Текущая версия PHP: 5.4.36-0 + deb7u3 (нерабочий сервер)
Текущая версия PHP: 5.2.17 (рабочий сервер)
запрошенная переменная var_dump для списка исключений $ (нерабочий сервер):
array(9) {
[0]=>
string(6) ".jpeg"[1]=>
string(5) ".jpg"[2]=>
string(5) ".gif"[3]=>
string(5) ".css"[4]=>
string(5) ".xml"[5]=>
string(11) "xmlrpc.php"[6]=>
string(21) "metro.co.uk" target="[7]=>
string(20) "metro.co.uk/osd.xml"[8]=>
string(32) "metro.co.uk/terms/#privacypolicy"}
запрошенная переменная var_dump для списка исключений $ (рабочий сервер):
array(9) {
[0]=>
string(5) ".jpeg"[1]=>
string(4) ".jpg"[2]=>
string(4) ".gif"[3]=>
string(4) ".css"[4]=>
string(4) ".xml"[5]=>
string(10) "xmlrpc.php"[6]=>
string(20) "metro.co.uk" target="[7]=>
string(19) "metro.co.uk/osd.xml"[8]=>
string(32) "metro.co.uk/terms/#privacypolicy"}
Оба сервера Linux, оба текстовых файла не создаются и не редактируются на платформах Windows
Убедитесь, что строки в вашем файле * .txt разделены \ n, а не \ r \ n, что происходит, если вы сохраняете их в программе Windows.
В противном случае после того, как вы разберете его с помощью ‘\ n’, все строки будут заканчиваться на ‘\ r’ и, таким образом, не смогут полностью выполнить условие EndWith ().
Этот код должен работать на обеих машинах:
$exclusion_list = explode("\n",str_replace("\r", "", file_get_contents('../F/exclusion_list.txt')));
Если один из ваших серверов или компьютеров использует Windows, у вас, вероятно, есть проблема с кодировкой конца строки: \ r \ n в Windows и \ n в Unix (и я думаю, что \ r в iOS, но я не уверен)
Может быть какая-то проблема в файле, попробуйте использовать другой файл и проверьте, показывает ли он ту же проблему или нет.