PHP利用Opcache实现保护源码的示例详解
不用 IonCube或类似的。不知道这是啥的话就是加密 PHP 代码但还能运行的工具。问题是太贵了。性能要好PHP 原生支持。后来想到PHP 有个opcache功能能把源码编译成操作码机器语言在 Zend VM 上跑跟 Java 差不多 厉害的是这样既保护了代码又提升了性能开始干活。要让这套方案跑起来得把代码打包成镜像就是个只读的存储跟系统其他部分隔离开因为 opcache 是全局生效的不管哪个 PHP 项目。最好的工具就是 Docker。Docker 比虚拟机轻量多了分发部署都很方便。这次用 Laravel 做例子。为啥选它因为组件多依赖库也多能遇到各种坑学到的东西也多。一般来说我们的核心代码都在/app目录里这部分需要保护。其他目录像/vendor都是开源库不用管。具体步骤第一步在项目根目录建个warm-opcache.php文件。这玩意儿会调用opcache_compile_file()手动让 PHP 编译代码。12345678910?php$directorynewRecursiveDirectoryIterator(/var/www/app); # 我们用 /var/www$iteratornewRecursiveIteratorIterator($directory);foreach($iteratoras$file) {if(pathinfo($file, PATHINFO_EXTENSION) php) {echo编译中: {$file}\n;opcache_compile_file($file);}}第二步建个empty-preserve-time.sh脚本记得chmod x给执行权限。这个脚本会把 PHP 文件内容清空但保留时间戳。为啥要保留时间戳因为文件修改时间一变opcache 就会重新加载。1234567#!/bin/bashforfilein$(find./app-typef -name*.php);dotimestamp$(stat -c %Y$file)# 获取修改时间从纪元开始的秒数: $file# 清空文件touch-d$timestamp$file# 恢复原始时间戳done第三步把zz-opcache.ini配置文件放到/usr/local/etc/php/conf.d目录或者你系统的 conf.d 在哪就放哪。记得先装好 PHP 的 opcache 扩展123456opcache.enable1opcache.enable_cli1opcache.validate_timestamps1opcache.revalidate_freq10opcache.file_cache/var/www/.opcacheopcache.file_cache_only1重要先把代码 commit 或者备份下面的操作会删除文件内容接下来就是见证奇迹的时刻了。先跑php warm-opcache.php再跑empty-preserve-time.sh文件内容会被清空但/app目录结构还在Laravel 项目照样能跑。不信你试试这套方法对任何 PHP 项目都管用不管你用 PSR-4 还是简单的require()。Laravel 用的是 PSR-4。不错概念验证成功。下一步就是打包要能分发到客户的服务器上。就像 Go 能编译成 .exe 一样直接上 Dockerfile。这个 Dockerfile 没做层优化主要是为了好理解12345678910111213141516171819202122232425262728293031323334353637383940414243FROM php:8.3-fpm-alpine # 根据需要修改# 添加更多 pecl install 或 docker-php-ext-install# 来安装项目需要的扩展# 启用 opcacheRUNdocker-php-ext-install opcacheWORKDIR/var/wwwRUNmkdir -p /var/www/.opcache# 复制源码COPYapp ./appCOPYartisan ./artisanCOPYbootstrap ./bootstrapCOPYdatabase ./databaseCOPYconfig ./configCOPYpublic ./publicCOPYresources ./resourcesCOPYroutes ./routesCOPYstorage ./storageCOPYcomposer.* .# 安装 ini 文件COPYzz-opcache.ini /usr/local/etc/php/conf.d# Laravel 的 composer install 需要 .env# 我们复制一个假的 .envCOPY.env.example .env# 安装 PHP 依赖不要把这行移到上面RUNcomposer install --no-dev --optimize-autoloader# 编译并删除 /app 中的源码RUNphp warm-opcache.phpRUN./empty-preserve-time.sh# 恭喜你的代码已经被清除了# 如果不信你可以 ls 你的 /app 目录并 cat 它# 如果需要你可以创建一个 ENTRYPOINT 脚本也可以执行# ./artisan queue:work, 或 ./artisan schedule:workCMD[./artisan serve]现在你可以docker build并docker push到你的注册服务器然后从客户的本地服务器pull而不用裸露地交付代码当你有更新时简单的docker pull就能节省很多时间可能有人会问我们能删除/app目录而不是留空吗不行。因为opcache会检查文件是否存在。额外收获上面的 Dockerfile 不安全。为什么因为 Docker 在每个阶段都使用层意味着当你COPY app ./app时它实际上复制了你未保护的代码并创建了一个层。Docker 专家可以轻松解开这些层获取你的原始代码。解决方案是使用多阶段构建。这是修订后的 Dockerfile。注意我们在第 1 行添加了as build。12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061FROM php:8.3-fpm-alpine as build # 根据需要修改# 添加更多 pecl install 或 docker-php-ext-install# 来安装项目需要的扩展# 启用 opcacheRUNdocker-php-ext-install opcacheWORKDIR/var/wwwRUNmkdir -p /var/www/.opcache# 复制源码COPYapp ./appCOPYartisan ./artisanCOPYbootstrap ./bootstrapCOPYdatabase ./databaseCOPYconfig ./configCOPYpublic ./publicCOPYresources ./resourcesCOPYroutes ./routesCOPYstorage ./storageCOPYcomposer.* .# 安装 ini 文件COPYzz-opcache.ini /usr/local/etc/php/conf.d# Laravel 的 composer install 需要 .env# 我们复制一个假的 .envCOPY.env.example .env# 安装 PHP 依赖不要把这行移到上面RUNcomposer install --no-dev --optimize-autoloader# 编译并删除 /app 中的源码RUNphp warm-opcache.phpRUN./empty-preserve-time.sh# 恭喜你的代码已经被清除了# 如果不信你可以 ls 你的 /app 目录并 cat 它# 这里是多阶段层构建 FROM php:8.3-fpm-alpine # 根据需要修改WORKDIR/var/www# 重复上面完全相同的步骤# 添加更多 pecl install 或 docker-php-ext-install# 来安装项目需要的扩展# 启用 opcacheRUNdocker-php-ext-install opcache# 安装 ini 文件COPYzz-opcache.ini /usr/local/etc/php/conf.d# 从 build 复制清空的文件和 opcache 代码到这里COPY--frombuild /var/www .# 如果需要你可以创建一个 ENTRYPOINT 脚本也可以执行# ./artisan queue:work, 或 ./artisan schedule:workCMD[./artisan serve]到此这篇关于PHP利用Opcache实现保护源码的示例详解的文章就介绍到这了,
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2480996.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!