มาทำ daily database backup กัน

โพสท์ในหมวด ( , ) โดย ball6847 เมื่อ Tuesday, May 19, 2009

เฮ่อ ไม่รู้จะเอาสาระอะไรมาโพสท์ลงบล็อก ไหนๆก็กำลังทำอะไรเกี่ยวกับการแบ็คอับอยู่ก็เอามาโพสท์ซะเลยดีกว่า

การแบ็คอับที่ว่าก็คือ การอับฐานข้อมูล mysql เก็บไว้เพื่อป้องกันอุบัติเหตุไม่ว่าจากกรณีใดใดที่ทำให้ต้องเสียข้อมูลในฐานข้อมูลไป เพราะงั้นน่าจะมีการแบ็คอับฐานข้อมูลไว้ทุกวัน ซึ่งอาจจะแบ็คอับแล้ว zip เก็บไว้ที่โฮสท์หรืออาจจะส่งเมลล์ ถ้า gmail เราก็มีที่เก็บเยอะหน่อย แต่ไม่แน่ใจเหมือนกันว่า gmail จำกัดขนาด attachment file เท่าไหร่ แต่ช่างมันก่อน วันนี้จะยังไม่ครอบคุลมไปถึงการส่งเมลล์ แต่จะทำแค่เก็บ zip ไฟล์ไว้ในโฮสท์ก่อน (เมื่อมันเริ่มเยอะแล้วค่อยดาว์นโหลดมาไรท์แผ่นเก็บไว้สำรองข้อมูลก็ได้)

โค้ด ไฟล์ db_backup.php สั่งรันวันละครั้งก็พอ ไฟล์ backup จะถูกเก็บไว้ที่โฟลเดอร์เดียวกับ db_backup.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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php
 
 
/*=====================================================================================*/
/* SCRIPT CONFIGURATION */
/*=====================================================================================*/
$mysql['host']    = 'localhost';                    // ussually localhost
$mysql['user']    = '';                         // mysql username
$mysql['pass']    = '';                     // mysql password
$mysql['name']    = '';                    // mysql database name
$mysql['charset'] = 'utf8';                         // connection charset
$file             = date('Y-m-d').'-db_backup.zip'; // will produce file like 2009-05-19-db_backup.zip
 
 
/*=====================================================================================*/
/* DONOT EDIT BEYOND THIS LINE */
/*=====================================================================================*/
 
// show all error
error_reporting(E_ALL);
 
 
// you may need this
//ini_set('max_execution_time',0);
//ini_set('memory_limit','100M');
 
// file name of sql file , will be deleted when backup finished
$sql_file = 'db_backup.sql';
 
// try to create file
if ( ! $fp = @fopen($sql_file,'w'))
{
 die('Cannot create file db_backup.sql please check file permission');
}
 
 
// connect to mysql
$mysql_link = mysql_connect($mysql['host'],$mysql['user'],$mysql['pass']) or die(mysql_error());
mysql_select_db($mysql['name'],$mysql_link) or die(mysql_error($mysql_link));
mysql_query("SET NAMES {$mysql['charset']}",$mysql_link);
 
// close mysql on exit
register_shutdown_function(create_function('$link','if (is_resource($link)) mysql_close($link);'),$mysql_link);
 
 
// list all tables
$tables = array();
$result = mysql_query("SHOW TABLES FROM `{$mysql['name']}`",$mysql_link);
while (($row = mysql_fetch_array($result,MYSQL_NUM)) !== FALSE)
{
 $tables[] = $row[0];
}
mysql_free_result($result);
 
 
// check if have no table
if (count($tables) === 0)
{
 die('No tables in database');
}
 
 
 
function format_insert_value($value)
{
 global $mysql_link;
 return ($value === '') ? "''" : "'".mysql_real_escape_string($value,$mysql_link)."'" ;
}
 
// export each table
foreach ($tables as $table)
{
 $result = mysql_query("SHOW CREATE TABLE `{$table}`",$mysql_link);
 $row = mysql_fetch_array($result,MYSQL_NUM);
 mysql_free_result($result);
 
 if ( ! $row)
 {
  echo 'Cannot create table structure for table "'.$table.'"';
  continue;
 }
 
 $structure = "DROP TABLE IF EXISTS `{$table}`;\n\n";
 $structure .= $row[1].";\n\n";
 
 // write sql table structure to file
 fwrite($fp,$structure);
 
 // get data from table
 $result = mysql_query("SELECT * FROM `{$table}`",$mysql_link);
 while (($row = mysql_fetch_assoc($result)) !== FALSE)
 {
  $row = array_map('format_insert_value',$row);
  $sql = "INSERT INTO `{$table}` VALUES (".implode(',',$row).");\n";
  fwrite($fp,$sql);
 }
 mysql_free_result($result);
}
 
fclose($fp);
 
 
// zipfile
require_once 'dZip.inc.php'; // change this if you put dZip.inc.php on other place
 
$zip = new dZip($file);
$zip->addFile($sql_file,$sql_file);
$zip->save();
 
@unlink($sql_file);
 
die("Database backup finished");

ให้ใส่ข้อมูลในส่วนของ SCRIPT CONFIGURATION ดูตรง charset ดีดีด้วยนะคับ เด๋ว backup ไว้แต่เป็นต่างดาวเด๋วจะเสียเปล่าเอา หากต้องการเซฟไฟล์ backup ไว้ที่อื่นให้แก้ที่ $file นะคับ เช่นอาจจะสร้างโฟลเดอร์ไว้ชื่อว่า backup เราก็แก้

1
2
3
 
// จะได้ประมาณนี้ backup/2009-05-19-db_backup.zip
$file = 'backup/'.date('Y-m-d').'-db_backup.zip';

อาจจะเพิ่มโดเมนเข้าไปในชื่อไฟล์ก็ได้ เผื่อต้องการแยกว่าแบ็คอับไว้มาจากโดเมนไหน

เกือบลืม สคริปท์ข้างบนใช้ dzip class ในการ zip ไฟล์ ดาว์นโหลดได้ตามลิ้งค์ดาว์นโหลดลงมาแล้วเอาไฟล์ dZip.inc.php ไว้ที่เดียวกับไฟล์ db_backup.php หรือเอาไว้ที่อื่นก็เปลี่ยนที่อยู่ที่บรรทัด 104 ด้วยคับ

ไว้โอกาสหน้าอาจจะเพิ่มเติม ทางเลือกในการจัดเก็บอย่างเช่นที่บอกไปแล้วคือส่งเข้า mail หรืออาจจะ ftp ถ้าใครมีพื้นที่รองรับมากพอแต่อยู่ที่โฮสท์อื่น แล้วก็แบ็คอับดาต้าเบสไปแล้ว อาจจะมีภาคต่อเป็นแบ็คอับไฟล์บนเว็บด้วย แล้วแต่โอกาสจะอำนวย

ตอนนี้ผมกำลังพยายามที่จะสร้างสคริปท์ตัวช่วยในการย้ายโฮสท์ ที่ผมคิดว่ามันน่าจะช่วยให้การย้ายโฮสท์ทำได้ไวมากขึ้น แล้วผมจะได้เอาไว้รับจ้างย้ายโฮสท์แบบเร่งด่วน แต่ไว้เด๋วผมจะพูดในรายละเอียดอีกทีนึง

ปัญหาที่เจอในช่วงที่อยู่ระหว่างการ Develope นี้ก็คือ เรื่อง filegroup/fileowner ทำให้ผมอาจจะต้องวางแผนสคิรปท์ใหม่ เพราะเดิมทีผมตั้งใจว่าจะใช้วิธี zip ไฟล์ – ดาว์นโหลด – แตกไฟล์ (อันนี้เป็นเพียงขึ้นตอนการย้ายไฟล์นะ ขั้นตอนจิงๆยังมีขั้นตอนอื่นอีกเช่น db import/export) แต่ปัญหาก็คือไฟล์ใดๆที่ผมแตกไฟล์ด้วย php ไฟล์นั้นจะไม่สามารถ chmod ด้วย FTP ได้ เพราะไฟล์จะมี group/owner ที่แตกต่างกัน

แรกเริ่มแนวคิดของผมก็คือเรื่องความเร็ว ความคงเดิมของเว็บ หรือแม้แต่ file permission ต่างๆก็ด้วย แต่อย่างที่บอกไปว่า unzip ปุ้บ group เปลี่ยน ถ้าลูกค้าไม่สามารรถ chmod ไฟล์ได้ (ในอนาคตลูกค้าอาจต้องการความปลอดภัยมากขึ้น) มันทำให้การใช้งานของลูกค้าจะถูกบีบกรอบแคบเข้ามาอีก ซึ่งตรงนี้ผมก็ต้องชั่งใจเหมือนกัน

ถ้าไม่ zip – download แต่ใช้ ftp upload ตรงๆจะทำให้เสียเวลาในการย้ายมากขึ้นแน่นอน แต่วิธีนี้ก็จะยืดหยุ่นกับผู้ใช้งานมากกว่าด้วย เลยทำให้ไม่รู้จะเอายังงัยดี ถ้า zip – download อันนี้เร็วปรี๊ดแน่นอน

เอางัยดีหว่า

ปล. บางคนที่สามารถใช้งาน shell หรือ ssh ได้ อาจจะคิดว่าสคริปท์แบบนี้ไม่จำเป็น เพราะมันก็ทำได้เหมือนกัน แต่เท่าที่ผมเข้าใจไม่ใช่ทุกโฮสท์ที่จะผู้ใช้งานทั่วไปสามารถใช้งาน shell หรือ ssh ได้ (ที่ใช้ได้ผมว่าเป็นส่วนน้อยด้วยซ้ำ) เลยทำให้คิดแนวทางสคริปท์นี้เพื่อผู้ใช้งานกลุ่มที่ใช้โฮสท์ธรรมดาๆเป็นหลักน่าจะเหมาะกว่า

ปล2. ผมตั้งใจไว้ว่าจะใช้ย้ายโฮสท์เฉพาะ wordpress เท่านั้น แต่ไม่แน่ในอนาคต หากไปได้สวยอาจมีการพัฒนาไปใช้กับ CMS ตัวอื่นแน่นอน เช่น SMF, Social Engine เป็นต้น

ผมว่าต้องมีหลายๆคนที่ใช้ 000webhost.com อยู่แน่เลย ผมว่ามันก็โอเคในระดับนึงนะ โอเคในระดับ Free Host นั่นแหละ อีกอย่างโฮสท์ฟรีของที่นี่สามารถ add domain ได้ ก็เลยเป็นทางเลือกให้คนส่วนใหญ่ไปจด .co.cc มาใช้กับที่นี่กันซะเยอะเลย

ลองคิดดูดีดี การที่จะใช้ 000webhost.com ทำเว็บเพื่อหาเงินนั้นผมว่ามันก็เป็นไปได้นะ อย่างเช่นทำเว็บเพื่อขาย backlinks สิ่งที่ต้องลงทุนก็จะมีแค่โดเมนที่ควรล่อตาล่อใจหน่อย ซึ่งมันก้เป็นสิ่งที่สมควรลงทุนนะกับโดเมน เพราะว่าถ้าเราโปรโมท PR หรือ Ranking จะติดกะโดเมนไปตลอด ส่วนโฮสท์เราจะย้ายยังงัยก็ไม่มีผลอยู่แล้ว นอกจากโฮสท์ใหม่มันอืดจนร่วง

แต่โพสท์นี้ไม่ได้เกี่ยวอะไรกับโดเมนคับ แต่จะเกี่ยวกับการปรับแต่งโฮสท์ฟรีของ 000webhost.com ให้คนเข้าไม่รู้ว่าเรากำลังจับเสือมือเปล่าอยู่ เพราะมีอะไรหลายๆอย่างที่มันย้อนกลับไปทำให้รู้ได้ว่านี่คือโฮสท์ฟรี หรือบางอย่างมันก็รบกวนการเขียนสคริปท์ของเราซะจริงๆ

เอาหล่ะ เท่าที่ผมลองเล่นๆดูผมเห็นบางอย่างทื่มันเป็นปัญหาสำหรับผม
1. คือ 000webhost.com จะเพิ่ม javascript tracking code ต่อท้ายเว็บของเราซึ่งผมไม่ชอบเด๋วผมจะเอาออก
2. หากมี error ในสคริปท์จะมีลิ้งค์ของ 000webhost.com มาแสดง อันนี้ผมจะเอาออกเหมือนกัน
3. หากไฟล์ที่เรียกไม่มีอยู่ มันจะรีไดเร็คไป 000webhost.com เด๋วผมจะใช้หน้า 404 ของผมเอง
5. $_SERVER[’DOCUMENT_ROOT’] ของ 000webhost.com ไม่ได้เป็นอย่างที่มันควรจะเป็น ผมจะเปลี่ยนให้มันเป็นอย่างที่มันควรจะเป็น
6. 000webhost.com เปิด register_global ซึ่งไม่ปลอดภัยครับ ผมจะปิดมันซะ

เกือบทั้งหมดนี้จะจัดการผ่านไฟล์ .htaccess ครับผม

.htaccess

1
2
3
4
5
6
7
8
9
php_value auto_prepend_file /home/[username]/public_html/auto_prepend.php
php_value auto_append_file /home/[username]/public_html/auto_append.php
php_value register_globals Off
php_value error_prepend_string ' '
php_value error_append_string ' '
 
 
# 404 Control
ErrorDocument 404 /404.php

auto_prepend.php

1
2
3
<?php
 
$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__);

auto_append.php (ไฟล์เปล่าๆ)

1
 

404.php

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>404 File not found</title>
</head>
<body>
	<h1>404 File not found</h1>
	<p><?=$_SERVER['REQUEST_URI']?> does not exists on this server.</p>
</body>
</html>

เอาไฟล์ทั้งหมดนี้ไว้ที่ root หน่ะคับ หลักการก็คือการเซ็ต php configuration ผ่าน .htaccess ไฟล์ ซึ่งผมทำการเปลี่ยนค่าที่ host เค้า config ไว้ ตรงที่อยู่ของไฟล์จำเป็นต้องใช้ path เต็มนะ ก็แทน [username] ด้วย username ของ 000webhost เลยคับ แต่ผมไม่แน่ใจว่าถ้า add domain แล้ว path จะเปลี่ยนไปรึเปล่านะ ไว้จะหามาลองอีกที

ไฟล์ 404.php เป็นหน้า 404 ที่เราจะเอาไปแสดงถ้าไม่มีไฟล์นั้นๆนะคับ จะเขียนให้หน้าตาออกมายังงัยก็ได้ครับ แล้วแต่ความต้องการของแต่ละคนคับ

เพื่อน กุยังรักมรืงอยู่ว่ะ

โดย ball6847 เมื่อ Friday, May 15, 2009

ขอไร้สาระ บ่นไปเรื่อยๆสักโพสท์นะครับ ผมไม่รู้จะระบายที่ไหนแล้ว เมื่อปีที่แล้วผมดันไปหลงรักผู้หญิงคนนึง ผมจะไม่พูดถึงที่ไปที่มานะ เพราะมันยิ่งพูดก็ยิ่งช้ำ เอาเป็นว่ามันจบลงด้วยการเข้าใจตรงกัน และเข้าใจกันด้วยดี ว่าอันที่จริงผมมันรักเค้าข้างเดียว แล้วเค้าก็คงไม่ได้เคยรักผมในแบบที่ผมเข้าใจ ซึ่งวันที่ได้เข้าใจนั้นเธอบอกว่า ที่ผ่านมาเธอคิดกับผมแค่ “เพื่อนเท่านั้น”

ผมก็เข้าใจนะ ผมคงไม่ได้เป็นคนดีในแบบที่เธอต้องการ ผมก็เลยเป็นคนที่ “ไม่ใช่” ก็รู้ว่าบังคับจิตใจกันไม่ได้ ผมเลยคิดแค่ว่า “แค่เพื่อนก็ดีเท่าไหร่แล้วหล่ะ” จากนั้นผมก็เลิกตอแยเธออีก รอเพียงเมื่อเธอต้องการผม แล้วเธอจะโทรมาหาผมเอง ผมก็จะคอยฟังเรื่องที่เค้าไม่สบายใจอยู่เสมอก็จะโทรมาหาผมเพื่อระบาย ซึ่งผมก็ไม่ได้คิดว่ามันเป็นเรื่องน่ารำคาญอะไรนะ เพราะความจริงแล้ว ผ่านมาเกือบครึ่งปี ถึงเราจะเป็นเพื่อนกัน “แต่ผมก็ยังคงรักเธออยู่เหมือนเดิม” ยังคงเป็นห่วงเธออยู่เสมอ แต่เพียงแค่แสดงออกมากไม่ได้เท่านั้นเอง บางทีมีงานอะไรมาให้ผมช่วยทำโน่นนี่ให้ ผมก็จะทำเป็นบ่น แต่จนแล้วจนรอดผมก็จะทำให้เสมอ หรือบางทีผมก็จะรู้สึกไม่ดีทุกครั้งที่เธอพูดถึงชายคนอื่น (ก็แน่หล่ะ ยังรักอยู่นิ แต่ก็ไม่ได้แสดงอาการอะไรออกไป ได้แต่อวยพรว่าขอให้โชคดี)

ผมไม่รู้จะพูดยังงัยนะ จะบอกไปก็ไม่ได้ว่า “ผมยังรักเธออยู่” เพราะถ้าบอกไปทั้งเธอและผมก็จะรู้สึกผิดด้วยกันทั้งคู่ ผมจะรู้สึกผิดที่จะทำให้เธอไม่สบายใจ ส่วนเธอจะรู้สึกผิดที่ทำให้ผมมีอาการอย่างนี้

บางทีที่ผมยังรักเธออยู่อาจเป็นเพราะว่าผมยังไม่เจอใครคนอื่นมั้ง ความจริงก็มีนะ ผมน่ะมีอาการแบบนี้ก็ต้องการคนพูดคนคุยด้วย แต่เจอประเภทที่พ่อแง่แม่งอน อันนี้บอกตรงๆว่ามันทำให้ผมเครียดหนักกว่าเดิม เลยทำให้ผมคิดไปว่า จะรักคนอื่นไม่ได้แล้วหรอว่ะเนี่ย

ความรักที่ผมมีให้อาจจะไม่ใช่รักแท้ แต่ผมเชื่อว่า ผมคงยังรัก และเป็นห่วงเธอไปอีกนาน

“เพื่อน กุยังรักมึงอยู่ว่ะ ดูแลตัวเองดีดีนะเว้ย กุเป็นห่วง”

setcronjob.com เว็บ free cronjob

โดย ball6847 เมื่อ Thursday, May 14, 2009

ผมเคยโพสท์ในบอร์ดถึงเว็บ Free Webbase Cronjob (webcron.org) ซึ่งตอนนั้นมันฟรี แต่ตอนนี้เค้าเก็บตังแล้ว ผมเลยหาเว็บอื่น หาไปหามามาเจอเว็บ setcronjob.com เท่าที่ทดลองใช้ถือว่าโอเคเลย ใครจำเป็นต้องใช้ cronjob ก็ลองใช้ดูนะ