Framadate 1.1.19 介绍与选型指南

Framadate 1.1.19 认知与选型:Framasoft 生态 PHP+MySQL 日程投票工具的版本脉络与维护现状、架构与数据模型实测、功能盘点,及与 Bitpoll/dudel/Doodle 的量化对比(溯源查询日期 2026-11-01)。

FramadateFramadate自托管PHPMariaDB2026/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.192021-12-23移除邮件 X-Mailer 头,降低被对方邮件服务器判为垃圾的概率(当前最新)
1.1.182021-12-21依赖批量更新;弃用的 SimpleMDE 换成 EasyMDE 分支;编辑投票时强制实例过期上限;启用加泰罗尼亚语
1.1.172021-10-18ICS 日历导出功能补法语翻译

⚠️ 注意:版本脉络直接决定选型——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_phpPHP 解释器嵌入 Apache 工作进程部署最简、进程模型耦合,本文实测采用
Nginx/Apache + PHP-FPMWeb 服务器经 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-YH:i)>`
密码保护票建票表单 use_passwordfd_poll.password_hash 落哈希
结果仅管理员可见 / 隐藏票 / 可编辑性results_publicly_visible、hidden、editable 列建票参数直写表列
评分量表票use_ValueMax/ValueMax0..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&comma; librement&period; - 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.19Bitpoll 0.11.0opatut/dudel(已停更)Doodle(商业基准)
仓库/形态framasoft/framadate(PHP)fsinfuhh/Bitpoll(Python)opatut/dudel闭源 SaaS
GitHub star(2026-11-01)103318已归档—
主语言占比PHP 45.8%Python 46.1%JavaScript 57.2%—
许可证CeCILL-B(源码包实测)GPL-3.0MIT专有
最新发布1.1.19(2021-12-23,近五年无更新)0.11.0(2026-05-06)停更持续迭代
运行时/数据库PHP+MySQL/MariaDBDjango+PostgreSQLFlask+SQLite—
时间票/选项票两者兼有两者兼有两者兼有两者兼有
账号/权限无(管理链接制)有(用户/组织体系)无有(付费增强)
结果导出CSV + ICSCSV + 日历互通CSV付费项
自托管数据主权完全自主完全自主完全自主数据在服务商

解读:两者功能面高度重合,决策权重在运维栈匹配与维护风险——Framadate 胜在 LAMP 门槛低、CeCILL-B 宽松、时间票体验成熟;但维护模式意味着安全补丁要自己跟(依赖层靠 roave/security-advisories 安装期拦截,运行期 CVE 无人修)。需要账号体系、API 或长期活跃度的,选同生态的 《Bitpoll 0.11.0 介绍与选型指南》;只是临时凑合、不想养服务器,才用 Doodle。

八、参考链接

Framadate 1.1.19 介绍与选型指南 - Quzuo