PHP项目许可证与开源合规

wen PHP项目 5

PHP项目许可证与开源合规完全指南

为什么许可证很重要?

如果你打算发布PHP项目,许可证直接决定了:

PHP项目许可证与开源合规

  • 别人能否使用你的代码
  • 能否修改、分发
  • 能否用于商业目的
  • 你的代码能否被他人嵌入到闭源软件中

案例警示:如果你在项目中使用了一个MIT许可证的库,但没有保留版权声明,你可能面临法律风险,同样,如果你把GPL代码嵌入到你的商业闭源项目中,你可能被要求开源整个项目。


主流开源许可证对比

适用PHP项目的许可证速查表

许可证 商业友好 必须开源 保留版权声明 常见PHP项目示例
MIT ✅ 非常友好 ❌ 无要求 ✅ 必须 Laravel, Composer, PHPUnit
Apache 2.0 ✅ 非常友好 ❌ 无要求 ✅ 必须 Symfony组件, Guzzle
BSD 3-Clause ✅ 友好 ❌ 无要求 ✅ 必须 PHP本身(部分), Slim
GPL 3.0 ⚠️ 有限 ✅ 衍生作品必须开源 ✅ 必须 WordPress核心

PHP项目许可证选择决策树

你的项目是否允许别人闭源使用你的代码?
│
├─ ✅ 允许 → 是否要求明确专利授权?
│   │
│   ├─ ✅ 需要 → Apache 2.0
│   └─ ❌ 不需要 → MIT 或 BSD-3-Clause
│
└─ ❌ 不允许(要求共享改进代码)→ GPL v3 或 AGPL v3
    │
    └─ 是否用于服务器端服务?
        │
        ├─ ✅ 是 → AGPL v3
        └─ ❌ 否 → GPL v3

PHP项目中的Composer依赖合规

核心要求

理解Composer依赖链:一个典型的PHP项目往往包含几十甚至几百个依赖包,每个包都有自己的许可证,你需要确保所有依赖的合规性。

检查依赖许可证

使用Composer插件来检查依赖的许可证:

# 安装许可证检查工具
composer require --dev magln/composer-license-checker
# 或使用现有工具
composer require --dev softonic/php-license-checker

生成许可证报告

composer licenses

输出示例:

composer.lock - licenses
├── laravel/framework - MIT
├── symfony/console - MIT
├── guzzlehttp/guzzle - MIT
└── phpunit/phpunit - BSD-3-Clause

配置合规规则

创建 composer.json 中的配置:

{
    "extra": {
        "license-checker": {
            "allow": ["MIT", "Apache-2.0", "BSD-3-Clause"],
            "deny": ["GPL-3.0-only", "AGPL-3.0-only"],
            "ignore": ["your-vendor/private-package"]
        }
    }
}

许可证兼容性矩阵(PHP生态系统常见组合)

你的许可证 可包含的依赖许可证 不可包含的依赖许可证
MIT MIT, Apache, BSD, GPL(仅限分离使用) AGPL(不可静态链接)
Apache 2.0 Apache, MIT, BSD GPL v2(结合问题)
GPL v3 GPL, MIT, Apache, BSD AGPL(除非同样采用)
AGPL v3 AGPL, GPL, MIT, Apache 专有许可证

注意:PHP的动态特性

由于PHP是解释型语言,没有“静态链接”的概念,所以只要你不把别的包复制进你的代码库(即通过Composer作为独立依赖),MIT及其衍生协议(Apache, BSD)都是可以安全使用的。


常见合规问题与解决方案

问题1:Composer依赖包含GPL代码

场景:你的商业项目中不小心引入了GPL库

解决方案

  • 查找替代的MIT/Apache库
  • 将GPL库作为独立服务通过API调用(进程隔离)
  • 购买商业许可(如果供应商提供)

问题2:模板文件中包含第三方代码

场景:使用了付费模板中的PHP代码

解决方案

  • 检查模板的授权协议允许范围
  • 剥离和重写有争议的代码
  • 保留原始版权和许可声明

问题3:Composer自动加载时包含AGPL包

场景:使用了WordPress插件,其中包含AGPL库

解决方案

  • 将AGPL插件作为独立插件保留版权声明
  • 明确区分插件与主程序的许可边界
  • 如用于SaaS服务,需考虑AGPL对网络服务的限制

私有PHP项目许可策略

使用版本控制保护

# Git忽略敏感配置文件
echo ".env" >> .gitignore
echo "config/secret.php" >> .gitignore
# 使用Envoy部署时明确授权声明

许可证声明模板

在你的项目根目录创建 LICENSE 文件:

MIT License
Copyright (c) 2024 [你的名字/公司]
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

Composer中声明许可证

{
    "name": "yourname/your-project",
    "license": "MIT",
    "authors": [
        {
            "name": "Your Name",
            "email": "your@email.com"
        }
    ]
}

开源PHP项目合规检查清单

  • [ ] 在 composer.json 中正确声明许可证
  • [ ] 根目录中包含 LICENSE 文件
  • [ ] 每个源码文件的头部包含版权声明
  • [ ] 所有第三方代码的许可证与项目兼容
  • [ ] 保留第三方库的 LICENSENOTICE 文件
  • [ ] 使用 composer licenses 确认依赖
  • [ ] 更新许可证文档(如果修改了第三方代码)
  • [ ] 对于文档、图片等非代码资源也需要确认许可证
  • [ ] 在README中明确项目许可证

实操:快速检查你的PHP项目合规性

# 1. 检查你的composer依赖
composer licenses
# 2. 查看整个依赖树的许可证
composer show --all | grep -E "^name|^\s+license"
# 3. 下载项目的所有依赖并检查
composer install --dry-run
# 4. 检查是否有许可证冲突
composer validate --strict

实操练习

任务:检查并修复一个PHP项目的开源合规性

假设你的项目使用以下依赖:

{
    "require": {
        "laravel/framework": "^10.0",
        "spatie/laravel-permission": "^5.0",
        "barryvdh/laravel-debugbar": "^3.0",
        "phpunit/phpunit": "^10.0"
    }
}

步骤1:运行 composer licenses 查看结果 步骤2:确认每个依赖的许可证 步骤3:决定是否需要替换或调整 步骤4:在项目文档中添加合规声明


十一、常见问题解答(FAQ)

Q1:PHP项目的源代码文件是否需要在文件头部加版权声明?

A:虽然不强制,但强烈建议在SDK、开源库、框架中这样做,对于应用项目(非库),版权声明通常放在项目根目录即可,推荐在PHP文件顶部添加:

<?php
/**
 * This file is part of ProjectName.
 *
 * (c) Your Name <your@email.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

Q2:在WordPress插件中使用GPL代码需要注意什么?

A:WordPress本身是GPL v2,但这不意味着你必须把所有插件都开源,插件与WordPress是分离的代码,可以在专有许可下发布,除非你直接修改了WordPress核心代码或从WordPress Core中复制了大量代码。

Q3:可以在MIT项目中包含Apache 2.0的库吗?

A可以,MIT协议兼容Apache 2.0,但需要注意保留Apache库的通知文件(NOTICE)。

Q4:缺失版权声明的MIT代码可以直接使用吗?

A严格来说不可以,MIT许可要求必须包含版权声明和许可文本,缺失这些信息意味着代码可能没有合法许可,如果无法追溯到版权所有者,最安全的做法是重写或寻找替代库。


十二、实用工具资源

工具 用途 安装方式
ChooseALicense.com 许可证选择指南 无需安装
Composer License Checker 检查Composer依赖许可证 composer require --dev magln/composer-license-checker
FOSSA 自动化合规扫描 在线服务
BlackDuck 开源合规管理 企业级
SPDX License List 许可证标识符标准 无需安装

总结要点

  1. 明确项目定位 → 选对许可证类型
  2. 检查依赖链 → 确保每个依赖合规
  3. 保留版权声明 → 尊重他人的劳动成果
  4. 文档化合规策略 → 让团队遵循统一规范
  5. 持续监控 → 每次composer update都要检查

许可证合规不是一次性的工作,而是伴随项目生命周期的持续过程,使用CI/CD管道集成自动检查,确保每次提交都不会引入不合规的依赖。

抱歉,评论功能暂时关闭!