この投稿に触発され
ました 。
ここでは、独自のホスティング/ localhostでrutracker.orgのディストリビューションの検索を実装する方法について説明します。
予備合意:- すべての操作は、UNIXのような環境で行われます。 残念ながら、ウィンドウのニュアンスは私にはわかりません。
- Unixシェル、Yii2、gitの基本的な知識があるはずです
- 個人的には、この(ローカル検索を手作業で行う)ソリューションを使用するためのいくつかのシナリオがあります。
- この場合、yii2高度なテンプレートの実装は冗長ですが、私は慣れています。
- 人生で初めてspinxを目にするので、設定に奇妙なことがあるかもしれません。
- 一部の場所では、決定が非常に物議を醸している(「正しい方法」というプロンプトに感謝する)。
このトピックに関する前のトピックを読んだ後、著者が提供する実装に正直に少し失望しました。 実際、それが私が自分ですべてをした理由です。
プロジェクト全体が
githubにあり、そこでコード全体を表示できます。ここでは、本質を理解するための抜粋のみを示します。
プロジェクトは、
このディストリビューションからのcsvファイルの自動インポートを実装し(コンソールから起動されます)、ディストリビューションの名前/カテゴリ/サブカテゴリで検索します。
詳細プロジェクト全体をそのまま使用する場合の簡単な手順は次のとおりです。
- リポジトリのクローンを作成します(git clone github.com/andrew72ru/rutracker-yii2.git )
- プロジェクトフォルダに移動し、コンポーネントをインストールします(作曲家インストール)
- 環境を初期化します(./init)
- データベースを作成し、common / config / main-local.phpでデータベースへのアクセスを設定します
- 移行を開始します(./yii migrate)
- プロジェクトにアクセスするようにWebサーバーを構成します(ルートディレクトリ-フロントエンド/ Web)
- ダウンロード配布
- ディレクトリフロントエンド/ランタイム/ csvを作成
- ディストリビューションからの最新バージョンのファイルをこのディレクトリに配置します。 配布全体はフォルダに分割され、日付と呼ばれ、最後の日付のフォルダを取りました
- コンソールで実行します./yii import / import
私のサーバーでは、インポートは約6時間続きました-配布テーブルには150万件以上のエントリがありますが、驚かないでください。
DBスキーマカテゴリの表:
CREATE TABLE `categories` ( `id` int(11) NOT NULL AUTO_INCREMENT, `category_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `file_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
サブカテゴリテーブル:
CREATE TABLE `subcategory` ( `id` int(11) NOT NULL AUTO_INCREMENT, `forum_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1239 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
分布表:
CREATE TABLE `torrents` ( `id` int(11) NOT NULL AUTO_INCREMENT, `forum_id` int(11) DEFAULT NULL, `forum_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `topic_id` int(11) DEFAULT NULL, `hash` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, `topic_name` text COLLATE utf8_unicode_ci, `size` bigint(20) DEFAULT NULL, `datetime` int(11) DEFAULT NULL, `category_id` int(11) NOT NULL, `forum_name_id` int(11) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `topic_id` (`topic_id`), UNIQUE KEY `hash` (`hash`), KEY `category_torrent_fk` (`category_id`), KEY `torrent_subcat_id` (`forum_name_id`), CONSTRAINT `category_torrent_fk` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `torrent_subcat_id` FOREIGN KEY (`forum_name_id`) REFERENCES `subcategory` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=1635590 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
分布を含むテーブルはやや冗長です(forum_name列は不要になり、リンクとして実装されています)が、JOINを使用せずに直接アクセスできるように削除しませんでした。
モデルgiiを介して生成されたモデルは、ほとんど変更なしで使用されます。 Sphinxでの検索に使用されたものを除き、すべてをここに持ってくる価値はないと思います(githubを参照)。
TorrentSearch.php namespace common\models; use Yii; use yii\helpers\ArrayHelper; use yii\sphinx\ActiveDataProvider;
インポート主なアイデアは、まずカテゴリ(category_info.csvファイル)をインポートし、次にディストリビューション(category _ *。Csvファイル)をインポートすることです。ディストリビューションのインポート中に、そこからサブカテゴリを取得し、別のモデルに書き込みます。
インポートコントローラー namespace console\controllers; use common\models\Categories; use common\models\Subcategory; use common\models\Torrents; use Yii; use yii\console\Controller; use yii\helpers\Console; use yii\helpers\VarDumper; class ImportController extends Controller { public $color = true; public function actionIndex() { $this->stdout("Default: import/import [file_path]. \nDefault file path is frontend/runtime/csv\n\n"); return Controller::EXIT_CODE_NORMAL; } public function actionImport($path = 'frontend/runtime/csv') { $fullPath = Yii::getAlias('@' . $path); if(!is_dir($fullPath)) { $this->stderr("Path '{$fullPath}' not found\n", Console::FG_RED); return Controller::EXIT_CODE_ERROR; } if(is_file($fullPath . DIRECTORY_SEPARATOR . 'category_info.csv')) $categories = $this->importCategories($fullPath); else { $this->stderr("File 'category_info.csv' not found\n", Console::FG_RED); return Controller::EXIT_CODE_ERROR; } if($categories === false) { $this->stderr("Categories is NOT imported", Console::FG_RED); return Controller::EXIT_CODE_ERROR; } foreach ($categories as $cat) { if(!is_file($fullPath . DIRECTORY_SEPARATOR . $cat->file_name)) continue; $this->importTorrents($cat, $path); } return Controller::EXIT_CODE_NORMAL; } private function importTorrents(Categories $cat, $path) { $filePath = Yii::getAlias('@' . $path . DIRECTORY_SEPARATOR . $cat->file_name); $row = 0; if (($handle = fopen($filePath, "r")) !== FALSE) { while (($data = fgetcsv($handle, 0, ";")) !== FALSE) { $row++; $model = Torrents::findOne(['forum_id' => $data[0], 'topic_id' => $data[2]]); if($model !== null) continue;
インポートは画面で実行するのが最適なので、コンソールを閉じることができます。 もちろん、出力をファイルにリダイレクトし、後で読むこともできます。
スフィンクスDebianの場合-apt-getのインストールsphinxsearch
バージョンSphinx 2.2.9をインストールしました
/etc/sphinxsearch/sphinx.conf source torrentz { type = mysql sql_host = localhost sql_user = webmaster
インデックス作成はコマンドによってトリガーされます
indexer --config /etc/sphinxsearch/sphinx.conf --all
indexer --config /etc/sphinxsearch/sphinx.conf --rotate --all
それだけです
Webインターフェース-標準Yii2 GridView、検索-標準フィルターを使用。
完了する価値があるもの必要に応じて無限に開発できます。 まず、カテゴリ/サブカテゴリの選択的インポート、GridViewのカテゴリ/サブカテゴリのより正確な依存リスト、リモートクエリ用のAPIなどを作成できます。
たぶん、私は私の暇な時にそれをするでしょう。
PSコメントやコードへの追加は本当に歓迎しますが、「php sucks、write in ... <他の言語を挿入>」と書くことを気にしないでください-私たちはこれについてすでに長い間議論しています。
sphinx configへのコメント/追加も歓迎します。もう一度思い出したいと思います-私が人生で初めて見たのは、元のトピックの著者が書いたからです。 もちろん、実験のために、しかし、どうですか:)