1

我有一个脚本可以生成我的大数据库的报告数据。
我创建了一个 cron,它每周在 Sundat 的 23:00 生成此报告并将其发送到许多电子邮件。
如果我直接运行脚本(在浏览器中复制 php 脚本的链接并启动它),脚本可以正常工作,因为每个客户端都会向我发送我想要的电子邮件。

如果 cron 启动脚本,我只收到第一个客户的电子邮件,但没有收到另一个客户的电子邮件,我收到的电子邮件数量是正确的,但不是客户的。示例:
我有 5 个客户名称:a、b、c、d、e。
如果我直接在浏览器中启动脚本,我会收到:
一封电子邮件 a
一封电子邮件 b
一封电子邮件 c
一封电子邮件 d
一封电子邮件 e

如果 cron 启动我收到的脚本:
5 封电子邮件

这怎么可能?剧本是一样的!cron 脚本在 crontab 中:

0 23    * * 0   root    wget http://127.0.0.1/reports/generate_reports_settimanale.php

另一个考虑因素是这个脚本大约需要 30 分钟或更长时间,因为我有大量数据和许多客户端。

PHP中的脚本非常大,我删掉了部分数据计算器。

<?php
$db = DataManager::_getConnection();
ini_set("include_path", "../inc/phpmailer/");
require("class.phpmailer.php");
ini_set("memory_limit","64M");

//-----------------------------------REPORT SETTIMANALE------------------------------------------

$qry_inv = $db->query("SELECT * FROM customer WHERE ntype > 0 AND report_settimanale='1' ORDER BY name ASC");
while( $inv = $qry_inv->fetch_array() ) {
    //check if table exists
    $qry_tb = $db->query("SHOW TABLES LIKE 'chart_voltage_".$inv['id']."_".date('Y')."'");
    if($qry_tb->num_rows > 0){
        //saving the excel sheet
        //...
        //sending the emails
        $yourName = 'CLIENT';

        $mail = new PHPMailer();

        $mail->From     = 'email@email.com';
        $mail->FromName = 'Saeg';
        $mail->AddAddress('my_email@my_em.it'); 

        $mail->AddAttachment('/var/www/reports/my_reports.xls');

        $mail->WordWrap = 50;                              // set word wrap
        $mail->IsHTML(true);                               // send as HTML

        $mail->Subject  =  'Riepilogo settimanale dal '.$week_start_title.' al '.$week_end_title;

        $mail->Body     =  "Riepilogo settimanale dell'impianto: ".utf8_decode($inv['name']);

        $mail->AltBody  =  "Riepilogo settimanale dell'impianto: ".utf8_decode($inv['name']);

        if ( $mail->Send()){
            //ok
        }
        else{
        ?>
            <script type="text/javascript">
                alert('<?php echo ("ERROR");?>');
                window.close();
            </script>
        <?php
        }
    }
}

exit;

?>

我不知道问题是否出在脚本的持续时间...因为这是不可能的如果我在浏览器中启动它可以正常工作并且使用 cron 不是...这是不可能的。为什么?

4

1 回答 1

2

没有明显的理由说明代码在 wget 而不是浏览器上的行为会有所不同。

您的代码中没有任何工具来记录它在做什么——这可能会为您提供关于它为什么失败的线索。作为最低要求,您应该确保您的 php 配置记录了错误,并检查相关日志是否有错误。

然而,期望持续 30 分钟的 HTTP 请求成功是相当乐观的。如果您可以在机器上设置 cron 作业,那么直接调用脚本而不是通过 Web 服务器和 http 客户端调用脚本会更有意义:

0 23 * * 0   root /usr/bin/php -q /var/www/html/reports/generate_reports_settimanale.php

(将 /var/www/html 替换为您的文档根目录)。

于 2013-09-03T11:35:51.660 回答