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:



    运行正确。

  • 相关阅读:
    复制书稿(book) (二分,贪心+dp)
    spark0.9.1集群模式执行graphx測试程序(LiveJournalPageRank,新增Connected Components)
    java 的File文件
    最长公共字序列.cpp
    产品级敏捷开发关键的第一步: 制订版本号公布的节奏
    MySQL优化之——触发器
    Android 打造随意层级树形控件 考验你的数据结构和设计
    【Android】Android聊天机器人实现
    Mysql用户权限管理
    Android经常使用的工具类
  • 原文地址:https://www.cnblogs.com/nerve/p/3185427.html
Copyright © 2011-2022 走看看