1. 程式人生 > >MySQL發郵件的功能新增

MySQL發郵件的功能新增

      最近專案上要求實現一個功能,通過資料庫,這裡是MySQL 5.7.12,能夠呼叫外部程式,傳送賬單郵件給客戶,在網上找了好久資料,並諮詢了一些同事,最後終於找到了方法,這裡參考了張宴大牛的一篇文章,並且結合自己的理解修改了一些內容,最終實現了這麼一個功能。實現上借鑑了這個,功能上修改了一下mysql-udf-http的功能程式碼就OK了。這裡對於該檔案的修改不能上傳,不過也不難,主要的就是下面的思路!

      使用環境:Linux作業系統,支援的MySQL版本:5.1.x 和 5.5.x。5.0.x未經測試。


  一、REST架構風格:

  REST(Representational State Transfer)是一種輕量級的Web Service架構風格,其實現和操作明顯比SOAP和XML-RPC更為簡潔,可以完全通過HTTP協議實現,還可以利用快取Cache來提高響應速度,效能、效率和易用性上都優於SOAP協議。REST最早是由 Roy Thomas Fielding 博士2000年在論文《
Architectural Styles and the Design of Network-based Software Architectures
》中提出的,中文譯文全文PDF點此下載。另外,有篇譯文對REST做了一個簡化說明。

  目前,REST架構風格的常見實現是基於HTTP協議及其四種基本方法(如POST、GET、PUT和DELETE)的。有人將HTTP協議的四種方法與CRUD原則相對應,CRUD原則對於資源只需要四種行為:Create(建立)、Read(讀取)、Update(更新)和Delete(刪除)就可以完成對其操作和處理。

  點選在新視窗中瀏覽此圖片

  點選在新視窗中瀏覽此圖片

  在Mysql-udf-http中,四個函式http_post()、http_get()、http_put()、http_delete()分別對應HTTP協議的POST、GET、PUT、DELETE四種方法。

  REST是一種架構風格,而不是協議或標準。HTTP協議“POST、GET、PUT、DELET”四種方法與CRUD原則“Create、Read、Update、Delete”四種行為的一一對應關係只是一種架構設計習慣,而不是規範。因此,POST方法也可以用來更新資源,PUT方法也可以用來建立資源,這就要看具體應用程式作者的定義了。例如
Tokyo Tyrant
除了支援Memcached協議外,還支援REST方式存取,PUT代表建立和更新,GET代表讀取,DELETE代表刪除(關於Tokyo Tyrant的安裝使用請點選這兒)。

  目前國內外流行的Web 2.0應用API介面中,很多都支援REST架構風格。例如:新浪微博開放平臺人人網API、Google OpenID、Flickr、Twitter、eBay、Facebook、Last.fm、del.icio.us、Yahoo Search、Amazon S3、Amazon EC2、Digg、Microsoft Bing、FriendFeed、PayPal、Foursquare,
更多...


  當記錄數成百上千萬條時,通常採用 MySQL 分表減低資料庫壓力。但是,全部資料按點選數、精華、積分排序顯示等功能,在MySQL 分表中則無法實現。編寫 Mysql-udf-http 的最初目的,是為了在專案開發中,將 MySQL 各分表的資料自動同步到我們的TCSQL 高速列表資料庫,用來做列表查詢、顯示,內容頁則根據ID直接查詢各 MySQL 分表的內容。由於HTTP協議的通用性,通過 Mysql-udf-http 可以做更多的事情。

  通過Mysql-udf-http,你可以在MySQL中利用觸發器,將MySQL的資料同步到支援REST的應用上。例如你有一個獨立部落格,你可以在文章表建立MySQL觸發器,這樣,在發表文章時,就可以將文章標題、URL自動同步到新浪微博、Twitter。你想用Tokyo Tyrant 做快取,也可以利用MySQL觸發器在發生增、刪、改時,將資料自動同步到Tokyo Tyrant。詳細配置方法本文第4節中會有介紹。


  二、Mysql-udf-http的安裝與使用:

  1. 在Linux系統上安裝Mysql-udf-http

  注意:“/usr/local/webserver/mysql/”是你的MySQL安裝路徑,如果你的MySQL安裝路徑不同,請自行修改。
ulimit -SHn 65535
wget http://curl.haxx.se/download/curl-7.21.1.tar.gz
tar zxvf curl-7.21.1.tar.gz
cd curl-7.21.1/
./configure --prefix=/usr
make && make install
cd ../

echo "/usr/local/webserver/mysql/lib/mysql/" > /etc/ld.so.conf.d/mysql.conf
/sbin/ldconfig
wget http://mysql-udf-http.googlecode.com/files/mysql-udf-http-1.0.tar.gz
tar zxvf mysql-udf-http-1.0.tar.gz
cd mysql-udf-http-1.0/
./configure --prefix=/usr/local/webserver/mysql --with-mysql=/usr/local/webserver/mysql/bin/mysql_config
make && make install
cd ../



  2. 通過命令列登陸進入MySQL

/usr/local/webserver/mysql/bin/mysql -S /tmp/mysql.sock



  3. 建立MySQL自定義函式

  mysql>
  1. createfunction http_get returns string soname 'mysql-udf-http.so';  
  2. createfunction http_post returns string soname 'mysql-udf-http.so';  
  3. createfunction http_put returns string soname 'mysql-udf-http.so';  
  4. createfunction http_delete returns string soname 'mysql-udf-http.so';  


  4. 使用方法

  I. 函式描述:


  mysql>
  1. SELECT http_get('<url>');  
  2. SELECT http_post('<url>''<data>');  
  3. SELECT http_put('<url>''<data>');  
  4. SELECT http_delete('<url>');  

  II. 示例 A:

  mysql>
  1. /* HTTP GET、POST方式提交關鍵詞“xoyo”到百度移動搜尋 */  
  2. SELECT http_get('http://m.baidu.com/s?word=xoyo&pn=0');  
  3. SELECT http_post('http://m.baidu.com/s','word=xoyo&pn=0');  
  4. /* 新浪微博開放平臺:獲取新浪使用者ID為103500的最近一條微博內容 */  
  5. SELECT http_get('http://api.t.sina.com.cn/statuses/user_timeline/103500.json?count=1&source=1561596835'AS data;  
  6. /* 新浪微博開放平臺:發表一條微博 */  
  7. SELECT http_post('http://your_sina_uid:[email protected]/statuses/update.xml?source=1561596835''status=Thins is sina weibo test information');  
  8. /* Tokyo Tyrant 寫入、讀取、刪除操作 */  
  9. SELECT http_put('http://192.168.8.34:1978/key''This is value');  
  10. SELECT http_get('http://192.168.8.34:1978/key');  
  11. SELECT http_delete('http://192.168.8.34:1978/key');  

  III. 示例

  通過MySQL觸發器,利用mysql-udf-http和第三方UDF函式lib_mysqludf_json,自動同步資料到 Tokyo Tyrant。

  (1). 下載安裝 lib_mysqludf_json 修改版:


  以下安裝包適合32位Linux作業系統:
wget http://mysql-udf-http.googlecode.com/files/lib_mysqludf_json-i386.tar.gz
tar zxvf lib_mysqludf_json-i386.tar.gz
cd lib_mysqludf_json-i386/
# 如果你的MySQL安裝路徑不是/usr/local/webserver/mysql/,請修改以下路徑。
cp -f lib_mysqludf_json.so /usr/local/webserver/mysql/lib/mysql/plugin/lib_mysqludf_json.so
cd ../


  以下安裝包適合64位Linux作業系統:
wget http://mysql-udf-http.googlecode.com/files/lib_mysqludf_json-x86_64.tar.gz
tar zxvf lib_mysqludf_json-x86_64.tar.gz
cd lib_mysqludf_json-x86_64/
# 如果你的MySQL安裝路徑不是/usr/local/webserver/mysql/,請修改以下路徑。
cp -f lib_mysqludf_json.so /usr/local/webserver/mysql/lib/mysql/plugin/lib_mysqludf_json.so
cd ../


  通過命令列登陸進入MySQL:
/usr/local/webserver/mysql/bin/mysql -S /tmp/mysql.sock

  mysql>
  1. createfunction lib_mysqludf_json_info returns string soname 'lib_mysqludf_json.so';  
  2. createfunction json_array returns string soname 'lib_mysqludf_json.so';  
  3. createfunction json_members returns string soname 'lib_mysqludf_json.so';  
  4. createfunction json_object returns string soname 'lib_mysqludf_json.so';  
  5. createfunction json_values returns string soname 'lib_mysqludf_json.so';  
  lib_mysqludf_json的詳細用法請訪問:http://www.mysqludf.org/lib_mysqludf_json/

  (2). 建立測試表

  mysql>
  1. SET NAMES UTF8;  
  2. USE test;  
  3. CREATETABLE IF NOT EXISTS `mytable` (  
  4.   `id` int(10) NOTNULL AUTO_INCREMENT,  
  5.   `addtime` int(10) NOTNULL,  
  6.   `title` varchar(255) CHARACTERSET utf8 NOTNULL,  
  7.   PRIMARYKEY (`id`)  
  8. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;  

  (3). 為測試表建立觸發器:

  mysql>
  1. /* INSERT插入操作的觸發器 */  
  2. DELIMITER |  
  3. DROPTRIGGER IF EXISTS mytable_insert;  
  4. CREATETRIGGER mytable_insert  
  5. AFTERINSERTON mytable  
  6. FOR EACH ROW BEGIN
  7.     SET @tt_json = (SELECT json_object(id,addtime,title) FROM mytable WHERE id = NEW.id LIMIT 1);  
  8.     SET @tt_resu = (SELECT http_put(CONCAT('http://192.168.8.34:1978/', NEW.id), @tt_json));  
  9. END |  
  10. DELIMITER ;  
  11. /* UPDATE更新操作的觸發器 */  
  12. DELIMITER |  
  13. DROPTRIGGER IF EXISTS mytable_update;  
  14. CREATETRIGGER mytable_update  
  15. AFTERUPDATEON mytable  
  16. FOR EACH ROW BEGIN
  17.     SET @tt_json = (SELECT json_object(id,addtime,title) FROM mytable WHERE id = OLD.id LIMIT 1);  
  18.     SET @tt_resu = (SELECT http_put(CONCAT('http://192.168.8.34:1978/', OLD.id), @tt_json));  
  19. END |  
  20. DELIMITER ;  
  21. /* DELETE刪除操作的觸發器 */  
  22. DELIMITER |  
  23. DROPTRIGGER IF EXISTS mytable_delete;  
  24. CREATETRIGGER mytable_delete  
  25. AFTERDELETEON mytable  
  26. FOR EACH ROW BEGIN
  27.     SET @tt_resu = (SELECT http_delete(CONCAT('http://192.168.8.34:1978/', OLD.id)));  
  28. END |  
  29. DELIMITER ;  

  (4). 將 MySQL 表和 Tokyo Tyrant 關聯進行查詢:

  mysql>
  1. SELECT id,addtime,title,http_get(CONCAT('http://192.168.8.34:1978/',id)) AS tt FROM mytable ORDERBY id DESC LIMIT 0,5;  


  5. 如何刪除mysql-udf-http UDF函式:

  mysql>
  1. dropfunction http_get;  
  2. dropfunction http_post;  
  3. dropfunction http_put;  
  4. dropfunction http_delete;