PHP 、shell、crontab 执行定时任务

为了实现自动更新网站数据的功能,使用PHP 、shell、crontab 执行定时下载文件、读取文件并更新数据库。

一、思路

1、linux编写shell使用wget下载链接文件。

2、php读取下载的文件并存储数据到数据库。

3、使用linux crontab定时任务执行1、2步骤即可。

代码如下:

1、shell代码

​
​
#!/bin/sh
if 
#wget 下载文件并把文件按照日期重命名
wget -c http://www.****.cn/***/***C?type=productType -O /home/***/$(date -d "today" +"%Y%m%d")productType.txt -o /***/wget.log 
wget -c http://www.****.cn/***/***C?type=product -O /home/***/$(date -d "today" +"%Y%m%d")product.txt -o /***/wget.log
#把下载好的文件复制到PHP项目中
cp /***/$(date -d "today" +"%Y%m%d")productType.txt /***/w***/default/****/upload/$(date -d "today" +"%Y%m%d")productType.txt
cp /***/$(date -d "today" +"%Y%m%d")product.txt /***/upload/$(date -d "today" +"%Y%m%d")product.txt
then 
echo "数据下载成功!">>/***/access.log;
date +%Y%m%d%H%I%S>>/***/access.log
else
echo "数据下载失败!">>/***/error.log;
date +%Y%m%d%H%I%S>>/***/error.log
fi

​

​

2、PHP代码

<?php
/**
 * Created by PhpStorm.
 * User: liang
 * Date: 2017/6/19
 * Time: 15:59
 */

$handler = mysql_connect("localhost", "root", "****");
mysql_select_db("****_products");
mysql_query("SET AUTOCOMMIT=0");//设置为不自动提交,因为MYSQL默认立即执行
mysql_query("BEGIN");//开始事务
if (empty($dopost)) $dopost = "";
$file = "upload/".date("Ymd",time()).'productType.txt';
$get = fopen($file, 'r');//mysql读取文件
if ($get) {
    $del = "DELETE FROM `#@__products_type`";
    $js = $dsql->ExecuteNoneQuery($del);
    while (!feof($get)) {
        $oneline = fgets($get);
        $contents = explode("ξδθ", $oneline);
        $id = $contents[0];
        $name = $contents[1];
        $er = $contents[2];
        $err = $contents[3];
        if ($name == null || $err != null) {
            echo "本条数据格式不正确,上传失败" . '<br/>';
        } else {
            echo $id . "|" . $name . '<br/>';
            $inquery = "INSERT INTO `#@__products_type`(id,name) VALUES ('$id','$name')";
            $dsql->ExecuteNoneQuery($inquery);
        }
    }
} else {
    echo "更新产品类型失败!请使用“上传产品资料”功能更新数据!" . '</br>';
    die;
}
$file = "upload/".date("Ymd",time()).'product.txt';
$fh = fopen($file, 'r');
if ($fh) {
    echo "内容为:" . '<br/>';
    while (!feof($fh)) {
        $oneline = fgets($fh);
        $contents = explode("ξδθ", $oneline);
        $id = $contents[0];
        $progress = $contents[1];
        $testDepartmentID = $contents[2];
        $ProductName = $contents[3];
        $ProductModel = $contents[4];
        $ProductType = $contents[5];
        $ProductTypeName = $contents[6];
        $SendCompany = $contents[7];
        $SendCompanyAddress = $contents[8];
        $SendCompanyZIP = $contents[9];

        $SendCompanyPhone = $contents[10];
        $SendCompanyFax = $contents[11];
        $SendCompanyAtificialPerson = $contents[12];
        $ReportNo = $contents[13];
        $ReportResult = $contents[14];
        $XKZNo = $contents[15];
        $XKZValidDate_Begin = $contents[16];
        $XKZValidDate_End = $contents[17];
        $deleted = $contents[18];
        $er = $contents[19];
        $err = $contents[20];

        if ($deleted == null || $err != null) {
            echo "本条数据格式不正确,上传失败" . '<br/>';
        } else {

            $row = $dsql->GetOne("SELECT id FROM `#@__products` WHERE ReportNo = '$ReportNo'");
            $shuzu = $row['id'];
            echo $id . "|" . $progress . "|" . $testDepartmentID . "|" . $ProductName . "|" . $ProductModel . "|" . $ProductType . "|" . $ProductTypeName . "|" . $SendCompany . "|" . $SendCompanyAddress . "|" . $SendCompanyZIP . "|" . $SendCompanyPhone . "|" . $SendCompanyFax . "|" . $SendCompanyAtificialPerson . "|" . $ReportNo . "|" . $ReportResult . "|" . $XKZNo . "|" . $XKZValidDate_Begin . "|" . $XKZValidDate_End . "|" . $deleted . '<br/>';
            if (!empty($shuzu)) {
                $update = "update `#@__products` SET id='$id',progress='$progress',
		testDepartmentID='$testDepartmentID',
		ProductTypeName = '$ProductTypeName',
		ProductName = '$ProductName',
		ProductModel = '$ProductModel',
		ProductType = '$ProductType',
		SendCompany='$SendCompany',
		SendCompanyAddress = '$SendCompanyAddress',
		SendCompanyZIP='$SendCompanyZIP',	
		SendCompanyPhone = '$SendCompanyPhone',
		SendCompanyFax='$SendCompanyFax',
		SendCompanyAtificialPerson = '$SendCompanyAtificialPerson',
		ReportNo='$ReportNo',
		ReportResult = '$ReportResult',
		XKZNo='$XKZNo',
		XKZValidDate_Begin = '$XKZValidDate_Begin',
		XKZValidDate_End='$XKZValidDate_End',
		deleted = '$deleted'
		WHERE ReportNo = '$ReportNo' ";
                $dsql->ExecuteNoneQuery($update);
            } else {
                $inquery = "INSERT INTO `#@__products`(id,progress,testDepartmentID,ProductName,ProductModel,ProductType,ProductTypeName,SendCompany,SendCompanyAddress,SendCompanyZIP,SendCompanyPhone,SendCompanyFax,SendCompanyAtificialPerson,ReportNo,ReportResult,XKZNo,XKZValidDate_Begin,XKZValidDate_End,deleted) 
 VALUES ('$id','$progress','$testDepartmentID','$ProductName','$ProductModel','$ProductType','$ProductTypeName','$SendCompany','$SendCompanyAddress','$SendCompanyZIP','$SendCompanyPhone','$SendCompanyFax','$SendCompanyAtificialPerson','$ReportNo','$ReportResult','$XKZNo','$XKZValidDate_Begin','$XKZValidDate_End','$deleted')";
                $dsql->ExecuteNoneQuery($inquery);
            }
        }
    }
    mysql_query('COMMIT') or die(mysql_error());//执行事务
} else {
    echo "更新产品数据失败!请使用“上传产品资料”功能更新数据!";
    mysql_query('ROLLBACK') or die(mysql_error());//回滚事务
}
fclose($get);
fclose($fh);

3、定时任务

​每周五上午10点更新数据  *(分)  *(时)  *(日)  *(月)  *(周)
[root@localhost]# crontab  -l
00 10 * * 5 /home/****/***g.sh      
05 10 * * 5 /usr/bin/curl http://www.****.net/****/***.php

​

经过测试更新成功!

转载于:https://my.oschina.net/u/2453589/blog/997725

windows下使用PHP实现定时执行脚本 一直以来,使用PHP定时运行脚本都是让大家头痛的问题,但是我们确实可以利用windows的计划任务来定时调用PHP脚本,当然这还要感谢PHP.exe。下面,站长将向大家介绍,如何来实现。 目标:根据系统时间定时执行PHP脚本,不需要人工运行(这里以定时新建一个文本文件并写入内容为例) 解决步骤: 1、建立PHP脚本,如下: 大家,可以看见,我们在这里对将要创建的文件路径使用了绝对路径,这是因为我们将要通过windows命令行来调用此脚本,由于cmd.exe与我们的web根目录是不一样的,而php的文件目录函数只能在web根目录范围内进行操作,所以我们需要使用绝对路径,否则代码将正确执行但是文件将不会被创建。 2、新建.bat文件,代码如下: "D:\Program Files (x86)\Web\PHP\php.exe" -f "D:\Program Files (x86)\Web\www\root\go.php" 保存,并命名为run.bat。 注意,如果你的PHP目录或web根目录中含有空格,你需要使用引号将整个路径引用起来,否则将运行错误。站长的目录中含有空格,因此使用了引号。创建属于你自己的bat文件时,请根据自身情况决定是否要使用引号和文件的目录。 3、添加windows计划任务 从控制面板中打开计划任务(这里主要针对win7用户进行说明),点击“创建基本任务”,填写名称和描述,然后点击“下一步”,选择任务执行的频率,很好理解,然后点击“下一步”,设置任务的执行时间,然后点击“下一步”,选择“启动程序”,点击“下一步”,点击浏览按钮选择我们建立的“run.bat”文件,点击”下一步“,点击”完成“。 4、运行 根据你设置的时间,系统会定时自动运行,如果你等不及也可以手动执行。在”计划任务“中间栏下方的任务名中查找你刚才新建的任务,鼠标双击该任务,单击右边的运行按钮,系统会弹出一个cmd对话框然后关闭,这说明你的脚本已经正确执行了,到创建文件的目录去检查文件是否创建。 好了,在windows下使用PHP实现计划任务就介绍到这里了,希望对大家有帮助。 (责任编辑:麦田守望者)
taskPHP taskPHP基于php开发的定时计划任务框架,利用多进程实现任务的分配和运行,利用内存共享实现进程间通信,支持多线程模式需要安装pthreads扩展(可选),支持linux和windows。有较好的伸缩性、扩展性、健壮稳定性而被多家公司使用,同时也希望开源爱好者一起贡献。   框架概况 框架目录结构: taskPHP 根目录 |-- core 框架系统目录 | |-- lib 框架核心文件目录 | | |-- .... 众多的框架核心类库文件 | |-- guide.php 框架引导文件 | |-- distribute_listen.php 任务派发进程入口 | |-- worker_listen.php 任务执行进程入口 |-- docs 开发文档存放目录 |-- logs 日志目录 |-- tasks 用户任务目录 | |-- demo demo任务 | | |-- Lib demo任务的扩展目录 | | |-- demoTask.php demo任务类文件 | | |-- config.php demo任务配置文件 | | ... 更多任务 | |-- config.php 全局配置文件 |-- main.php 框架入口文件 |-- windows_single.cmd windows快速启动文件 框架说明 linux下子进程执行任务,修改脚本无需重启后台服务立即生效,windows下修改任务脚本后需重启后台脚本 但往系统添加执行不受影响。 框架支持多线程模式,需要安装pthreads扩展(可选)。 使用内存共享实现进程通信,堵塞式消息队列,整个框架的运行无需第三方扩展。 任务派发及具体任务执行不在同个进程[distribute_listen.php]和[worker_listen.php],windows和linux下启用入口文件[main.php],windows下可运行[windows_single.cmd]快速启动。 执行时间语法跟crontab类似,且支持秒设置。 添加任务简单,只需继承Task基类,实现任务入口run方法。 环境要求 php版本>= 5.5 开启shmop 注意事项 由于任务存在派发时间,所以任务运行的时间可能会有1-2秒的误差。 windows下执行任务在循环里,编写任务有问题或调用exit将导致后台脚本停止,linux下无此问题。 建议生产部署在linux下运行多进程模式,因为运行在多线程模式运行一段时间后报错,pthreads has detected that the core\lib\Pthread could not be started, the system lacks the necessary resources or the system-imposed limit would be exceeded in xxx 文档列表 -->数据库类使用教程 支持(Mysql,Mongo,Oracle,Pgsql,Sqlsrv,Sqllite) -->windows下安装php多线程扩展pthreads教程 -->工具类Utils使用说明 -->http请求客户端类Client使用说明 使用说明 时间配置格式说明: * * * * * * * //格式 :秒 分 时 天 月 年 周 10 * * * * * * //表示每一分钟的第10秒运行 /10 * * * * * * //表示每10秒运行 /1 * 15,16 * * * * //表示 每天的15点,16点的每一秒运行 系统命令说明: main.php [start] 启动 可不带参数 main.php close 结束 main.php reload 重新加载任务 main.php delete demo 删除任务 main.php select 查看任务列表 main.php exec demo 运行任务 主要用于任务开发中调试单个任务 全局配置文件规范 标签:taskphp  计划任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值