本文目录导读:

- 第一步:明确你的核心需求(3个问题)
- 第二步:常见协议对比与适用场景(PHP视角)
- 第三步:给 PHP 开发者的具体选择建议
- 第四步:多模块项目如何处理?(最易踩坑)
- 第五步:实际操作建议(低风险做法)
- 总结速查表
在 PHP 项目中选择开源协议,主要取决于你的发布目的(是想让所有人免费商用,还是仅允许非商业使用?)、是否希望他人修改后必须开源(即传染性要求),以及你与公司/客户的关系。
PHP 社区最常见的协议是 MIT 和 Apache 2.0,其次是 GPL 和 LGPL,下面给你一个从“宽松”到“严格”的选择指南。
第一步:明确你的核心需求(3个问题)
- 是否允许商业闭源使用?
- 如果你希望别人拿你的代码做收费的SaaS服务或闭源商业产品,且不必须公开他们的代码 -> 选择宽松协议(MIT/Apache/BSD)。
- 是否要求修改后的代码也必须开源?
- 如果你希望所有基于你代码的“衍生作品”也必须使用相同的开源协议公开源码 -> 选择强左版协议(GPL)。
- 是否担心专利问题?
- 如果你有专利,希望保护自己,并授予使用者明确的专利许可 -> 选择 Apache 2.0。
第二步:常见协议对比与适用场景(PHP视角)
MIT 协议(最宽松、最简单)
- 特点:只要保留版权声明,你想怎么用都行,包括闭源商用,不提供专利保护。
- 适用场景:
- 个人开源项目、通用工具类库(如
PHPUnit之前用的就是MIT,Composer也是)。 - 希望被最大范围地集成到商业项目中。
- 个人开源项目、通用工具类库(如
- PHP例子:
Laravel框架(核心)使用MIT,大部分Packagist上的现代包都是MIT。
Apache 2.0 协议(宽松 + 专利保护)
- 特点:与MIT类似,允许闭源商用,但它明确包含了专利授权条款,如果使用者起诉你专利侵权,他们的专利授权自动终止。
- 适用场景:
- 企业级项目。
- 涉及算法、涉及专利风险的功能库。
- 被大公司广泛使用的底层框架。
- PHP例子:
Symfony框架使用MIT,但许多大型云SDK(如 AWS SDK for PHP)使用Apache 2.0。
GPL v3 协议(强左版、严格)
- 特点:“传染性” 极强,只要你的软件包含了GPL代码,你整个软件就必须以GPL协议开源,且必须提供源码,不允许闭源分发。
- 适用场景:
- 只做纯开源软件,不希望别人拿你的代码去做封闭的收费软件。
- 追求自由软件精神。
- PHP警告:
- 如果你的项目是 SaaS(软件即服务)(例如你写一个API后端),别人通过HTTP调用,并不构成“分发”,所以GPL无法约束SaaS行为,这种情况下GPL反而没用。
- PHP例子:
WordPress核心基于GPL,但其很多插件和主题也因此被迫采用GPL或兼容协议。
LGPL 协议(宽松版GPL)
- 特点:允许闭源软件通过“链接”的方式使用该库,只要你不修改库本身的源码,你的闭源程序就可以调用它,如果修改了库本身,则修改必须开源。
- 适用场景:
- 主要针对动态链接库,但在PHP中,由于代码是即时解释的,“链接”概念模糊。
- 如果你写的是一个PHP扩展(C语言写的
.so扩展),想兼容闭源商业软件,LGPL是很好的选择。
- PHP例子:
Zend Framework早期用了LGPL,但后来转向了MIT。
AGPL 协议(针对云端的GPL)
- 特点:GPL的变种,堵住了SaaS的漏洞,只要用户在网络上使用你的AGPL软件(即使是远程HTTP访问),也必须向该用户开放该软件的全部源码。
- 适用场景:
- 专门做Web应用(PHP天然适合)。
- 如果你不希望别人拿你的源码做收费的SaaS服务而不开源,AGPL是唯一选择。
- PHP例子:
Mautic(开源营销自动化)使用AGPL v3。
第三步:给 PHP 开发者的具体选择建议
情况 A:你写的是 Composer 扩展包 / 类库
- 首选:MIT,因为C扩展需要被最大范围地
require,闭合类库采用宽松协议能减少用户的担忧,如果你有专利就选 Apache 2.0。
情况 B:你最终交付的是一款 Web 应用(项目)
- 想免费引流或做demo:用 MIT 或 Apache 2.0,允许别人自由改代码。
- 不想让别人做“二开”并贩卖:
- 如果用 GPL,他们如果把代码拿去卖给你,违法;但他们把代码改成SaaS(在线API),GPL管不到。
- 如果用 AGPL,必须公开源码,但注意:对PHP而言,AGPL会造成浏览器存储的JS文件可能也要算作分发,兼容性较差。
情况 C:你是在 公司/甲方 工作
- 如果你是给客户写项目,绝对不要选 GPL/AGPL,除非甲方明确要求,因为闭源交付是商业常态,应该选用 MIT / Apache 2.0,并写进合同。
第四步:多模块项目如何处理?(最易踩坑)
如果你的 PHP 项目是一个大仓库,包含 源码 + 前端资源(JS/CSS)+ 图片 + 配置文件:
- 代码部分:采用 MIT 或 GPL。
- 图片/字体/文档:可能不适用开源协议,应该单独声明版权或者使用 Creative Commons(CC BY)协议,在
README.md和LICENSE中要明确区分。
第五步:实际操作建议(低风险做法)
- 不要自己写协议原文:直接去 Choose a License 或者 GNU 官网复制粘贴
LICENSE文件到根目录。 - 在 README 中声明:不仅要有
LICENSE文件,还要在包头部注明@license MIT(如果你用 PHPDoc 注解)。 - 检查依赖冲突:如果你
composer require了一个 GPL 的包,你的整个项目可能被迫采用 GPL,用composer licenses命令检查所有依赖的协议。
总结速查表
| 你的目标 | 推荐协议 | 关键限制 |
|---|---|---|
| 最大兼容性,允许闭源商用 | MIT | 必须保留版权声明 |
| 允许商用,但需要专利保护 | Apache 2.0 | 保留声明 + 明确专利授权 |
| 禁止修改后闭源分发(非SaaS) | GPL v3 | 衍生作品必须开源,SaaS可绕过 |
| 禁止任何形式的闭源使用(含SaaS) | AGPL v3 | 最严格,网络访问也算分发 |
| 闭源项目想引用你的PHP库 | MIT / LGPL | LGPL要求修改库本身时要开源 |
最终建议:如果你不确定,选 MIT 永远是最安全、最通用的(PHP生态圈的共识),只有当你明确追求“自由软件”理念并承担相应后果时,再考虑 GPL/AGPL。