Bəzi veb saytlarda fayl sistem aylarla sabit qalır, dəyişikliklərə gərək olmur, bütün olub bitənlər verilənlər bazasında baş verir. Belə veb saytlarda verilənlər bazasının müntəzəm nüsxəsini almaq daha prioritet məsələ olur, nəinki bütün fayl sistem. Təbii ki, həm fayl sistemi, həm verilənlər bazası, həm də server parametr fayllarının backup nüsxəsini almaq ümumən zəruridir və bunlar üçün necə lazımdır həllər mövcuddur. Bu yazıda məqsəd sadəcə verilənlər bazası üçün çevik, asan, əlavə proqram, modul qoşmadan asan nüsxəçıxarma həlli yazmaqdır.
1-ci funksiyamız verilənlər bazasının backup nüsxəsini alacaq.
2-ci funksiyamız bu nüsxəni kənar bir serverimizə göndərəcək(zira backup nüsxəni sayt ilə eyni serverdə saxlamaq risk daşıyır və mahiyyətə ziddir).
3-cü funksiyamız isə bu prosesi avtomatlaşdıracaq.
Əvvəlcə əvvəli open source mənbələrdən gələn, üstündə özümə lazım olan dəyişiklikləri etdiyim mysql bazasını backup edən funksiyana baxaq:
function backup_tables($filename, $host, $user, $pass, $name, $tables = ‘*’)
function backup_tables($filename, $host, $user, $pass, $name, $tables = '*') { //... }
2-ci funksiyamız isə bu alınan nüsxəni ftp ilə kənar bir serverə yola salır.
function upload_to_ftp($ftp_hostname, $ftp_user, $ftp_pass, $remote_file, $file) { //... }
Qalır bu iki funksiyanı tam daxil edib lazımınca işlətmək. Tam kodu daxil edək:
<?php $dir_remote = '/path/to/remote/ftp/directory/'; $file = 'db-backup-' . time() . '.sql.gz'; $remote_file = $dir_remote . $file; backup_tables($file, 'localhost', 'db_user', 'db_padd', 'db_name'); upload_to_ftp('ftp_hostname', 'ftp_user', 'ftp_pass', $remote_file, $file); function upload_to_ftp($ftp_hostname, $ftp_user, $ftp_pass, $remote_file, $file) { $conn_id = ftp_connect($ftp_hostname); $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass, $remote_file, $file); if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) { echo "Success!\n"; } else { echo "Some problem occured\n"; } ftp_close($conn_id); unlink($file); } function backup_tables($filename, $host, $user, $pass, $name, $tables = '*') { $return = ''; $link = mysql_connect($host, $user, $pass); mysql_select_db($name, $link); if ($tables == '*') { $tables = array(); $result = mysql_query('SHOW TABLES'); while ($row = mysql_fetch_row($result)) { $tables[] = $row[0]; } } else { $tables = is_array($tables) ? $tables : explode(',', $tables); } foreach ($tables as $table) { $result = mysql_query('SELECT * FROM ' . $table); $num_fields = mysql_num_fields($result); $return .= 'DROP TABLE ' . $table . ';'; $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE ' . $table)); $return .= "\n\n" . $row2[1] . ";\n\n"; for ($i = 0; $i < $num_fields; $i++) { while ($row = mysql_fetch_row($result)) { $return .= 'INSERT INTO ' . $table . ' VALUES('; for ($j = 0; $j < $num_fields; $j++) { $row[$j] = addslashes($row[$j]); $row[$j] = preg_replace("/\n/","/\\n/",$row[$j]); if (isset($row[$j])) { $return .= '"' . $row[$j] . '"'; } else { $return .= '""'; } if ($j < ($num_fields - 1)) { $return .= ','; } } $return .= ");\n"; } } $return .= "\n\n\n"; } $return = gzencode($return, 6); $handle = fopen($filename, 'w'); fwrite($handle, $return); fclose($handle); }
Verilən kodda şərti verilən
‘/path/to/remote/ftp/directory/’, ‘db_user’, ‘db_padd’, ‘db_name’, ‘ftp_hostname’, ‘ftp_user’, ‘ftp_pass’
kimi sətirləri real parametrlərlə əvəz etməklə skripti işlək hala gətirmiş olarıq.
Qaldı bu prosesin avtomalaşdırılmasına:
Bunu iki hal üçün təsvir edək:
1. WordPress saytımız var və bunu WordPress ilə edirik.
Yuxarıdakı kodu backuper.php adı ilə cari theme qovluğuna daxil edirik (kənar müdaxilələrdən qorumaq üçün ilk sətrinə
if ( ! defined( ‘WPINC’ ) ) die;
yazmaq yaxşı olar)
Theme-in functions.php-sində belə bir kod yaza bilərik:
if ( ! wp_next_scheduled( 'my_backuper' ) ) { wp_schedule_event( time(), 'daily', 'my_backuper' ); } add_action( 'my_backuper', 'my_backuper_function' ); function my_backuper_function() { require(get_template_directory()."/backuper.php"); }
Bu halda sutkada bir dəfə backup nüsxə çıxarılıb kənar ftp serverə göndəriləcək.
2. Serverə giriş imkanınız var və bunu Cron Jobs ilə edirik.
Bu halda backuper.php-ni serverdə hər hansı bir şəxsi qovluğa atırıq(kənar müdaxilələr mümkün olmasın deyə) və aşağıdakı sadə cron jobs yaradırıq:
00 12 * * * php /path/to/backuper.php
Vəssalam. Bununla da verilənlər bazasını günlük avtomatik nüsxələyib kənar serverə göndərmək üçün fərdi həllimiz hazır oldu.
Eyni məntiqlə alınan backup-ı ftp əvəzinə şəxsi Dropbox bulud fayl sistemimizə də göndərə bilərik, bu halda ftp funksiya əvəzinə Dropbox API-nin upload funksiyasını istifadə etmək lazım olar.