仲介交易 HTTP://www.aliyun.com/zixun/aggregation/6858.html">SEO診斷 淘寶客 雲主機 技術大廳
php程式是腳本,只有用戶端觸發才會執行。 而很多網站建設過程中都需要定時功能,比如每天晚上淩晨資料庫自動統計資料等。 本文要講述的是利用mysql的事件調度event_scheduler實現定時發博文。
以wordpress博客資料表為例子講解原理(wp很多個人站長都熟悉):
wordpress有個wp_posts表(存放文章,多媒體檔案),這個表有個欄位叫post_status(狀態)。 這個欄位有幾個屬性,其中publish表示發佈,draft表示草稿。 如果能夠自己控制在某個時間點把draft改為publish,那麼這個文章的狀態不就從草稿變成了發佈狀態了麼!
我發現wordpress後臺好像沒有設置定時的選項,因為php本身不支援定時執行。
如果博客要實現定時發信,該如何呢?
①設置mysql事件調度器。 (後文)
②後臺設置草稿後手動資料表post_date欄位。
好了,不忽悠wordpress博主了。 真要這麼做的站長就是個二逼,用windows live writer多方便...
本站用thinkphp寫的,後臺可以定時發佈。 php本身不支援定時執行,所以才有mysql事件調度器的使用。
切入正題,步驟來了~
①打開資料庫管理面板,執行下面的sql。
1SHOW VARIABLES LIKE 'event_scheduler'
如果event_schedules的值是OFF,表示你的資料庫並沒有開啟事件調度器。
②開啟事件調度器。 執行下面的sql。
1SET GLOBAL event_scheduler = ON
在我實驗的時候,發現一個問題。 如果資料庫重啟,那麼event_scheduler又變成了OFF。 哪有一年365天持續穩定的資料庫伺服器呢~~
③ 修改mysql設定檔mysql.ini,預設開啟event_scheduler。
在mysql安裝的資料夾下找到設定檔my.ini,在[mysqld]的下面加上一句:event_scheduler=ON。 這樣mysql在啟動的時候event sheduler就會自動啟動了。
linux系統的mysql設定檔在 /etc 資料夾下,my.cnf檔(windows系統是my.ini檔)。 linux下用 find 命令查找。
④點擊進入需要執行定時的資料表,在此表下執行如下sql。
DROP EVENT IF EXISTS icaigen_post;
CREATE EVENT icaigen_post
ON SCHEDULE EVERY 300 SECOND
DO UPDATE sre_posts SET post_status = 0 WHERE id IN ( SELECT a.id FROM ( SELECT tmp.* FROM sre_posts tmp ) a WHERE a.post_ status = 1 AND (a.post_time - UNIX_TIMESTAMP()) < 0 );
解釋一下:icaigen_post是事件的EVENT的名稱,名字任意取。 第一行代碼的意思是如果之前資料表中存在這個event,則刪掉。
第三行 ON SCHDULE EVERY 300 SECOND 是指每隔300s執行一次後面(DO)的語句。
重點就是這條SQL語句。
1UPDATE sre_posts SET post_status = 0 WHERE id IN ( SELECT a.id FROM ( SELECT tmp.* FROM sre_posts tmp ) a WHERE a.post_st atus = 1 AND (a.post_time - UNIX_TIMESTAMP()) < 0 );
這裡用了一個臨時表,因為mysql不允許在一條語句裡執行查找一個表後在修改這個表,所以用臨時表存儲子集。 這個問題cnblog上有文章專門描述過,我也是從中學到了這點。 參考:
HTTP://www.cnblogs.com/chy1000/archive/2010/03/02/1676282.html
post_time是博文發佈時間,UNIX_TIMESTAMP()是目前時間戳,因為我存的博文時間是時間戳記,所以這裡和時間戳記比較。 當目前時間戳大於定時時間(發佈時間)時,就把post_status = 1 (資料欄位含義,1表示草稿,0表示發佈)修改為0。
因為這個event語句是每隔30秒執行一次,所以博文發佈時間最大誤差為30秒。
關於mysql event的詳細介紹,可參考這篇文章:
HTTP://netzp.blog.sohu.com/103852537.html