3

私は、Oron、filespost、depositfiles などのファイル共有 URL をリストするプロジェクトに取り組んでおり、著作権で保護された素材の共有を、私のネットワーク内の識別されたコンテンツ所有者および権利所有者に報告します。

現在、PHP に組み込まれているいくつかのフィルターを備えた MySQL データベースからデータが取り込まれたテーブルにあるサービスを改善するために、機能しなくなったリンクを識別できるようにしたいと考えています。

私の考えでは、データが MySQL データベースから取得されると、ダウンロード URL 列のエントリ (ファイルまたはファイル ホスト ページへの URL) がチェックされ、ユーザーがダウンロードを開始できる実際のファイル共有ページにリンクしているかどうかが確認されます。それらが機能しており、ファイルをダウンロードする機能を提供している場合は、そのままにしておく必要があります。リンク テキストまたはセルの色は緑色に変わります。ファイル サイトにファイルが見つからないか類似のファイルが表示されている場合、リンク テキストまたはセルの背景色は赤色に変わります。

現在、アクティブまたは非アクティブなリンクをすばやく簡単に視覚的に表現する方法はありません。

404エラーが受信されたかどうかに基づいてURLを簡単に検証しましたが、これらのサイトが404またはリダイレクトを行わないことを考えると、それが機能しないことにすぐに気付きました。動的に生成されたページを変更して、ファイルが利用できないか、またはファイルが削除されたなど。

サードパーティのファイル共有リンク チェック サービスを使用するリンク チェック スクリプトも組み込みましたが、これには手動チェックとデータベースの手動更新が必要です。

また、ページに特定のフィールドや単語を見つけることができるかどうかも確認しましたが、サイトの範囲とサイトで使用されているより広い範囲の用語を考えると、これが正確であり、すべてのリンクに実装するのが難しいことが証明されています. .

また、アクティブなステータスに基づいて URL をフィルタリングできると便利です。色の変更がリンク クラスまたはセル クラス スタイルによって管理されている場合、リンク デッドまたはリンク アクティブなどのクラスに基づいて列をフィルター処理できると思います。私はこれを行うことができると思うので、クラスに基づくフィルタリングに関するこの最後のビットの助けは必ずしも必要ではありません.

どんな助けでも大歓迎です。

4

1 に答える 1

2

チェックしたいサイトはさまざまな人によって作成されているため、膨大な数のサイトでリンクが壊れているかどうかを 1 つのライナーで検出できる可能性はほとんどありません。

特定のサイトのリンクが壊れているかどうかを検出する単純な関数をサイトごとに作成することをお勧めします。リンクを確認したい場合、ドメイン名に基づいて外部サイトの HTML で実行する関数を決定します。

parse_url()を使用して、ファイル リンクからドメイン/ホストを抽出できます。

// Get your url from the database. Here I'll just set it:
$file_url_from_database = 'http://example.com/link/to/file?var=1&hello=world#file'

$parsed_link = parse_url($file_url_from_database);
$domain = $parsed_link['host']; // $domain now equals 'example.com'

関数名を連想配列に格納して、そのように呼び出すことができます。

function check_domain_com(){ ... }
function check_example_com(){ ... }

$link_checkers = array();
$link_checkers['domain.com'] = 'check_domain_com';
$link_checkers['example.com'] = 'check_example_com';

または関数を配列に格納します (PHP >=5.3)。

$link_checkers = array();
$link_checkers['domain.com'] = function(){ ... };
$link_checkers['example.com'] = function(){ ... };

これらを次のように呼び出します

if(isset($link_checkers[$domain]))
    // call the function stored under the index 'example.com'
    call_user_func($link_checkers[$domain]); 
else
    throw( new Exception("I don't know how to check the domain $domain") );

または、一連の if ステートメントを使用することもできます

if($domain == 'domain.com')
    check_domain_com();
else if($domain == 'example.com')
    check_example_com(); // this function is called

関数はブール値 (true または false; 0 または 1) を返して使用するか、必要に応じて別の関数自体を呼び出すことができます (たとえば、壊れたリンクに追加の CSS クラスを追加する場合)。

複数のサイトからストック写真のメタデータを取得していましたが、最近似たようなことをしました。各サイトで実行する関数がいくつかあったため、抽象クラスを使用しました。

補足として、最後にチェックした日付をデータベースに保存し、チェック レートを 24 時間または 48 時間 (または必要に応じてさらに間隔) に制限することをお勧めします。


実装を少し明確にするために編集します。

他の Web サイトへの HTTP リクエストは非常に遅くなる可能性があるため、ページの読み込みとは別にリンクのステータスを確認して更新する必要があります。これは次のように実現できます。

  • スクリプトは 12 時間ごとに実行され、24 時間以上前に最後にチェックされたデータベースからのすべてのリンクをチェックできます。「古い」リンクごとに、データベース内の列activeと列が適切に更新されます。last_checked
  • 誰かがページを要求すると、スクリプトはactiveリモート ページをダウンロードして毎回チェックするのではなく、データベースの列から読み取ります。
  • (余分な考え) 新しいリンクが送信されると、スクリプトですぐにチェックされるか、サーバーによってできるだけ早くチェックされるようにキューに追加されます。

人々はリンクをクリックして現在の状態を簡単に確認できるため、ボタンをクリックしてページから確認できるようにするのは冗長です (ただし、その考えに反することは何もありません)。

リソースを大量に消費する可能性のある update-all スクリプトは、Web 経由で実行可能 (アクセス可能) であってはならないことに注意してください。

于 2012-06-23T10:54:35.770 に答える