修改mysql配置使博客定时发博文

当前位置 : 首页 > 网页制作 > CSS > 修改mysql配置使博客定时发博文

修改mysql配置使博客定时发博文

来源: 作者: 时间:2016-02-18 10:13
php程序是脚本,只有客户端触发才会执行。而很多网站建设过程中都需要定时功能,比如每天晚上凌晨数据库自动统计数据等。本文要讲述的是利用mysql的事件调度event_scheduler实现定时

  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.

  post_time是博文发布时间,UNIX_TIMESTAMP()是当前时间戳,因为我存的博文时间是时间戳,所以这里和时间戳比较。当当前时间戳大于定时时间(发布时间)时,就把post_status = 1 (数据字段含义,1表示草稿,0表示发布)修改为0。

  因为这个event语句是每隔30秒执行一次,所以博文发布时间最大误差为30秒。

  关于 event的详细介绍,可参考这篇文章:

  http://netzp.blog.sohu.com/103852537.html

Tag:

相关文章

网友评论

<