基本的にニュース記事をインデックス化するためのクローラーであるスクリプトがあります。スクリプトは 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 プラットフォームで構築または編集されていません。