大きなデータベースのレポート データを生成するスクリプトがあります。
毎週 Sundat の 23:00 にこのレポートを生成し、多くの電子メールに送信する cron を作成しました。
スクリプトを直接実行すると (ブラウザ内で php スクリプトのリンクをコピーして起動すると)、スクリプトは正常に動作し、クライアントごとに必要なメールが送信されます。
cron がスクリプトを開始すると、最初のクライアントの電子メールのみを受信し、他のクライアントの電子メールは受信しません。クライアントの電子メールではなく正しい数の電子メールを受信します。例:
5 つのクライアント名が必要です: a、b、c、d、e。
ブラウザでスクリプトを直接起動すると、次
のメールが届きます。 a に 1 つのメール
b に
1 つのメール c に
1 つのメール d に
1 つのメール
cron が受け取ったスクリプトを起動した場合
:
それはどのように可能ですか?脚本はそのまま!cron スクリプトは crontab 内にあります。
0 23 * * 0 root wget http://127.0.0.1/reports/generate_reports_settimanale.php
もう 1 つの考慮事項は、大量のデータと多数のクライアントがあるため、このスクリプトに約 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では動作しないということは不可能だからです...それは不可能です。なんで?