修改mysql配置使博客定时发博文
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_status = 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
补充:web前端 , HTML/CSS ,