
私はapache2の内部専用のサイト(ここ数年見ていませんでした)に行くことにしました。 しかし、私は
サイトが一時的にブロックされたというホスティング事業者からのメッセージだけを見ました。 Yandexでリクエストを行いました。検索エンジンには既にキャッシュに何もありません。 このサイトは長い間ブロックされていると思います。 SMSの助けを借りて、ホスティングを1日間延長しましたが、2007年12月以降は更新がありませんでした。 ドメインの連絡先で指定されたメールで著者に連絡しようとしました。 返事が来ませんでした...
保存されたサイトが幸運だったことに注意してください。 シンプルで論理的です。 記事、写真のコピーは長く退屈なプロセスです。 すべてを一度にコピーすることにしました。 私たちは何を持っています:
- ソースサイトは完全に静的です
- ModRewriteはすべてを1つのphpスクリプトにスローします
- スクリプトは、キャッシュ内のファイルを検索します。キャッシュ内にない場合、ソースサイトからの要求
- すべてをsqliteに保存することにしました
データストアとして、次のいずれかを選択しました。
ファイルをそのまま保存します 。つまり、 ページのソースアドレスが/topic/123.htmlの場合、トピックディレクトリを作成し、そこにファイルを配置します。 たとえば、wgetはこれを行います。 しかし、私はこのアプローチが好きではありませんでした。
URIからmd5ハッシュを作成し、多くのファイルをdata / TUTHESH.dbファイルに保存します。 その後、このフォルダには何も見つかりません。 好きじゃなかった。
md5ハッシュを作成し、sqlite baseに保存します。 基本的に、これは以前のバージョンと同じですが、ファイルは1つだけです。 mysqlに保存するための別のオプションが検討されました-しかし、それはすでに痛くてモバイルではなく、かさばっていません。 そしてsqlite:いくつかのファイルを新しい場所に書き直しました-サイトはデプロイされて準備ができています。
ModRewrite-私は新しいものを発明しませんでした:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php
# :
RewriteCond %{HTTP_HOST} !^apache2dev\.ru$
RewriteRule ^ apache2dev.ru%{REQUEST_URI} [R=301,L]
仕組み-index.php
ソースコードはここにあります:
apache2dev.ru/index.phps
1.ターゲットサイトのアドレスを追加する場合に備えて、$ _SERVER ['REQUEST_URI']を使用します。
2. md5ハッシュを取得する
3.ローカルキャッシュにリクエストされたページがあるかどうかを確認します
4.そうでない場合、サイトのソースをリクエストし、レスポンスヘッダーを解析します。 興味があるのは、「Content-Type」と「Last-Modified」の2つだけです
5.キャッシュヘッダーと応答。 HTMLファイルを少し処理した後、クライアントに結果を提供します。 基準Content-Type = text / html
6. 1日の有効期限を追加します。
私は、キャッシュにデータを元の形式で保存することに決めました。
データベースを作成します。
CREATE TABLE storage (loc TEXT PRIMARY KEY, heads TEXT, fdata TEXT, location TEXT);
これで、サイトを開いて写真のあるページを見たときに、最初のデータがローカルキャッシュに保存されました。
走る
'wget -r .ru'
'wget -r .ru'
と少し作業
'wget -r .ru'
。 -rスイッチを指定したwgetは、サイト全体を再帰的にダウンロードしようとします。 彼はそれをあまり上手くやっていない。 たとえば、彼はjavascriptが何であるかをまったく知りません。 今、私はサイトを開いて、wgetが逃したものをキャッチするためにページを調べます。
結論として、私は膝の上に別のスクリプトをスケッチしました。これは、現在ローカルデータベースにあるものを示しています。 リストをすばやく見て、数行を削除します。
ソース:
apache2dev.ru/list.phps
私はサイトを動作モード、つまり 現在のロジックは次のとおりです。ローカルキャッシュにデータがない場合、ソースサイトに何も要求せず、単に
エラー404を表示し
ます 。
速度測定
abを使用して測定しました:70kbの画像と任意のhtmlページ。 違いは、追加のpreg_replaceのみです(広告の一部を削除し、絶対リンクを相対リンクに置き換え、このページがコピーであるという警告を挿入することを許可しました)
#ab -c 10 -n 1000
apache2dev.ru/images/ff_adds/validator.gif
1秒あたりのリクエスト:417.32 [#/ sec](平均)
#ab -c 10 -n 1000
apache2dev.ru/2006/01/28/ustanovka-apache-20-2
1秒あたりのリクエスト:29.66 [#/秒](平均)
結果は私にとても合っています。
このアプローチの長所と短所:
- サイトを「保存」する必要があるのは一度だけで、その後は忘れることができます。 私はなんとなくWordpressを恐れています。監視、更新などが必要です。
- このサイトは7つのファイルに収まるので、コピーすると便利です。 sqliteベース-20MB
- 最小システム要件
- (私の意見では)主な欠点は、すべてのサイトをこの方法で保存できるわけではないという事実です。 あなたが決して止められないリンクの上を歩いているサイトがあります。
可能な改善:
- データベースでは、データは処理済みの形式(preg_replaceなど)で既に保存されている可能性があります
- また、データは圧縮形式で保存できます。 Accept-Encodingを確認します。gzipが存在する場合-そのまま発行し、そうでない場合は解凍します
- 高いパフォーマンスが必要な場合は、nginxにphpスクリプトによるデータ出力のキャッシュを依頼できます
- ページURIを事前に準備します。 たとえば、すべての種類を削除しますか?From = top10 ,? From = ap2.2、同じページ(ただしアドレスが異なる)が数回保存されます。
- パラメーターmax_redirects = 0をcontextを介してfile_get_contents関数に渡し、エラーを処理し、Locationヘッダーを保存します。 これで、/ get.php?= / download / 123.pdfをリクエストしたユーザーは、pdfファイルがこのアドレスにあるかのように、すぐにデータを受信します。 file_get_content関数(index.phpファイル内)は、リダイレクトを見た後、誰にも言わずに自動的に実行します。 そして、アイデアによると、ユーザーはHTTP / 1.1 302 Foundサーバーから応答を取得し、ファイル自体に直接別の要求を行う必要があります。
ところで、問題のapacheに関するサイト:
apache2dev.ru
フルセット:
apache2dev.ru/catcher.tgz