1

基本的にニュース記事をインデックス化するためのクローラーであるスクリプトがあります。スクリプトは 1 つのサーバー (メインの http サーバー) では正常に動作しますが、専用のプラットフォームに移動しようとすると、1 つのセクションが機能しなくなります。

失敗した部分は、単純な関数 (SO から) を使用して、文字列 (クローラーによって検出された URL) が .txt ファイルにローカルに保存された除外リストと一致するかどうかを確認します。

var_dump を使用して .txt ファイルが受信され、すべてが正常であることを確認するためにテストしました。

これは一貫してポジティブの設定解除またはエコーアウトに失敗しますが、他のサーバーではすべて正常に機能します。

重要な部分は次のとおりです。

<?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で見つかった他のいくつかに変更しようとしましたが、奇妙なことに同じ結果が得られました(定義した文字列では機能しますが、exclusive_listファイルから取得したものでは機能しません)。

私の人生では、なぜ一方が機能し、もう一方が機能しないのかわかりません。

現在の PHP バージョン: 5.4.36-0+deb7u3 (稼働していないサーバー)

現在の PHP バージョン: 5.2.17 (稼働中のサーバー)

$exclusion リストの 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"
}

$exclusion リストの 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 プラットフォームで構築または編集されていません。

4

3 に答える 3

0

ファイルに問題がある可能性があります。他のファイルを使用してみて、同じ問題が発生するかどうかを確認してください。

于 2015-02-18T17:14:09.527 に答える