استفاده از چند دیتابیس برای وردپرس
دیتابیس یکی از مهمترین مشکلات یک سایت بزرگ وردپرسی است. با بزرگ شدن یک سایت وردپرسی دیتابیس آن هم هر لحظه حجیم تر میشه و این سنگین شدن دیتابیس باعث کندی و سرعت پایین سایت میشود. کارهای زیادی رو میشه برای کم کردن حجم دیتابس انجام داد. اما در این نوشته قرار نیست به این بحث بپردازم. و به جاش قراره نحوه استفاده از چند دیتابیس برای وردپرس رو بررسی خواهم کرد.
طی این مدت اخیر که کار میکنم، یکی از مشکلاتی که همیشه باهاش سر و کار داشتیم و داریم سرعت سایت هست. اخیرا ویژگی جدیدی به سایت ژاکت اضافه کردم که باعث میشه در زمان کوتاهی حجم بسیار زیادی از اطلاعات در دیتابیس ذخیره بشه (البته هنوز رونمایی شده از این ویژگی 🙂 ) در نتیجه مجبور شدم که راهکاری برای اتصال وردپرس به چند دیتابیس مختلف پیدا کنم. روشهای مختلفی وجود داره برای این کار، که توی این نوشته قراره روشی که خودم استفاده کردم و نتیجه خوبی هم ازش گرفتم رو توضیح بدم.
HyperDB
اولین افزونهای که برای اتصال وردپرس به چند دیتابیس پیدا میکنیم افزونه HyperDB است. این افزون توسط خود شرکت اتومتیک نوشته شده اما متاسفانه بیشتر از دو ساله که به روز رسانی نشده و شاید همین عدم به روز رسانی بود که من نتونستم ازش جواب بگیرم. در نتیجه به دنبال راهکار جایگزینی براش گشتم.
LudicrousDB
بعد از کلی جستجو و تست افزونههای مختلف سرانجام به افزونه LudicrousDB رسیدم. طبق گفته نویسنده افزونه، LudicrousDB رابط دیتابیس پیشرفتهایه برای وردپرس که عملیاتهای replication، fail-over، load balancing و partitioning را بر اساس افزونه HyperDB انجام میدهد. همون طور که از توضیحات خود افزونه مشخصه عملیاتهای مختلف رو میشه با این افزونه بر روی دیتابیس وردپرس انجام داد. چیزی که من نیاز داشتم عمل partitioning بود که بهم اجازه میداد چند جدول از دیتابیس اصلی رو به یک دیتابیس دیگه منتقل کنم تا حجم دیتابیس اصلی سایت رو کم کنم.
استفاده از چند دیتابیس برای وردپرس با کمک افزونه LudicrousDB
برای شروع آخرین نسخه افزونه رو از https://github.com/stuttter/ludicrousdb/releases دانلود میکنیم. فایل دانلود شده رو اکسترکت میکنیم و فولدرش رو توی فولدر افزونههای وردپرس قرار میدیم. برای استفاده از افزونه نیازی نیست که از پنل وردپرس فعالش کنیم و تنها با کپی کردن فولدرش میشه ازش استفاده کرد 🙂
بعد از کپی کردن فولدر پلاگین، فایل db.php رو از مسیر /wp-content/plugins/ludicrousdb/ludicrousdb/drop-ins/ کپی میکنیم و داخل فولدر wp-content سایتمون قرار میدیم.
در مرحله بعدی از همون مسیر /wp-content/plugins/ludicrousdb/ludicrousdb/drop-ins/ فایل db-config.php رو توی روت سایت کپی میکنیم.
تا اینجا فایلهای مورد نیاز رو توی مسیرهای مناسب قرار دادیم. حالا نوبت تنظیم دیتابیس جدید برای سایت مون رسید. فایل db-config.php که توی روت سایت هست رو باز میکنیم. آخر این فایل این تیکه کد رو میبینیم:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ |
/** * This is the most basic way to add a server to LudicrousDB using only the * required parameters: host, user, password, name. * This adds the DB defined in wp-config.php as a read/write server for * the 'global' dataset. (Every table is in 'global' by default.) */ $wpdb->add_database( array( 'host' => DB_HOST, // If port is other than 3306, use host:port. 'user' => DB_USER, 'password' => DB_PASSWORD, 'name' => DB_NAME, ) ); /** * This adds the same server again, only this time it is configured as a slave. * The last three parameters are set to the defaults but are shown for clarity. */ $wpdb->add_database( array( 'host' => DB_HOST, // If port is other than 3306, use host:port. 'user' => DB_USER, 'password' => DB_PASSWORD, 'name' => DB_NAME, 'write' => ۰, 'read' => ۱, 'dataset' => 'newdb', 'timeout' => ۰.۲, ) ); |
احتمالا با دیدن این کدها متوجه شدید که برای اضافه کردن دیتابیس به سایت، تنها کافیه که متد add_database رو با پارامترهای دلخواه صدا بزنیم تا دیتابیس جدید به سایتمون اضافه بشه، اما پارامترهای ورودی چه چیزهایی هستند:
host: آدرس سرور دیتابیس جدید، اگر دیتابیس بر روی سرور فعلی مون قرار داره که از localhost استفاده میکنیم اگر هم سرور دیتابیس مجزا هست میتونیم از آدرس آی پیش استفاده کنیم. اگر پورت سرور ۳۳۰۶ نیست میتونیم به صورت IP.ADDRESS:PORT آدرس سرور رو وارد کنیم.
user: نام کاربری دیتابیس
password: کلمه عبور دیتابیس
name: نام دیتابیس جدید
write: قابلیت نوشتن روی دیتابیس جدید
read: قابلیت خواندن از دیتابیس جدید
dataset: این مقدار تعیین کننده گروهی از جدولهاست که در یک دیتابیس قرار گرفتهاند.
timeout: زمان تایم اوت اتصال
نکته ای که وجود داره اینه حتما باید اول دیتابیس فعلی سایت رو به شکل زیر توی همین فایل اضافه کنیم و سپس دیتابیسهای بعدی رو اضافه کنیم.
۱ ۲ ۳ ۴ ۵ ۶ |
$wpdb->add_database( array( 'host' => DB_HOST, // If port is other than 3306, use host:port. 'user' => DB_USER, 'password' => DB_PASSWORD, 'name' => DB_NAME, ) ); |
خب تا اینجا دیتابیسهای جدید رو به وردپرس مون معرفی کردیم. حالا تنها کافیه که به وردپرس بفهمونیم که کدوم جدولها رو از کدوم دیتابیس بخونه. برای این کار نیاز هست که متد add_callback رو کال کنیم. پارامتر ورودی این متد یک تابع هست که توی وردپرس باید تعریف شده باشه که اون تابع هم دو تا پارامتر ورودی داره که به ما اجازه میده درخواستهای دیتابیس رو فیلتر کنیم و هر درخواست رو به دیتابیس مورد نظرمون ارسال کنیم.
برای نمونه میتونیم از کدی شبیه به کد زیر استفاده کنیم:
۱ ۲ ۳ ۴ ۵ ۶ ۷ |
global $wpdb; $wpdb->add_callback( 'db_callback' ); function db_callback( $query, $wpdb ) { if ( $wpdb->base_prefix . 'posts' == $wpdb->table || $wpdb->base_prefix . 'postmeta' == $wpdb->table ) { return 'newdb'; // This is 'dataset' name in wpdb add_database method on db-config.php } } |
توی کد ساده بالا گفتیم که اگر جدول درخواستی posts و یا postmeta بود از جدولهای با دیتاست newdb استفاده کنیم. از این به بعد اطلاعات جدول های posts و postmeta از دیتابیس دوم خوانده و نوشته خواهد شد.
کاری که من انجام دادم بسیار ساده بود. این افزونه بسیار قدرتمنده و کارهای خیلی پیچیده تری میشه باهاش انجام داد. برای آشنایی بیشتر با امکانات و قابلیتهای اون حتما توصیه میکنیم صفحه افزونه توی گیتهابرو حتما مطالعه کنید.
پ . ن : من این روش رو روی وردپرس ۴.۸.۲ ، دیتابیس MariaDB و PHP ۷.۰.۲۲ تست کردم و به خوبی جواب گرفتم