Cron任务脚本无法执行:无输出无报错,调用Mailchimp::campaign()失败
问题解决:Mailchimp::campaign() 方法不存在 + 代码其他问题
核心错误原因
你碰到的致命错误是因为调用了错误的Mailchimp SDK方法。当前引入的是Mailchimp API v2旧版SDK,但代码里用的是v3的链式调用语法(->campaign()->lists()->members(...)),而v2 SDK的Mailchimp类根本没有campaign()方法,直接导致报错。
分步修复方案
1. 升级到Mailchimp API v3 SDK(推荐,v2已废弃)
Mailchimp v2 API早已停止维护,建议直接切换到官方v3 SDK:
- 用Composer安装的话,执行命令:
composer require mailchimp/marketing - 手动安装的话,去官网下载v3 SDK包,替换原有的
Mailchimp/目录。
2. 修正SQL查询的参数绑定错误
你的SQL语句写死了INTERVAL 7 DAY,却又调用bind_param("i", $days_before_reminder);,参数根本没生效。应该改成动态绑定:
$sql = "SELECT * FROM `users` WHERE `membership_expiry` <= DATE_ADD(CURDATE(), INTERVAL ? DAY)"; $stmt = $con->prepare($sql); $stmt->bind_param("i", $days_before_reminder); // 现在参数绑定才真正生效
3. 修正Mailchimp发送逻辑
用v3 SDK的正确调用方式,并且不要在循环里重复初始化Mailchimp实例(完全没必要)。
4. 修正错误日志路径
Cron任务运行时的工作目录和手动执行时可能不同,建议给错误日志配置绝对路径,避免找不到文件。
完整修正后的代码
include('admin/database.php'); // 引入v3 SDK(Composer安装用下面这句,手动安装则调整路径) require 'vendor/autoload.php'; use MailchimpMarketing\ApiClient; // 提醒提前天数 $days_before_reminder = 7; // Mailchimp配置 $api_key = "xxxxxxxxxxxxxxxxxxxxx"; $server_prefix = "usX"; // 你的API key前缀,比如key-us10里的us10 $list_id = "xxxxxxxx"; // 只初始化一次Mailchimp客户端 $mailchimp = new ApiClient(); $mailchimp->setConfig([ 'apiKey' => $api_key, 'server' => $server_prefix ]); // 修正后的SQL查询 $sql = "SELECT * FROM `users` WHERE `membership_expiry` <= DATE_ADD(CURDATE(), INTERVAL ? DAY)"; $stmt = $con->prepare($sql); $stmt->bind_param("i", $days_before_reminder); $stmt->execute(); $result = $stmt->get_result(); // 循环发送提醒 while ($row = $result->fetch_assoc()) { $memberName = $row["first_name"]; $memberEmail = $row["email"]; $expiryDate = $row["membership_expiry"]; $data = [ 'email_address' => $memberEmail, 'status' => 'subscribed', 'merge_fields' => [ 'NAME' => $memberName, 'EXPIRY_DATE' => $expiryDate, ] ]; try { // v3 SDK添加/更新会员(如果提醒是通过Mailchimp自动化流程触发,这里只需同步会员信息即可) $response = $mailchimp->lists->setListMember($list_id, md5(strtolower($memberEmail)), $data); // 若要直接发送特定营销活动,需先创建活动或使用自动化邮件流程,需符合Mailchimp合规规则 echo "提醒已发送至 $memberName ($memberEmail)\n"; } catch (Exception $e) { // 替换为你的绝对日志路径,比如 /var/www/your_project/error.log $errorMessage = date('Y-m-d H:i:s') . " 发送提醒失败 $memberEmail: " . $e->getMessage() . "\n"; error_log($errorMessage, 3, "/path/to/your/error.log"); echo "发送失败 $memberEmail: " . $e->getMessage() . "\n"; } } $stmt->close(); $con->close();
额外说明
- 若坚持用v2 SDK(不推荐),需改用v2的方法,比如
$Mailchimp_Lists->subscribe(...),但v2 API已废弃,随时可能失效。 - Cron无输出问题:修正代码后,可把Cron命令改成输出重定向到日志,比如
*/5 * * * * php /path/to/membership_reminder.php >> /path/to/cron.log 2>&1,这样就能查看输出和错误信息。
内容的提问来源于stack exchange,提问作者Mid9it Coder
相关产品推荐
相关产品推荐

