zoukankan      html  css  js  c++  java
  • window平台下使用任务计划定时执行php进行数据库处理

    需求背景

    在一个论坛系统中,用户提交的评论如果管理审核才会显示。同时,有这么一个规则,如果此条评论在3天内没有管理员操作,直接删除,我称此行为为“评价过期处理”。


    解决方案

    目前想到的解决方案有:

    1.每次管理请求评论列表页面时,先进行“评价过期处理”,然后再列出评论列表。

    这样做很明显的一个弊端就是效率太低,不考虑。


    2.使用定时任务,比如每天凌晨1点就去执行“评价过期处理”,这种做法是比较好的。

    关于定时任务又有两种做法,一是使用PHP自带的sleep($interval) + while(true)(参考资料:http://blog.csdn.net/webdesman/article/details/4510372

    二是使用操作系统的计划任务。

    第一种的话,占用资源较多,一直开着一个死循环。用户体验不好

    目前,选定了第二种定时任务。



    编写php程序

    这里的程序只是一个示例,并不是一个完整的逻辑。

    connec.php

    <?php
    /**
     *connect.php
     *--
     *by:集成显卡  1053214511@qq.com
     *2011-8-21--下午12:15:20
     */
    header("Content-Type:text/html;charset=UTF-8");
    //定义一组用于链接的参数
    define("MYSQL_SERVER", "localhost:3306");
    define("MYSQL_USER", "root");
    define("MYSQL_PASSWORD", "");
    define("MYSQL_DATABASE", "human");//要链接并使用的数据库名
    define("MYSQL_ENCODE", "UTF8");
    
    /**
     * 获取一个mysql的连接 ,返回这个连接,使用的是默认的设置
     */
    function getMysqlConnection(){
    	//链接数据库
    	$conn=@mysql_connect(MYSQL_SERVER,MYSQL_USER,MYSQL_PASSWORD) or die("链接mysql数据库失败。错误信息:".mysql_error());
    	@mysql_select_db(MYSQL_DATABASE,$conn) or die ("无法找到指定的数据库:".MYSQL_DATABASE." 错误信息:".mysql_error());
    	mysql_query('SET NAMES '.MYSQL_ENCODE,$conn) or die('字符集设置错误'.mysql_error());
    	return $conn;
    }
    ?>

    然后使用链接 log.php:

    <?php
    
    require_once 'connect.php';
    
    /**
     * 获取目前记录数
     */
    function getLogCount(){
    	$sql="select count(*) from api_quote_log";
    	$conn=getMysqlConnection();
    	$result=mysql_query($sql,$conn) or die("sql语句执行出错:".mysql_error());
    	$row=mysql_fetch_assoc($result);
    	return $row['count(*)'];
    }
    
    /**
     * #查询申请日期到当前日期超过3天的记录
     */
    function getLogList(){
    	$logs=array();
    	$sql="select * from api_quote_log as Q where (NOW() > DATE_ADD(Q.addDate,INTERVAL 3 DAY))";
    	$conn=getMysqlConnection();
    	$result=mysql_query($sql, $conn) or die("sql 语句执行出错:".mysql_error($conn));
    	$index=0;
    	while(!!($row=mysql_fetch_array($result,MYSQL_ASSOC))){
    		$logs[$index++]=$row;
    	}
    	return $logs;
    }
    
    $count = getLogCount();
    
    $info = date("Y-m-d H:i:s") . "  当前api_quote_log的记录数为 ".$count."\n";
    $fp = fopen('D:/test.txt','a+');
    
    fwrite($fp, "-----------------------------------------------\n");
    fwrite($fp, $info);
    
    $logList = getLogList();
    foreach ($logList as $l){
    	$info = $l['addDate']." resultCode=".$l['resultCode']."\n";
    	fwrite($fp, $info);
    }
    fwrite($fp, "\n");
    fclose($fp);
    ?>

    这里的文件要使用绝对路径(php文件可以使用相对路径)。


    connect.php 和 log.php 我都放在了 d盘。


    创建计划任务

    以windowXP sp3 为例,进入”控制面板“--》“任务计划”:



    双击“添加任务计划”,在选择运行的应用程序时,选择 php.exe:



    创建完成后:



    接着配置需要执行我们刚刚创建的php文件:


    在运行中输入路径就可以了。



    结果验证

    可以手动运行这个任务计划,打开test.txt:



    运行正确。

  • 相关阅读:
    PHP基本的语法以及和Java的差别
    Linux 性能測试工具
    【Oracle 集群】Linux下Oracle RAC集群搭建之Oracle DataBase安装(八)
    【Oracle 集群】Oracle 11G RAC教程之集群安装(七)
    【Oracle 集群】11G RAC 知识图文详细教程之RAC在LINUX上使用NFS安装前准备(六)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 特殊问题和实战经验(五)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之缓存融合技术和主要后台进程(四)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)
    Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)
  • 原文地址:https://www.cnblogs.com/nerve/p/3185427.html
Copyright © 2011-2022 走看看