دیتابیس یکی از مهمترین مشکلات یک سایت بزرگ وردپرسی است. با بزرگ شدن یک سایت وردپرسی دیتابیس آن هم هر لحظه حجیم تر میشه و این سنگین شدن دیتابیس باعث کندی و سرعت پایین سایت میشود. کارهای زیادی رو میشه برای کم کردن حجم دیتابس انجام داد. اما در این نوشته قرار نیست به این بحث بپردازم. و به جاش قراره نحوه استفاده از چند دیتابیس برای وردپرس رو بررسی خواهم کرد.
طی این مدت اخیر که بر روی ژاکت و همیار وردپرس کار میکنم، یکی از مشکلاتی که همیشه باهاش سر و کار داشتیم و داریم سرعت سایت هست. اخیرا ویژگی جدیدی به سایت ژاکت اضافه کردم که باعث میشه در زمان کوتاهی حجم بسیار زیادی از اطلاعات در دیتابیس ذخیره بشه (البته هنوز رونمایی شده از این ویژگی 🙂 ) در نتیجه مجبور شدم که راهکاری برای اتصال وردپرس به چند دیتابیس مختلف پیدا کنم. روشهای مختلفی وجود داره برای این کار، که توی این نوشته قراره روشی که خودم استفاده کردم و نتیجه خوبی هم ازش گرفتم رو توضیح بدم.
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 که توی روت سایت هست رو باز میکنیم. آخر این فایل این تیکه کد رو میبینیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/** * 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' => 0, 'read' => 1, 'dataset' => 'newdb', 'timeout' => 0.2, ) ); |
احتمالا با دیدن این کدها متوجه شدید که برای اضافه کردن دیتابیس به سایت، تنها کافیه که متد add_database رو با پارامترهای دلخواه صدا بزنیم تا دیتابیس جدید به سایتمون اضافه بشه، اما پارامترهای ورودی چه چیزهایی هستند:
host: آدرس سرور دیتابیس جدید، اگر دیتابیس بر روی سرور فعلی مون قرار داره که از localhost استفاده میکنیم اگر هم سرور دیتابیس مجزا هست میتونیم از آدرس آی پیش استفاده کنیم. اگر پورت سرور 3306 نیست میتونیم به صورت IP.ADDRESS:PORT آدرس سرور رو وارد کنیم.
user: نام کاربری دیتابیس
password: کلمه عبور دیتابیس
name: نام دیتابیس جدید
write: قابلیت نوشتن روی دیتابیس جدید
read: قابلیت خواندن از دیتابیس جدید
dataset: این مقدار تعیین کننده گروهی از جدولهاست که در یک دیتابیس قرار گرفتهاند.
timeout: زمان تایم اوت اتصال
نکته ای که وجود داره اینه حتما باید اول دیتابیس فعلی سایت رو به شکل زیر توی همین فایل اضافه کنیم و سپس دیتابیسهای بعدی رو اضافه کنیم.
1 2 3 4 5 6 |
$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 رو کال کنیم. پارامتر ورودی این متد یک تابع هست که توی وردپرس باید تعریف شده باشه که اون تابع هم دو تا پارامتر ورودی داره که به ما اجازه میده درخواستهای دیتابیس رو فیلتر کنیم و هر درخواست رو به دیتابیس مورد نظرمون ارسال کنیم.
برای نمونه میتونیم از کدی شبیه به کد زیر استفاده کنیم:
1 2 3 4 5 6 7 |
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 7.0.22 تست کردم و به خوبی جواب گرفتم
سلام. سوالی داشتم.
سوالم اینه که آیا اگر ما یک دیتابیس جدید ایجاد کنیم که مثلا از این به بعد پست ها رو از اون بخونه و بنویسه، پست های قبلی رو از دیتابیس قبلی میتونه بخونه؟
سلام
خیر، نمیتونید پستها رو توی چند تا دیتابیس تقسیم کنید.
سلام من یه فروشگاه انلاین دارم تعداد محصولات و افزونه های که نصب کردم زیاده میخوام همچین سیستمی براکی گروه بندی مصولات دیتا افزونه ها انجام دهم این شماره بنده هستش ممنون میشم راهنمایی کنید اگه هزینه هم داشت مشکلی نیست
09189264805
ممنون از وقتی که گذاشتید
درود
لطفاً یک راه ارتباط با خودتون را اعلام کنید
سپاس
سلام
توی برگه تماس با ما هست. ایمیل مو میتونید ازا ون جا ببینید
ممنون و خسته نباشید جهت به اشتراک گذاری این مطلب تخصصی و عالی.منتظر خواندن سایر تجربه های ناب تون هستیم.
سلام پست خوبی گذاشتین تا بحال در این مورد مطلبی ندیده ام.
از کجا بفهمیم کندی سرعت از حجم دیتابیس ماست؟
از روی حجم دیتابیس و یا…؟
سوال دوم: این روش برای سایتهایی که از هاست دانلود استفاده می کنند هم بکار میره یا نه؟
سلام
روی هاست اشتراکی خودتون نمیتونید بفهمید و مدیر سرورتون باید بررسی کنه
منوظرتون از اینکه از هاست دانلود استفاده میکنند چیه؟ هاست دانلود که دیتابیس نداره دیگه
سلام مهندس
امکان این هست که من جدول یوزرها رو از یه mssql بخونم و یوزرهای یه دیتابیس دیگه بتونن تو وردپرس لاگین کنن؟
سلام
اسکیمای جدول ها باید عینا مشابه باشند
سلام
مقاله ای بسیار کاردی و کامل بود
من خودم برای سوال بود که چطور ژاکت تونسته با مشکل دیتابیس پیش بره
ممنون
سلام
بسیار مطلب جالب و کاربردی بود، ممنون و متشکر از شما
روش جالبی بود، ممنون از اشتراک گذاریش
سلام
چند تا سوال ازتون دارم :
سوال 1 : این روش با افزونه هایی که با دیتابیس سرو و کار دارند مثل افزونه های wp-rocket یا duplicator یا wp-clean-up یا all-in-one-wp-security-and-firewall و یا خیلی از افزونه های دیگه.
این افزونه ها میتوانند به دیتابیس یا دیتابیس های جدید متصل شوند؟
مثلا افزونه duplicator از سایت بسته نصبی میگیره، دیتابیس های جدید را چکار میکنه؟
یا افزونه wp-clean-up دیتابیس را بهینه میکنه، میتونه به دیتابیس های جدید متصل بشه و اون ها را بهینه کنه؟
——-
سوال 2 : چه مقادیری را باید برای write و read و timeout و dataset قرار داد؟
‘write’ => در اینجا چی قرار داده شود خودش 0 نوشته بود,
‘read’ => در اینجا چی قرار داده شود خودش 1 نوشته بود,
‘dataset’ => ‘اگه این دیتابیس مربوط به پستز .پست متا باشه مثلا بنویسم related_to_posts_postsmeta محدودیتی در این مورد نداره؟ میشه هر چیزی وارد کرد’,
‘timeout’ => زمان تایم اوت اتصال را شما چقدر پیشنهاد میکنید,
در write و read صفر و یک نشانگر چه چیزی هست؟
——-
سوال 3 : دیتابیس اولیه سایت چی میشه؟
چطوری دیتابیس اولیه سایت را باید اتصال داد.
——-
سوال 4 : در وردپرس 4.9.9 یا 5.0 یا 5.2 جواب میده؟
——-
سوال 5 : اسکیمای جدول ها که در یکی از کامنت ها نوشتید چه چیزی هست؟ | میشه توضیح بدهید
با تشکر
سلام
۱. مشکلی نخواهد بود. این پلاگینها متوجه مجزا بودن دیتابیس ها نخواهند شد. البته که تست نکردم این مورد رو اما بعید میدونم موردی باشه
۲. رید و رایت که دسترسی های خواندن و نوشتن هستند. دیتاست رو توضیح دادم داخل مقاله زمان تایم اوت هم بستگی به سرورتون داره
۳. توی wp config تعریف شده و خودش می شناسه اونو
۴. تست نکردم
۵. اینو بخونید: https://www.parsdata.com/glossary/sql-schema
سلام
من برنامه نويسي ام خوب نيست. لطفا ممكن بفرماييد كه كد كال بك را كجا قرار بدهم؟
من مي خواهم كه اطلاعات پوزرها در يك ديتابيس جديد ثبت و نگهداري بشود و از ديتابيس جديد فراخواني شود.
من وردپرس را نصب كردم و يك ديتابيس جديد درست كردم و تيبل هاي user و usermeta را از ديتابيس اصلي به ديتابيس جديد كپي كردم.
نام ديتابيس اصلي madreseh_webinfo
نام ديتابيس جديد حاوي تيبل هاي يوزر madreseh_users
سلام
حقیقتا برای پیاده کردن همچین چیزی نیاز هست که حداقل به PHP و Mysql تسلط داشته باشید و توصیه میکنم اگر تسلط کافی رو ندارید بی خیال این کار بشید
سلام ممنونم مقاله خوب و مفیدی بود
میشه کل دیتابیس رو از یه سایت دیگه خوند ؟ منظورم ما دیتابیسمون رو روی یه هاست دیگه بزاریم ولی سایتمون روی یه هاست دیگه باشه
قسمت رسانه ها در کجا ذخیره میشن ؟ ما فروشگاه فایل راه انداختیم میخوام بدونم فایلامونم توی جایی که دیتابیس هست آپلود میشه ؟
میشه سایت اصلی روی یه هاست دیتابیس یه هاست دیگه و رسانه ها یه هاست دیگه باشه ؟
سلام
بله همه مواردی که گفتید شدنی هستند.
باسلام وعرض ادب و احترام خدمت مهندس مجتبی
بنده یک سایت خبری دارم. سایت بنده به سه زبان می باشد که برای هر زبان یک وردپرس و یک دیتابیس جداگانه دارند.
سایت خبری به زبان فارسی روزانه تقریبا بیش از 200 خبر منتشر می کند. حجم دیتابیس تقریبا یک گیگ می باشد. قابل ذکر است که بنده برای این سایت یک سرور اختصاصی داریم و همچنین از طریق شرکت دسترسی فیزیکی به سرور داریم.
اکنون می خواهم کاری کنم که خبرهای جدیدی که منتشر می شوند در یک دیتابیس جداگانه ذخیره شوند. اما چون سایت مهم است بسیار می ترسم که دست به کاری بزنم که بعدا با مشکلات یا خرابی مواجه بشوم.
این روش شما بسیار عالی می باشد اما چندتا سوال داشتم.
اگر برای جداول posts و یا postmeta که مطالب را منتشر می کنند یک دیتابیس جداگانه درست کنم، مطالبی که قبلا منتشر شده بودند و در دیتابیس اصلی خود هستند چه می شوند؟ آیا از سایت حذف می شوند؟ که اگر حذف بشوند پس این روش مفید نمی باشد.؟؟ آیا مطالب قدیمی که روی دیتابیس اصلی بودند بازهم کار می کنند؟؟ و مطالب جدید که از این به بعد منتشر می کنیم بر روی دیتابیس جدید ذخیره می شوند؟
امیدوارم که درست توانستم منظورم را برسانم و متوجه پیام بنده شده باشید
پیشاپیش از کمک و راهنمایی حضرتعالی سپاسگذارم
سلام
اگر درست متوجه شده باشم باید جدول های پست و پستمتا رو به دیتابیس جدیدتون منتقل کنید. اینجوری پست های قبلی از دست نخواهد رفت
باسلام وعرض ادب
ممنون می شوم اگر امکانش باشد پاسخ سوالات بنده را بدهید و بنده را در این زمینه کمک کنید
پیشاپیش از کمک و پاسخ حضرتعالی سپاسگزارم
سلام ممنونم خیلی مطلب خوبی بود اولین بارم بود چنین چیزی میخوندم
من میخوام اینو برای سایتم اجرا کنم
توی تعدادی زیر پوشه سایت راه اندازی میکنم به این صورت که هر سایت دیتابیسش خارج از هاست اصلی باشه چنین چیزی ممکنه ؟
البته تا جایی که از مطلب فهمیدم برای هر سایت میشه این کار رو کرد ولی میخوام بدونم بنظرتون خوبه این کار رو بکنم ؟
در ضمن من متوجه این بخش نشدم :
$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,
) );
این اطلاعات ورود به هاست هست ؟
فقط مورد آخری رو باید اسم دیتابیس رو بزاریم و ما بقیش رو اطلاعات ورود به هاست ؟
سلام
میشه اما چرا میخواید این کارو بکنید؟
سلام ؛ مطلب خیلی کاربردی و مفیدی بود ممنون
سوال : من توی سایتم با ACF تعدادی فیلد ساختم و قالبم هم انفولد هست . متوجه شدم که هر دو برای ذخیره داده هاشون از جدول postmeta استفاده میکنند.
راه حلی وجود داره که فیلدهای سفارشی ACF در جدول دیگه ای ذخیره بشه تا حجم جدول postmeta بالا نره؟
سلام
ممنونم
خیر ACF تنها توی پست متا ذخیره میکنه
سلام علی حسینی تو سایتش در مورد این موضوع گفته بود. خیلی کنجکاو شدم که چطور ممکنه.
بالاخره امروز تو سایت شما دیدم.
ممنون که نتیجه تلاشتونو اینجا برای بقیه هم منتشر کردین
اگر ویدیو هم تهیه میکردین عالی میشد.
کاش جدای از مزایا, معایب استفاده از این روش رو هم می گفتین.
راستی حجم دیتابیس از چقدر بیشتر نباید بشه؟
سلام خسته نباشید
واقعا ممنون بابت زحمات تون خیلی عالی بود
فقط یک سوال داشتم که ممنون میشم سمپل نمونه بدین بابتش تا از روش من دیتابیس رو درست بکنم
سوالم این هستش که من میخوام چند تا ازجداول وردپرسم رو بخونه به این شکل که از دیتابیس فعلی نمیخوام بخونه مثلا دیتابیس فعلی 1 هست من میخوام جداول hotel_room و hotel_car رو از دیتابیس جدیدم یعنی دیتابیس 2 بخونه ولی باقی جداول رو از دیتابیس 1 بخونه باید چطور اینکارو انجام بدم ممنون میشم یه سمپل بزارین
سلام
وقت بخیر
ممنون از این که این موضوع را مطرح کردین
آیا منبعی سراغ دارید که موارد زیر را پاسخ دهد؟
1- اینکه تا چه تعداد بازدید و حجم محتوا برای وردپرس مناسب هست و بعد از آن وردپرس پاسخگو نیست؟
2- آیا CMS توسعه داده شده که بتواند از افزونه های وردپرس پشتیبانی کند؟ اما مشکلات دیتابیسی وردپرس را نداشته باشد؟
3- به نظرتون وردپرس این مشکل دیتابیسی را حل میکند؟ یا چون خوب شروع نکرده، این را نمیتواند حل کند؟
با تشکر
سلام جناب مهندس
یک سوال داشتم ممنون میشم یک کمکی بفرمایین .
دامنه اصلی که ووکامرس نصبه روش\” domain1.com \” هستش .ولی با توجه به اینکه قالب از php7.2 ساپورت نمیکنه
ما یک دامنه دیگر با نام domain2.ir باز کردیم و” افزونه ای نصب کردیم که میره از ووکامرس سفارش رو میخونه و مدیر پیغام میزنه که مرسوله با شماره پیگیری فلان به پست تحویل داده شد ” .چون این افزونه از راست چین خرید شده است و همانطور که عرض کردم قابلیت اتصال به دامنه اول را ندارد .من چطوری میتونم روی دامنه دوم وردپرس و ووکامرس رو نصب کنم ولی دیتایس دامنه اول رو بخونه و بتونه شماره سفارش رو نشون بده ؟( البته طراح یک کلمه نوشته که نمیشه )
سلام
اصلا توصیه نمیشه این کار رو انجام بدید. ساده ترین راه اینه که ورژن پی اچ پی رو تغییر بدید و اصلا ایده خوبی نیست این کاری که میخواهید انجام بدید.
سلام وقت بخیر
من چند ورد پرس روی یک سایتم ایجاد کردم توی ساب دامنه های مختلف میخوام جدول یوزر ها به هم وصل باشن این کارو هم میشه انجام داد؟
وقتی توی یکی ثبت نام می کنن توی 2 تای دیگه هم ثبت نام بشن
سلام
بله میشه، یکی از کاربردهای این روش دقیقا همین مثالی هست که زدید.
سلام
من چند وردپرس دارم هر کدومش روی یک دیتابیس جداگانه نصبه امکانش هست یوزرهاش باهم ادغام بشن که دیگه نیازی نباشه طرف هم تو ساب دامین ثبت نام کنه هم تو دامنه اصلی ؟
سلام
بله با همین روش میتونید این کارو انجام بدید
سلام وقت بخیر من یه فروشگاه اینترنتی داشتم که بخاطر یکسری از مشکلات مجبور شدم وردبرس رو دوباره نصب کنم ولی وقتی که خواستم از دیتابیس قبلی استفاده کنم اجازه این کار رو نداد میخواستم ببینم که میشه محصولاتی که قبلا تو سایت اضافه کرده بودم رو بازیابی کرد یا باید از اول اضافه کنم