# festival **Repository Path**: grbj/festival ## Basic Information - **Project Name**: festival - **Description**: 一个轻量级的 PHP 服务,可根据当前日期智能判断中国农历/公历节日或二十四节气,并根据结果动态重定向到对应的节日主题图片 URL。 - **Primary Language**: PHP - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://www.grbj.cn/648.html - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2025-12-11 - **Last Updated**: 2026-03-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 📅 PHP 日历/节气/节日跳转服务 开发者:Guangran(Blog:https://www.grbj.cn) 本项目基于 [liujiawm/php-calendar](https://github.com/liujiawm/php-calendar) 库进行二次开发,实现了一个简单的 PHP 服务,根据当前日期或用户请求的日期,自动判断**农历节日**、**公历节日**或**二十四节气**,并根据这些信息以及配置参数,生成一个图片 URL 并进行重定向。 ## ✨ 主要功能 * **日期信息获取:** 使用 `phpu/calendar` 库获取指定日期的公历、农历和星期信息。 * **节日判断:** 实现了 `Lunar` 类,用于判断农历和公历节日(包括一些特殊的按周次计算的节日如母亲节、父亲节)。 * **地区支持:** 特别处理了南北方小年(腊月廿三/廿四)的区分。 * **节气判断:** 实现了 `SolarTermIntervalCalculator` 类,用于判断当前日期处于哪个二十四节气区间。 * **智能选择:** 优先显示节日名称,若当日无节日,则显示当前节气名称。 * **图片 URL 生成:** 根据节日/节气名称和用户提供的 URL、类型、编号等参数,动态生成目标图片地址。 * **重定向:** 默认将用户重定向到生成的图片 URL。 * **调试模式:** 提供 `debug=1` 参数,可以输出详细的日期、节日、节气和最终图片 URL 信息。 ## 🛠️ 环境依赖 * PHP 7.0 或更高版本。 * 需要引入 `liujiawm/php-calendar` 项目中的相关日历类文件(`SolarTerm.php`, `Astronomy.php`, `Calendar.php`, `ChineseCalendar.php`, `config.php`, `Julian.php`)。 * **注意:** 代码中使用了硬编码的相对路径进行 `require_once`,您需要确保这些文件路径正确。 ## 🚀 部署与使用 ### 1\. 文件准备 将 `php-calendar` 库的源代码放置在代码指定的 `/vendor/phpu/calendar/src/` 目录下,并确保所有必需的文件(`SolarTerm.php` 等)都可以被脚本正确加载。 ### 2\. 访问方式 您可以通过 URL 访问此 PHP 脚本,并通过 GET 参数控制行为。 #### **默认访问 (重定向到图片):** ```url /your_script.php ``` #### **带参数的访问示例:** | 参数 | 描述 | 示例值 | 默认值 | 备注 | | :--- | :--- | :--- | :--- | :--- | | `url` | 基础图片存储 URL | `https://cdn.example.com/` | `https://img.ictstu.com/` | 必须包含协议,末尾会自动补齐 `/` | | `type` | 图片分类路径/类型 | `calendar` | `''` (空) | 用于构造 `url/type/` 路径 | | `num` | 图片编号 | `1` 或 `month` | `type` 的值 | 如果设置为 `month`,则用于获取月份图片 | | `imgtype` | 图片文件后缀 | `jpg` | `png` | 必须是有效图片后缀 | | `region` | 小年地区区分 | `n` (北方) 或 `s` (南方) | `s` | 影响腊月廿三/廿四的节日名称 | | `debug` | 调试模式开关 | `1` | 任何非 `1` 的值 | `1` 时输出信息,否则重定向 | ### 3\. 图片 URL 规则 生成的图片路径基于以下逻辑: | 参数 `id` 值 | 图片路径格式 | 示例 | | :--- | :--- | :--- | | `month` | `$url/$type/m_{$currentMonth}{$num}.$imgtype` | `.../calendar/m_121.png` | | `1` 或 `2` | `$url/$type/$festival{$id}.$imgtype` | `.../calendar/春节1.png` | | 其他值 (`$id` 为 `$type` 或其他) | `$url/$type/$festival{$num}.$imgtype` | `.../calendar/立春2.png` | | `$type` 为空 | `$url/$festival{$num}.$imgtype` | `.../清明1.png` | **变量解释:** * `$url`:基础 URL (e.g., `https://img.ictstu.com/`) * `$type`:URL 参数 `type` * `$festival`:计算出的节日或节气名称 (e.g., `春节`, `立春`) * `$num`:代码内随机生成的 `1` 或 `2` * `$id`:URL 参数 `num` 或 `type` * `$currentMonth`:当前月份 (e.g., `01`, `12`) ## 💡 核心逻辑解读 ### 1\. 节日配置 (`Lunar::getFestival`) 硬编码了配置为 `1` 的节日列表: * **农历节日:** 春节 (初一至初七), 元宵节, 二月二, 端午节, 七夕节, 中秋节, 重阳节, 腊八,以及春节倒计时和除夕。 * **小年:** 根据 `region` 参数确定为 `小年N` (北方) 或 `小年S` (南方)。 * **公历节日:** 元旦, 劳动节, 青年节, 教师节, 九一八, 国庆节。 * **按周次计算的节日:** 母亲节 (5月第二个周日), 父亲节 (6月第三个周日)。 ### 2\. 节气判断 (`SolarTermIntervalCalculator`) 使用 `phpu\calendar\SolarTerm::solarTerms($year)` 获取当年所有节气的精确时刻(`\DateTime` 对象)。通过将当前时间与节气时间点进行比较,确定当前时间所处的两个节气之间,返回前一个节气的名称。 ### 3\. URL 构造 在 URL 构造中,如果当前日期有节日,则 `$festival` 变量为节日名称;否则,为节气名称。这个名称将作为图片文件名的前缀。随机数 `$num` (1或2) 用于在图片库中选择不同样式的图片。 ## ⚠️ 注意事项 * **依赖文件路径:** 必须严格保证代码顶部引入的 PHP 日历类文件路径正确。 * **时区:** 脚本的日期和时间判断依赖于 PHP 运行环境的默认时区设置,这可能会影响节气和节日的判断准确性。建议在脚本运行前显式设置时区,例如 `date_default_timezone_set('Asia/Shanghai');`。 * **安全性:** 对 GET 参数如 `url`、`type`、`imgtype` 进行了基础验证,但如果您将此服务部署在外部,需要考虑更严格的输入验证和防止路径遍历攻击。 * **图片资源:** 本服务是一个重定向服务,不存储图片。您需要确保 `$url` 指向的图床或资源服务器上,存有命名符合规则的图片文件(如 `https://img.ictstu.com/春节1.png`, `https://img.ictstu.com/立春2.png` 等)。