【发布时间】:2014-11-15 04:04:19
【问题描述】:
我正在尝试运行执行以下 PHP 代码的 cron 作业:
<?php
require 'core/init.php';
$freq = "1day";
$camp = $users->get_campaigns($freq);
foreach($camp as $val) {
$data['customer'] = $val['thename'];
$data['companyname'] = $val['company'];
$data['email'] = $val['reply_to'];
if($val['defaultc'] == "1") {
$phrase = $val['1'];
}
elseif($val['defaultc'] == "2") {
$phrase = $val['2'];
}
elseif($val['defaultc'] == "3") {
$phrase = $val['3'];
}
$placeholders = array("{customer}", "{companyname}", "{email}");
$new_member_file = str_replace($placeholders, $data, $phrase);
$headers = "From: ".$val['reply_to']."\r\n";
$headers .= "Reply-To: ".$val['reply_to']."\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$message = "<html><head><style type='text/css'>body { font-family: Arial, sans-serif; }</style></head><body>";
$message .= "".$new_member_file."</body></html>";
mail($val['theemail'], $val['sub1'], $message, $headers,'-f'.$val['reply_to'].'');
$users->email_sent($user_id);
}
?>
如果我直接通过浏览器访问该文件,它完美。但是,如果通过 cron 作业运行它,它只会执行一次 foreach 代码......这意味着它只会从 MySQL 数据库中拉出第一行并发送一封电子邮件,而它应该拉出多行并发送多封电子邮件。
我不知道为什么会发生这种情况 - 我已经尝试寻找发生这种情况但没有运气的原因。
有人有什么想法吗?
【问题讨论】:
-
这些(比如 core/init.php 或
get_campaigns()中的东西是否使用了$_SERVER, $_GET, or $_POST超全局变量?除非 cron 通过某些东西调用 Web 服务器,否则这些将无法通过 cron 获得?比如 wget。$_SERVER在这种情况下很容易被误用,例如如果它用于获取主机名。 -
另外,确保 PHP 报告错误并使用 cron 捕获它们,而不是将它们发送到 /dev/null。通过在命令行而不是 cron 作业或浏览器上执行它自己尝试一下。 cron 脚本的另一个常见错误与相对文件路径与绝对文件路径或关于可用于 cron 执行的
$PATH的假设有关。 -
@MichaelBerkowski 好点,没想到这一点 - 我会看看我的代码。我会相应地更新我的代码,看看这是否能解决问题。
-
@MichaelBerkowski 你是对的——感谢你的帮助!
-
你应该在下面发布你自己的答案,详细说明你是如何修复它的。