【发布时间】:2013-09-06 12:37:01
【问题描述】:
我有一个脚本可以生成我的大数据库的报告数据。
我创建了一个 cron,每周在 Sundat 23:00 生成此报告并将其发送到许多电子邮件。
如果我直接运行脚本(在浏览器中复制 php 脚本的链接并启动它),脚本可以正常工作,因为每个客户端都可以向我发送我想要的电子邮件。
如果 cron 启动脚本,我只收到第一个客户的电子邮件,而不收到另一个客户的电子邮件,我收到的电子邮件数量是正确的,但不是客户的。示例:
我必须有 5 个客户名称:a、b、c、d、e。
如果我直接在浏览器中启动脚本,我会收到:
一封电子邮件
给 b 的一封电子邮件
给 c 的一封电子邮件
给 d 的一封电子邮件
一封电子邮件
如果 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... 这是不可能的。为什么?
【问题讨论】:
-
如果脚本与具有 cronjob 的服务器位于同一台服务器上,为什么不像
/usr/bin/php /path/to/the/script.php一样运行它? -
因为不工作并且 wget 在 cron @mishu 内工作
-
好的,我明白了.. 仅从这部分我看不到在 CLI 中不起作用的部分,除了相对路径和另一种类型的错误处理.. 但你知道你的系统当然:)
-
如何将客户端添加到邮件中?
-
以这种简单的方式,每次都能正常工作 $mail->AddAddress('my_email@my_em.it'); @artmees