PHP 、shell、crontab 执行定时任务

本文介绍了一种使用PHP和Shell脚本结合crontab实现自动更新网站数据的方法。具体包括通过wget下载远程文件、解析文件内容并更新MySQL数据库的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了实现自动更新网站数据的功能,使用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

经过测试更新成功!

### 解析 crontab 定时任务执行中断的原因 Crontab 定时任务未能正常执行可能由多种因素引起。新创建的任务至少需等待两分钟后才会首次触发[^1]。此外,环境变量差异、路径设置不当以及命令本身的错误都可能导致任务无法成功完成。 #### 环境配置不一致 当从交互式环境中直接运行脚本一切正常,而放置于 crontab 后却出现问题时,通常是因为两者所处的工作环境不同所致。交互模式下默认加载了用户的 shell profile 和其他初始化文件,这些文件定义了一系列环境变量;然而,在非交互式的 cron 进程中并不会自动读取此类配置[^2]。 为了确保一致性,建议显式指定所需的所有环境参数: ```bash SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin HOME=/ ``` #### 路径与权限问题 确认所有涉及的文件和目录具有适当访问权限,并且绝对路径被用于调用程序及其依赖资源。特别是对于 PHP 类型的任务来说,还需留意生成的日志文件夹归属权是否正确分配给目标用户(例如 `www`),以防止因权限不足而导致操作失败[^3]。 #### 日志记录分析 利用日志可以帮助诊断具体哪里出了差错。通过检查 `/var/log/cron` 可知某项作业是否有被执行或是遇到了什么异常状况。另外,也可以考虑将标准输出重定向至特定位置以便后续审查[^5]。 ```bash * * * * * /path/to/script.sh >> /home/user/logs/output.log 2>&1 ``` 上述例子展示了如何捕获并保存每次调度的结果信息,其中包含了任何可能出现的标准错误流数据。 #### 特殊字符处理 需要注意的是某些特殊符号在 crontab 表达式中有特别意义,像 `%` 就是用来分隔多行输入的标记符。因此如果要在命令字符串内部使用百分号,则应先对其进行转义以免造成解析上的混乱。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值