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

3 ответа

Решение

Убедитесь, что строки в вашем файле *.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, но я не уверен)

Другие вопросы по тегам