PHP调用AI接口做打卡提醒本质是HTTP请求加任务调度,需通过curl调用第三方AI API生成文案,并配合数据库检查与Redis异步队列实现及时、可靠、不重复的提醒机制。

PHP 调用 AI 接口做打卡提醒,本质是 HTTP 请求 + 任务调度,不是 PHP 自带 AI 功能
PHP 本身没有内置 AI 模型或习惯养成能力。所谓“用 AI 做打卡提醒”,实际是 PHP 后端调用第三方 AI 服务(如通义千问、Kimi、ChatGLM API)生成提醒文案、分析打卡规律,再配合定时任务触发通知。关键在「谁发提醒」和「谁判断是否该提醒」——PHP 只负责调度和组装,AI 只负责生成内容或辅助决策。
常见误区是以为装个 PHP 扩展就能调用大模型,其实所有 AI 调用都走 HTTPS API,curl 或 file_get_contents 就够用,重点反而是鉴权、重试、上下文维护这些工程细节。
用 curl 调通大模型 API 生成个性化打卡文案
比如用阿里云百炼平台的 qwen-max 模型生成每日打卡提醒语,核心是构造好 JSON 请求体并处理响应。注意:模型不记事,每次请求都要带完整上下文(如用户历史打卡次数、目标习惯、上次打卡时间)。
- 必须设置
Content-Type: application/json和Authorization: Bearer YOUR_API_KEY - 请求体里
messages字段要模拟对话,例如:[{"role":"user","content":"用户已连续打卡7天早起,今天是第8天,请用鼓励语气写一句15字内提醒"}] - 务必检查响应中的
output.text(百炼)或choices[0].message.content(OpenAI 兼容接口),别直接 echo 整个 JSON - 超时设为
10秒,失败时记录http_code和error字段,避免因 AI 服务抖动导致整个打卡流程卡住
PHP 定时触发打卡检查,别依赖系统 cron 直接跑脚本
用户说“今天没打卡”,不能等凌晨 cron 才发现。真实场景需要主动探测+被动响应结合:用 PHP 写一个 check_daily_status.php,由 Webhook 或消息队列触发(比如用户打开小程序时调用),而不是只靠 crontab -e。
立即学习“PHP免费学习笔记(深入)”;
- 在数据库建
habit_logs表,含user_id、habit_id、date(DATE 类型,非 DATETIME)、status('done'/'missed') - 查询逻辑写成:
SELECT COUNT(*) FROM habit_logs WHERE user_id = ? AND habit_id = ? AND date = CURDATE(),别用created_at >= 'today 00:00',时区容易错 - 如果查不到记录,再调用 AI 接口生成文案,然后用
mail()、file_put_contents()写日志,或调企业微信/钉钉机器人https://qyapi.weixin.qq.com/cgi-bin/webhook/send - 别在 cron 里做耗时 AI 请求,应把“判定未打卡”和“生成提醒”拆成两步,前者走 MySQL 索引快查,后者异步投递到队列
用 php-amqplib 或 redis 做轻量级异步提醒队列
AI 接口响应慢(平均 1–3 秒),不能堵住用户请求流。把提醒任务扔进队列,由独立 worker 进程消费,才是可靠做法。不用上 Kafka,redis 的 LPUSH/BRPOP 就够用。
- 主流程中执行:
redis->lPush('remind_queue', json_encode(['user_id'=>123, 'habit'=>'早起', 'trigger_time'=>time()])) - 另起一个
worker.php,死循环redis->brPop(['remind_queue'], 0),拿到后先查数据库确认是否真需提醒(防重复),再调 AI、发通知 - 如果 AI 调用失败,把任务
rPush回队列末尾,并加retry_count字段,最多重试 3 次,否则写入failed_reminds表人工介入 - 别用
sleep(1)轮询,BRPOP是阻塞式,CPU 占用接近零
真正难的不是调哪个 AI,而是怎么让“未打卡”这个状态被及时感知、不漏、不重、不拖慢用户操作——这些全在 PHP 的流程编排里,不在模型参数里。



















