php заканчивается с ошибкой на одном сервере, но работает на другом?

У меня есть скрипт, который по сути является сканером для индексации новостных статей. Сценарий отлично работает на одном сервере (основной 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

1

Решение

Убедитесь, что строки в вашем файле * .txt разделены \ n, а не \ r \ n, что происходит, если вы сохраняете их в программе Windows.

В противном случае после того, как вы разберете его с помощью ‘\ n’, все строки будут заканчиваться на ‘\ r’ и, таким образом, не смогут полностью выполнить условие EndWith ().

Этот код должен работать на обеих машинах:

$exclusion_list = explode("\n",str_replace("\r", "", file_get_contents('../F/exclusion_list.txt')));
1

Другие решения

Если один из ваших серверов или компьютеров использует Windows, у вас, вероятно, есть проблема с кодировкой конца строки: \ r \ n в Windows и \ n в Unix (и я думаю, что \ r в iOS, но я не уверен)

0

Может быть какая-то проблема в файле, попробуйте использовать другой файл и проверьте, показывает ли он ту же проблему или нет.

0