クライアント側でフォーラムエンジンの改善

私たちの多くは、サーバー上のファイルを変更せずに、ローカルツールを使用してWebサイトの外観を変更できることを認識しています。 これを行うにはさまざまな方法がありますが、最も一般的なのはユーザースクリプトとスタイルであり、ブラウザによってロードされたページに自動的に適用されます。 もちろん、そのような編集の可能性は非常に限られており、データベースへの非標準のクエリを必要とする深刻な問題を解決するには、この方法は機能しません。

ただし、この場合でも、すべてがそれほど絶望的ではないことが判明する場合があります。 この記事では、トピックや投稿の既読ステータスの表示を修正するphpBB2フォーラムエンジン用のローカルアドインを作成した経験について説明します。 この試みの結果は完全に機能する製品でしたが、今では常に使用していますが、この記事を執筆する目的は製品のプレゼンテーションではなく、問題を解決するアプローチの説明です。 私は受け取ったプログラムのコードを投稿しますが、タスクの詳細のため、特定のサイトのエンジンの予備的な(そしてかなり骨の折れる)構成なしでは、それは十分に普遍的ではなく、そのまま使用できません。 がっかりしないように、事前に警告することにしました。

そして今、問題文に関するより詳細に示します。

3番目のバージョンはphpBBの現在のバージョンであると長い間考えられてきましたが、2番目のバージョンはまだインターネット上で非常に一般的です。 私のツールが戦うように設計されているphpBB2の弱点のリストを以下に示します。
  1. ログインまたはブラウザを再起動した後、および一定時間非アクティブになった後、未読トピックはすべて自動的に既読としてマークされます。
  2. トピックを開くと、開いているページに関係なく、トピック全体が読み取られます。
  3. 読み取りステータスは、シリアル化された配列としてクッキーに保存されます。 Cookieの最大サイズは通常4 KBに制限されているため、約140トピックのステータスのみを保存できます。 アクティブなフォーラムの場合、これはごくわずかです。
肩をすくめる人もいますが、実際問題は何ですか? しかし問題は、すべての事項に遅れないようにしたい場合、未読のトピックとメッセージを(基本スキンの)オレンジリーフでマークすると、どのトピックが更新され、どのトピックが更新されていないかをすばやく確認できることです。 あなたは、たとえば、脇にそれらを更新するためにフォーラムに移動し、任意のメッセージに迅速に対応し、残りの部分を読んですることになりましたことを決定した場合は、未読の状態に次の訪問は廃棄される、そしてそれぞれの最後の訪問だったときに思い出して、手動で新しいメッセージを探すことが必要です特定のトピック、および投稿の日付またはテキストを探し、その瞬間からその中に登場したもの。 また、常にすべてのトピックを一度に読んだとしても、これは保証ではありません。結局、ブラウザーがクラッシュしたり、コンピューターがクラッシュしたり、ライトが消えたりする可能性があります(すべてのユーザーがUPSを持っているわけではありません)。

もちろん、問題に対する最も正しい解決策はフォーラムエンジンを変更することですが、実際にはこれは常に可能とはほど遠いものです。 したがって、私はこの問題を自分で、クライアント側で解決しようとすることにしました。 もちろん、サーバー上のデータベースに直接アクセスすることなく、完全に理想的なソリューションに疑問の余地はありません。 具体的には、ほとんどの場合、正確に(あなたが彼のテーマのすべてのページのフルセットをダウンロードし、分析しない限り、それは長い時間です)正しくホームページにアイコンを表示するために特定のサブフォーラムで未読の存在/不在を決定することはできません。 それにもかかわらず、いくつかの重要な改善を達成することはかなり可能です。

合計アドインアーキテクチャは以下のとおりである。各被験者のための最後の訪問のタイムスタンプを格納し、プラスフォーラムのすべてのページを通過するプロキシサーバーを実行しているローカルデータベースに格納されているクライアントマシン上で、修正ラベルは、実際の状況に応じてテーマやメッセージを持っていますローカルデータベースから取得した読み取り値(およびもちろん、必要に応じてこのデータベースを更新します)。

基本形式として、「00000000000000」という形式の行のセットを持つテキストファイルを選択しました。 各行は1つのトピック、行番号(ゼロからカウント)-トピックの識別子、およびUNIX時間形式での最後の訪問のタイムスタンプに対応し、行のコンテンツとして記録されます。 ゼロトピックはないため、ゼロ行は特別な方法で使用されます。フォーラム全体の日付/時刻が保存されるため、すべてのフォーラムトピックを一度に既読としてマークできます。 したがって、各トピックについて、最後の訪問のリアルタイムは、一般的なフォーラムと特にこのトピックの2つの値の最大値と見なされます。

なぜ私は、テキスト形式で停止しましたか? まず、必要に応じて、バイナリエディターを使用せずにエラーを修正するのに便利です。 第二に、私のプロキシサーバーはパールで書かれており、バイナリファイルよりもテキストファイルで作業する方が便利です。 テキスト文字列から数値を解析することは、リソースを大量に消費する操作ではなく、文字列の長さが固定されているため、ファイル全体を行ごとに読み取らずに、インデックスで目的のレコードに直接移動できます。

プロキシサーバーの実装に関しては、その上でテキストを操作するのが非常に便利であるという理由で、パール言語が選択されました(そしてもちろん、HTMLの解析が重要な部分になります)。 私の基準では、結果として得られる速度はかなり許容できることが判明しました(いずれにせよ、別の言語に切り替えることによる潜在的なパフォーマンスの向上は、労力と時間のコストほど重要ではないようです)。 プロキシサーバーはそのポートをリッスンし、ブラウザーから要求を受信すると、ターゲットサーバーに要求を送信し、応答を読み取り、受信したページのコンテンツをブラウザーに送信します。 その途中で、ページはフィルターを通過し、その動作は宛先アドレスに依存します。 これは我々が必要とするフォーラムの一つであり、viewtopic.phpスクリプト 、viewforum.php、index.php (またはフォーラムのちょうどルートURL)の一つではなく、何でもある場合、フィルタは、日付に基づいて、ラベルやメッセージを交換し、ページを解析するために開始します/ローカルデータベースから取得した最後の訪問の時間。 そうでない場合、フィルターは機能せず、変更されていないコンテンツをブラウザーに送信します。

最も困難で予測不可能な部分は解析です。 問題は、特定のフォーラムごとに異なるテーマと拡張機能をインストールできるため、サーバーから受信したページのHTMLコードが非常に広い範囲で変化することです。 さまざまなフォーラムの機能を考慮するために、phpBB2エンジンの主要な構造的機能のみをハードコーディングし、起動時にプロキシサーバーによって読み込まれる個別のモジュールに特定の信号線を配置し、各フォーラムを独自のルールセットに従って処理できるようにしました。 もちろん、新しいフォーラムのサポートを追加する必要がある場合は、サーバーから受信したHTMLページを分析して、信号線の強調表示と設定のすべての作業を手動で行う必要があります。 エンジンの変更が小さい場合、すべてがこれに制限されます。 しかし、エンジンが大幅に再設計され、HTML構造が完全に異なっていることが判明する場合があります。 その後、メインモジュール全体をやり直す必要がありますが、一般に「マルチフォーラム」を維持できるというのは事実ではありません。 プロキシサーバーの別のバージョンを保持する方が簡単である可能性があります。これは、「ファンシー」フォーラムの1つに特化したものです。

解析が正しく機能するためには、フォーラムのプロファイルを変更する必要もあります。 事実、デフォルトでは、エンジンは秒を指定せずにメッセージの日付/時刻を表示しますが、これ以上時間をかける場所がないため、マークを配置する際のエラーは1分になりますが、これはもちろん多すぎます。 したがって、プロファイル[設定]でより完全な時間形式を秒単位で選択する必要があります。 「D dmY、G:i:s」という形式に決めました。これにより、「Mon 02/14/2011、10:57:44」の形式で日付を表示できます(もちろん、プロキシサーバーは曜日を必要としませんが、愛する人にとっても便利です忘れないでください)。 別の形式を使用する場合は、タイムスタンプの解析機能を適切に修正する必要があります。 日付の代わりに「今日」または「昨日」という単語を挿入できるphpBBの変更を忘れてはなりません。 残念ながら、これにはコードの改良も必要です。

まあ、いくつかのより多くの機能を言及するのを残しました。

さて、誰かがこのトラブルをすべて怖がらなかった場合、サーバー自体はここからダウンロードできます (アーカイブ、5 Kb)。 キットには、公式フォーラムTotal Commanderの一連のルールがあります。これは、私の実験の基礎として採用したもので、基本的にこのすべてのボディアジーが始まりました。

Source: https://habr.com/ru/post/J113177/


All Articles