Framadate 1.1.19 介绍与选型指南
Framadate 1.1.19 认知与选型:Framasoft 生态 PHP+MySQL 日程投票工具的版本脉络与维护现状、架构与数据模型实测、功能盘点,及与 Bitpoll/dudel/Doodle 的量化对比(溯源查询日期 2026-11-01)。
Framadate 1.1.19 介绍与选型指南
目标:认识 Framadate 1.1.19 的定位、架构、功能面与维护现状,给出与同类工具的量化选型结论。本文全部版本号、表结构、命令回显均来自 2026-11-01 在 Ubuntu 22.04.5 + PHP 8.1.2 + MariaDB 10.6.23 服务器上的实测环境(Web 端口 8145),外部事实(star 数、发布记录、许可证徽章)均标注来源与查询日期。
一、环境信息
| 项 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS(x86_64) |
| 软件版本 | Framadate 1.1.19(源码包 tag 归档 framadate-1.1.19.tar.gz,2,926,008 字节) |
| 运行时 | PHP 8.1.2-1ubuntu2.28(Apache mod_php 形态) |
| Web 服务器 | Apache httpd 2.4.52 (Ubuntu) |
| 数据库 | MariaDB 10.6.23(mysql 协议,PDO pdo_mysql 驱动) |
| 依赖管理 | Composer 2.2.6(14 个生产依赖,见第三章) |
| 对外 Web 端口 | 8145(ss -ltn 实测空闲后取用) |
| 站点根目录 | /var/www/framadate |
| 数据库/账号 | 库 framadate、表前缀 fd_、专用账号 framadate |
二、软件概述
Framadate 是法国非营利组织 Framasoft 出品的开源「约时间/做决策」Web 应用:发起人创建一次投票(时间槽投票或选项投票),把链接发给参与者,参与者在页面上勾选自己的选择,无需注册账号;发起人凭一条 24 位随机管理链接删票、删评论、导出结果。它是经典商业服务 Doodle 的自由软件替代,也是 Framasoft「Libre en Fête」去 Google 化清单中的日程协调组件,官方托管实例为 framadate.org。
- 项目渊源:Framadate 是法国斯特拉斯堡大学 STUdS 项目的延续分支(源码头注释同时署名 STUdS 原作者 Guilhem BORGHESI、Raphaël DROZ 与 Framasoft 作者群),仓库 README 明确写有 "Framadate is a fork of the STUdS project, that works at framadate.org for framasoft.org"。
- 许可证:源码包
LICENSE.en.txt实测首部为 "CeCILL-B FREE SOFTWARE LICENSE AGREEMENT",即法国 CeCILL-B 自由软件许可(BSD 风格、可闭源二次分发、无传染性);GitHub 仓库元数据页展示的却是 AGPL-3.0 徽章,两处口径不一致,以随包 LICENSE 文件为准。 - 维护状态:README 显著位置标注 "Framadate is now in maintenance mode."(附 framagit issue #545 链接)。GitHub releases 频道实测最新条目即 1.1.19(2021-12-23),至查询日 2026-11-01 已近五年无新版本发布。
2.1 版本脉络(来源:GitHub framasoft/framadate/releases.atom,查询日期 2026-11-01)
| 版本 | 发布日期 | 要点 |
|---|---|---|
| 1.1.19 | 2021-12-23 | 移除邮件 X-Mailer 头,降低被对方邮件服务器判为垃圾的概率(当前最新) |
| 1.1.18 | 2021-12-21 | 依赖批量更新;弃用的 SimpleMDE 换成 EasyMDE 分支;编辑投票时强制实例过期上限;启用加泰罗尼亚语 |
| 1.1.17 | 2021-10-18 | ICS 日历导出功能补法语翻译 |
⚠️ 注意:版本脉络直接决定选型——Framadate 功能定型于 2021 年,PHP 8.1+ 兼容性、依赖 CVE 修复都不会再有官方更新(详见第六章局限与同专栏排错 FAQ 篇)。
💡 技术拓展:自由软件许可证不止 CeCILL-B 一种,常见选项对比——
许可证 传染性 闭源二次分发 典型代表 MIT / BSD 无 允许 jQuery / Go CeCILL-B 无(BSD 对等) 允许 Framadate 源码包 GPL-2.0/3.0 强(衍生须开源) 禁止 Linux / Bitpoll AGPL-3.0 强且覆盖网络服务 禁止 Mastodon 专有 SaaS — — Doodle 本文以源码包 LICENSE.en.txt 实测值 CeCILL-B 为准:内网闭源部署与修改均无障碍,比 AGPL 口径更宽松。
三、核心架构
Framadate 是「无框架裸 PHP + Smarty 模板」的传统多页应用:根目录每个 .php 即一个入口页,业务类经 Composer autoload 从 app/classes/Framadate/ 命名空间加载,公共引导在 app/inc/init.php(定义常量、连库、装配 Smarty/i18n)。
3.1 目录与入口布局(实测解包)
/var/www/framadate/
├── index.php # 首页(发起投票入口)
├── create_poll.php # 建票向导第 1 步(标题/选项类型)
├── create_date_poll.php # 时间票向导第 2-4 步(选日期→确认→入库)
├── create_classic_poll.php # 选项票向导
├── studs.php # 参与者投票页(含评论/ICS 导出动作)
├── adminstuds.php # 管理页(凭 24 位 admin_id 访问)
├── exportcsv.php # CSV 结果导出
├── find_polls.php # 按名称查自己的票
├── maintenance.php # 数据库不可用时的兜底页
├── admin/ # 安装器 install.php、迁移 migration.php
├── app/inc/ # init.php / constants.php / config.php(安装生成)
├── app/classes/Framadate/ # Services/Repositories/Migration/Utils 业务类
├── tpl/ + tpl_c/ # Smarty 模板与编译缓存(需写权限)
├── locale/ # 13 个语言 JSON 包
└── vendor/ # Composer 依赖(源码包不含,需 composer install)
3.2 技术栈与生产依赖
composer.json 实测声明:php >= 7.3.0、ext-pdo、ext-json;app/inc/constants.php 中 const PHP_NEEDED_VERSION = '7.3'。composer show 实测 14 个生产依赖:
doctrine/lexer 1.2.1 egulias/email-validator 3.1.2 erusev/parsedown 1.7.4
ircmaxell/password-compat dev-master o80/i18n dev-develop phpmailer/phpmailer v6.5.3
roave/security-advisories dev-master sabre/uri 2.2.2 sabre/vobject 4.4.1
sabre/xml 2.2.5 smarty/smarty v4.0.0 symfony/polyfill-intl-idn v1.23.0
symfony/polyfill-intl-normalizer v1.23.0 symfony/polyfill-php72 v1.23.0
要点:模板引擎 Smarty 4、国际化自研 o80/i18n、邮件 PHPMailer 6.5.3、日历导出 sabre/vobject 4.4.1、Markdown 描述 parsedown。roave/security-advisories 会在安装期阻断已知 CVE 的依赖版本——这是停更项目仅剩的供应链防线。
💡 技术拓展:PHP 应用的执行方式不止 mod_php 一种——
方式 原理 特点/适用 Apache mod_php PHP 解释器嵌入 Apache 工作进程 部署最简、进程模型耦合,本文实测采用 Nginx/Apache + PHP-FPM Web 服务器经 FastCGI 转发到独立 FPM 进程池 内存可控、可跨机分离,生产主流 php -S 内置服务器 PHP 自带单进程 HTTP 服务 仅开发/预览,无并发能力 CLI/queue worker 无常驻 HTTP,脚本消费任务 不适用本类同步页面应用 本文实测环境用 mod_php(
libapache2-mod-php8.1),一条apt install即成;若与 Nginx 混部则改走 PHP-FPM,配置面见同专栏部署篇。
3.3 数据模型(实测 DESC fd_poll)
库表由安装器写入 app/inc/config.php 后经 admin/migration.php 建出,共 5 张表:fd_poll、fd_slot、fd_vote、fd_comment、fd_framadate_migration(迁移台账)。核心表实测:
mysql> DESC fd_poll;
+--------------------------+------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------+------------------+------+-----+---------------------+----------------+
| id | varchar(64) | NO | PRI | NULL | |
| admin_id | char(24) | NO | | NULL | |
| title | text | NO | | NULL | |
| description | text | YES | | NULL | |
| admin_name | varchar(64) | YES | | NULL | |
| admin_mail | varchar(128) | YES | | NULL | |
| creation_date | timestamp | NO | | current_timestamp() | |
| end_date | timestamp | YES | | NULL | |
| format | varchar(1) | YES | | NULL | |
| editable | tinyint(1) | YES | | 0 | |
| receiveNewVotes | tinyint(1) | YES | | 0 | |
| receiveNewComments | tinyint(1) | YES | | 0 | |
| active | tinyint(1) | YES | | 1 | |
| hidden | tinyint(1) | NO | | 0 | |
| ValueMax | tinyint(4) | YES | | NULL | |
| password_hash | varchar(255) | YES | | NULL | |
| results_publicly_visible | tinyint(1) | YES | | NULL | |
+--------------------------+------------------+------+-----+---------------------+----------------+
解读:id(16 位,参与者链接用)与 admin_id(24 位,管理链接用)是同一票的两条随机标识——知道 admin 链接即拥有全部管理权,无账号体系;format='D' 为时间票、'C' 为选项票;fd_slot 存日期/时刻(title 列存 unix 秒、moments 存逗号分隔时刻),fd_vote.choices 按槽位拼接字符编码(实测 Alice 投「10:00 可以、14:00 不行」入库为 20,2=可以、1=也许、0=不行)。
四、功能特性
以下功能均在实测实例上逐项走通(操作与回显细节见同专栏部署/运维篇,此处盘点能力面):
| 功能 | 实测入口 | 回显要点 |
|---|---|---|
| 时间票四步向导 | create_poll.php → create_date_poll.php | 步骤 1 提交后 302 Location: create_date_poll.php;确认步后 302 Location: http://localhost:8145/<24位admin_id>/admin |
| 选项票 | create_classic_poll.php | 同构向导,选项文本任意 |
| 参与者投票(可以/也许/不行) | studs.php?poll=<id> 页内单选组 | 提交后 fd_vote 新增行 `Bob |
| 实名评论 | 投票页 add_comment 表单 | fd_comment 表落库 |
| CSV 导出 | exportcsv.php?admin=<admin_id> | ,"08/11/2026","08/11/2026", + "Alice","Oui","Non", |
| ICS 日历事件下载 | `<poll>/action/get_ical_file/<base64url(d-m-Y | H:i)>` |
| 密码保护票 | 建票表单 use_password | fd_poll.password_hash 落哈希 |
| 结果仅管理员可见 / 隐藏票 / 可编辑性 | results_publicly_visible、hidden、editable 列 | 建票参数直写表列 |
| 评分量表票 | use_ValueMax/ValueMax | 0..N 打分制 |
| 多语言界面 | ?lang=en | 首页标题切为 Make your polls - Framadate(locale 13 包、默认启用 9 语言) |
| 过期自动清理 | PurgeService::purgeOldPolls() | PURGE_DELAY=60 天宽限,清理动作记入 admin/stdout.log |
| 维护模式兜底 | 数据库不可用时任意页 | 302 → maintenance.php,页面显示 SQLSTATE[HY000] [2002] |
五、快速开始(最小可用示例)
不装 Apache 也能五分钟预览:源码解包并 composer install 后,用 PHP 内置服务器直接起(仅演示,生产形态见同专栏部署篇):
cd /var/www/framadate && php -S 127.0.0.1:8111 -t . &
[Sun Nov 1 14:27:55 2026] PHP 8.1.2-1ubuntu2.28 Development Server (http://127.0.0.1:8111) started
curl -s http://127.0.0.1:8111/index.php -w "\nHTTP %{http_code}\n" | grep -oE "<title>[^<]*|HTTP [0-9]+"
<title>Organiser des rendez-vous simplement, librement. - Framadate
HTTP 200
看到法语首页标题即最小实例可用;完整「建库→安装器→迁移→建票投票」链路需要 MySQL/MariaDB 与 Web 服务器,共约 20 条命令,见同专栏《Ubuntu 22.04 安装 Framadate 1.1.19 指南》。
六、适用场景与限制
适合选它的场景:
- 基础设施是 LAMP/LEMP:一台机器
apt install apache2 php mariadb-server即齐,不需要 Python/Node 运行时,运维栈匹配度是同类里最低门槛的。 - 需求就是「约会议时间」:时间票 + 评论 + ICS 下载 + CSV 导出覆盖小团队日程协调全链路,参与者零注册。
- 内网闭源部署:CeCILL-B 无传染性,修改后不必开源,适合企业内网改造(换 logo、接 SSO 需自行开发)。
- Framasoft 生态用户:与 Bitpoll 功能重合,PHP 栈团队选它、Python 栈团队选 Bitpoll(见第七章互链)。
需要权衡的限制:
- 维护模式,2021 年后无新版本:PHP 8.1 起
exportcsv.php的strftime()传参类型问题等兼容性缺陷不会再有官方修复(实测 500,需手工补丁,见同专栏排错 FAQ 篇)。 - 无账号体系:管理权 = 24 位链接,链接泄露即失控;无 SSO/LDAP,企业接入要自建反代鉴权。
- 无 REST API、无 CLI:自动化只能模拟 HTTP 会话(带
control校验哈希),或直连数据库。 - 邮件通知默认开启但无 SMTP 即 500:安装模板硬编码
use_smtp => true,无邮件服务器时必须先改回 false 才能建票(实测坑,FAQ 篇有完整定位过程)。 - 单库单机形态:无集群方案,容量即一台 LAMP 的容量;Smarty 编译缓存
tpl_c/与app/inc/config.php需 Web 进程可写。
七、同类选型对比
对比对象取同生态的 Bitpoll、Bitpoll 前身 dudel 与商业基准 Doodle(Framadate 行全部为本文实测/实查值;Bitpoll 行来自其专栏实测记录;star/语言占比取 shields.io,查询日期 2026-11-01):
| 维度 | Framadate 1.1.19 | Bitpoll 0.11.0 | opatut/dudel(已停更) | Doodle(商业基准) |
|---|---|---|---|---|
| 仓库/形态 | framasoft/framadate(PHP) | fsinfuhh/Bitpoll(Python) | opatut/dudel | 闭源 SaaS |
| GitHub star(2026-11-01) | 103 | 318 | 已归档 | — |
| 主语言占比 | PHP 45.8% | Python 46.1% | JavaScript 57.2% | — |
| 许可证 | CeCILL-B(源码包实测) | GPL-3.0 | MIT | 专有 |
| 最新发布 | 1.1.19(2021-12-23,近五年无更新) | 0.11.0(2026-05-06) | 停更 | 持续迭代 |
| 运行时/数据库 | PHP+MySQL/MariaDB | Django+PostgreSQL | Flask+SQLite | — |
| 时间票/选项票 | 两者兼有 | 两者兼有 | 两者兼有 | 两者兼有 |
| 账号/权限 | 无(管理链接制) | 有(用户/组织体系) | 无 | 有(付费增强) |
| 结果导出 | CSV + ICS | CSV + 日历互通 | CSV | 付费项 |
| 自托管数据主权 | 完全自主 | 完全自主 | 完全自主 | 数据在服务商 |
解读:两者功能面高度重合,决策权重在运维栈匹配与维护风险——Framadate 胜在 LAMP 门槛低、CeCILL-B 宽松、时间票体验成熟;但维护模式意味着安全补丁要自己跟(依赖层靠 roave/security-advisories 安装期拦截,运行期 CVE 无人修)。需要账号体系、API 或长期活跃度的,选同生态的 《Bitpoll 0.11.0 介绍与选型指南》;只是临时凑合、不想养服务器,才用 Doodle。
八、参考链接
- 官方托管实例:https://framadate.org/
- 源码仓库(主站 Framagit):https://framagit.org/framasoft/framadate/framadate
- GitHub 镜像与 releases.atom:https://github.com/framasoft/framadate/releases
- 维护模式公告 issue:https://framagit.org/framasoft/framadate/framadate/-/issues/545
- 官方 Wiki(安装说明):https://framagit.org/framasoft/framadate/wikis/home
- 同生态对照:《Bitpoll 0.11.0 介绍与选型指南》