乐于分享
好东西不私藏

一篇讲清楚:PHP项目交付前怎么做源码加密

一篇讲清楚:PHP项目交付前怎么做源码加密

导语

做为一个开发者,最让人头疼的并不是编写代码本身,而是将代码完成交付的环节。

很多 PHP 项目在完成交付之后,客户拿到手的就是项目的源码本身。像核心逻辑、授权模块以及接口策略这类内容,直接打开文件就可以查看。 所以 PHP 代码加密真正要去解决的,并不是“把代码弄乱一点”,而是:

项目可以正常运行,不过源码不要再以明文的形式来交付。

这次我使用的加密工具是: 代码卫士(php.x5.chat);

先说清楚一点:

它不能直接被定义为完全免费的工具。从公开的信息以及平台的使用方式来看,它采用的是赠送免费额度模式、付费升级获取优惠权益两种模式。我这次所使用的账号已经花了399元升级至最高等级获取终身免费加密权益,所以界面上显示的是0元;这也只能表明本次操作没有产生额外的扣费情况,具体的收费情况还是要以官方页面的展示为准。


一、接下来看看我是怎么给源码加密的?

我运用一个包含4个PHP文件的测试项目来当作样本:

  • index.php
<?phpdeclare(strict_types=1);require __DIR__ . '/src/MathService.php';require __DIR__ . '/src/TextService.php';require __DIR__ . '/config/app.php';use Demo\SecurityTest\MathService;use Demo\SecurityTest\TextService;date_default_timezone_set('Asia/Shanghai');$math = new MathService();$text = new TextService();$data = ['time' => date('Y-m-d H:i:s'),'sum' => $math->sum(12, 30),'factorial_5' => $math->factorial(5),'greeting' => $text->greet('代码卫士'),'slug' => $text->slug('PHP Code Guard Test 2026'),'config' => $appConfig,];header('Content-Type: application/json; charset=utf-8');echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
  • app.php
<?phpdeclare(strict_types=1);$appConfig = ['app_name' => 'CodeGuardTest','version' => '1.0.0','features' => ['namespace','class_method','json_output','require_include',    ],];
  • MathService.php
<?phpdeclare(strict_types=1);namespace Demo\SecurityTest;class MathService{    public function sum(int $a, int $b): int    {return$a + $b;    }    public function factorial(int $n): int    {if ($n < 0) {            throw new \InvalidArgumentException('n must be >= 0');        }if ($n === 0) {return 1;        }$result = 1;for ($i = 1; $i <= $n$i++) {$result *= $i;        }return$result;    }}
  • TextService.php
<?phpdeclare(strict_types=1);namespace Demo\SecurityTest;class TextService{    public function greet(string $name): string    {return"你好,{$name}";    }    public function slug(string $text): string    {$text = strtolower($text);$text = preg_replace('/[^a-z0-9]+/''-'$text);return trim((string)$text'-');    }}

1)上传项目压缩包

直接上传 code-guard-test.zip这一步很直观,适合先做小样本测试。

2)选择 SG16PRO 并开始加密

从弹窗能确认:

  • 加密方案:SG16PRO
  • 总文件数:4
  • 已加密:4
  • 错误:0
  • 虚拟机混淆:已启用
  • 本次显示费用:0 元

3)下载并解压结果

重点不是“下载成功了”,而是加密后的代码到底变成了什么样


二、加密前后差别,直接看图

index.php 加密后

app.php 加密后

类文件加密后

从这些结果里,能明确看到几件事:

  • 文件头出现 Protected by SourceGuardian Pro
  • 代码里出现 sg_load()
  • 没有 Loader 时,会提示安装 SourceGuardian Loader
  • 原本可以直接进行阅读的业务逻辑,不再出现。
  • 文件末尾变成 return sg_load("...") 的受保护执行形式

这说明它并非简单改变量名、压成一行那种浅层混淆。它走的是运用Loader以及更深层字节码保护这一路径。 它走的是 Loader + 更深层字节码保护 这一路。


三、这对开发者意味着什么?

一句话:

源码不再明文交付了。

这正是 PHP 开发里最真实的痛点。尤其是这些场景:

  • 商业项目交付
  • 私有化部署
  • 支付、授权、计费逻辑保护
  • 核心模块的交付

从这次样本来看,代码卫士的SG16PRO方案,确实把源码从可直接阅读变成了受保护执行。


四、但这几个问题也得提前知道

1)Loader 依赖是有门槛的

SG16PRO 依赖 SourceGuardian Loader这意味着:

  • 目标服务器要装对应 Loader
  • Loader 要和 PHP 版本匹配
  • 共享主机、受限环境,可能根本装不了
  • PHP 升级后,还要重新确认兼容性

因此不要只去测试“能不能加密成功”,还要去测试“客户环境能不能顺利跑起来”。

2)平台还有免扩展方案

这次我测试的是SG16PRO。但从平台公开页面以及后台菜单来看,它还提供像SGI6组件加密这样的免扩展方向。

不过这次我没实测 SGI6,所以这里只能说平台有这类方案,不能替它下运行结论。

3)在线加密有源码隐私风险

代码卫士是在线平台。 操作确实方便,但也意味着:

你是把源码上传到第三方平台处理。

普通项目可以优先看效率。高敏感代码,最好先评估隐私风险,再决定要不要用。

但是我觉得这一点完全可以不用担心,人家后台直接不会显示你的源代码,加密后直接返回结果,完全不用担心核心代码泄漏到第三方平台。


五、我的结论

要是仅依据这次实测能够确认的内容,那么我的判断会相当直接:

  • SG16PRO 不是浅层文本混淆
  • 它确实把 PHP 源码带进了 Loader 执行 + 更深层保护 这一类方案
  • 对商业交付、私有化部署、核心模块保护,确实有价值

但我也不把话说满:

  • 这次样本小
  • 没完整覆盖部署运行验证
  • Loader 依赖是真门槛
  • 在线加密有隐私风险

所以更稳的说法是:

要是你正在找一类可以提高 PHP 源码交付保护门槛的方案,代码卫士值得认真进行测试;正式将其投入生产前,再补一轮完整的验证工作。