当前位置: 首页 > article >正文

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实现保护源码的示例详解的文章就介绍到这了,

相关文章:

PHP利用Opcache实现保护源码的示例详解

不用 IonCube(或类似的)。不知道这是啥的话,就是加密 PHP 代码但还能运行的工具。问题是太贵了。性能要好,PHP 原生支持。后来想到,PHP 有个"opcache"功能,能把源码编译成操作码(机器…...

PHP serialize进行序列化工作的完全指南

如果你和我一样,第一次在 PHP 中看到序列化字符串时会觉得很困惑。我当时在做一个 Laravel 项目,想搞清楚将任务推送到队列时到底发生了什么。我发现一些数据被序列化了,但不知道为什么以及怎么工作的。不过在我花时间研究序列化后&#xff0…...

WuliArt Qwen-Image Turbo效果对比:FP16黑图频发 vs BF16稳定出图实测

WuliArt Qwen-Image Turbo效果对比:FP16黑图频发 vs BF16稳定出图实测 1. 引言:从“黑图”困扰到稳定出图 如果你用过一些本地部署的文生图模型,可能遇到过这样的糟心事儿:满怀期待地输入一段描述,点击生成&#xff…...

Qwen3.5-9B快速上手:3步启动WebUI(supervisorctl restart)超详细步骤

Qwen3.5-9B快速上手:3步启动WebUI(supervisorctl restart)超详细步骤 1. 开篇介绍 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,具备强大的逻辑推理、代码生成和多轮对话能力。特别值得一提的是,它的多模态变体Qw…...

lingbot-depth-pretrain-vitl-14多场景落地:AR实时遮挡、3D重建、工业检测一文详解

lingbot-depth-pretrain-vitl-14多场景落地:AR实时遮挡、3D重建、工业检测一文详解 想象一下,你手里只有一部普通的手机摄像头,却想让它像人眼一样“感知”距离,知道哪个物体离你近,哪个离你远。或者,你有…...

GLM-OCR GPU算力优化实践:vLLM推理加速+令牌下采样,吞吐提升2.3倍

GLM-OCR GPU算力优化实践:vLLM推理加速令牌下采样,吞吐提升2.3倍 1. 项目背景与优化需求 GLM-OCR是一个基于GLM-V编码器-解码器架构构建的多模态OCR模型,专门为复杂文档理解而设计。这个模型集成了在大规模图文数据上预训练的CogViT视觉编码…...

Qwen3.5-9B-AWQ-4bit部署教程:双卡RTX 4090 D显存优化与AWQ量化优势解析

Qwen3.5-9B-AWQ-4bit部署教程:双卡RTX 4090 D显存优化与AWQ量化优势解析 1. 模型概述 Qwen3.5-9B-AWQ-4bit是一个支持图像理解的多模态模型,能够结合上传图片与文字提示词,输出中文分析结果。这个模型特别适合处理以下任务: 图…...

丹青幻境效果对比:Z-Image底座 vs SDXL在人物结构准确率与衣纹表现力评测

丹青幻境效果对比:Z-Image底座 vs SDXL在人物结构准确率与衣纹表现力评测 1. 评测背景与意义 在数字艺术创作领域,人物结构准确性和衣纹表现力一直是衡量AI绘画模型质量的关键指标。本次评测聚焦于丹青幻境采用的Z-Image底座与业界知名的SDXL模型&…...

Nunchaku FLUX.1-dev部署教程:Linux系统下CUDA驱动与PyTorch匹配指南

Nunchaku FLUX.1-dev部署教程:Linux系统下CUDA驱动与PyTorch匹配指南 想用最新的Nunchaku FLUX.1-dev模型生成惊艳的AI图片,结果卡在了环境配置上?别担心,这篇教程就是为你准备的。很多朋友在部署时遇到的最大障碍,往…...

RVC与ElevenLabs对比:开源可控性vs商业易用性深度分析

RVC与ElevenLabs对比:开源可控性vs商业易用性深度分析 想用AI克隆自己的声音,或者让喜欢的角色开口唱歌?现在市面上有两大主流选择:开源的RVC和商业化的ElevenLabs。一个免费但需要折腾,一个付费但开箱即用。到底哪个…...

千问3.5-27B效果实测:低质量扫描件文字区域检测与内容还原

千问3.5-27B效果实测:低质量扫描件文字区域检测与内容还原 1. 模型介绍 Qwen3.5-27B是Qwen官方发布的视觉多模态理解模型,具备强大的文本对话与图片理解能力。本镜像已在4张RTX 4090 D 24GB显卡环境下完成部署,提供中文Web对话界面、流式文…...

WuliArt Qwen-Image Turbo高清图展示:1024×1024下4K显示器100%缩放无模糊

WuliArt Qwen-Image Turbo高清图展示:10241024下4K显示器100%缩放无模糊 提示:本文所有展示图片均为WuliArt Qwen-Image Turbo模型直接生成,未经任何后期处理 1. 项目概述:重新定义个人GPU文生图体验 WuliArt Qwen-Image Turbo是…...

OpenClaw任务链设计:千问3.5-35B-A3B-FP8复杂流程自动化

OpenClaw任务链设计:千问3.5-35B-A3B-FP8复杂流程自动化 1. 为什么需要任务链自动化 上周我遇到一个典型的工作场景:需要从20份PDF报告中提取关键数据,整理成Excel表格,再根据这些数据生成分析图表,最后通过邮件发送…...

C++编程中new与delete操作符的深度解析

C编程中new与delete操作符的深度解析 在C编程的广阔天地里,内存管理是一个既基础又至关重要的环节。对于每一位C开发者而言,掌握内存的动态分配与释放是构建高效、稳定应用程序的基石。在众多内存管理工具中,new与delete操作符无疑是最为核心…...

C++编程中堆与栈内存的差异解析

C编程中堆与栈内存的差异解析 在C编程的世界里,内存管理是一个核心且至关重要的概念。其中,堆(Heap)与栈(Stack)作为两种主要的内存分配区域,各自扮演着不同的角色,理解它们之间的区…...

C++编程进阶:探索内建数学函数与C++20的<numbers>头文件

C编程进阶:探索内建数学函数与C20的头文件 在C编程的世界里,数学运算无处不在,无论是游戏开发中的物理模拟、图形处理,还是数据分析中的复杂计算,数学函数都是不可或缺的工具。随着C标准的不断演进,C20引入…...

OpenClaw模型微调集成:Qwen3-14b_int4_awq领域适配实战

OpenClaw模型微调集成:Qwen3-14b_int4_awq领域适配实战 1. 为什么需要领域专用模型 去年我在处理法律合同自动化生成项目时,发现通用大模型在专业术语和条款逻辑上总是差强人意。模型要么生成过于笼统的表述,要么在引用法律条文时出现事实性…...

阶跃星辰(Step):前微软小冰之父的 AI 豪赌

阶跃星辰(Step):前微软小冰之父的 AI 豪赌 一句话概括:阶跃星辰(StepFun)是由微软小冰前负责人姜大鑫创立的 AI 公司,其 Step-2 大模型达到万亿参数级别,是国内少数真正挑战顶级闭源…...

Nature Microbiology|质粒驱动的抗菌素耐药性进化:插入序列介导的基因失活新机制

背景 抗菌素耐药性(AMR)是全球公共卫生面临的严峻挑战。细菌进化出耐药性的主要途径包括基因突变和通过水平基因转移(Horizontal Gene Transfer, HGT)获得外源耐药基因。在后者中,接合质粒扮演了核心角色,它…...

DeepSeek LeetCode 1125.最小的必要团队 public int[] smallestSufficientTeam(String[] req_skills, List<List

这是 LeetCode 1125 “最小的必要团队”问题。要求从候选人中选择一个最小的团队,使得团队成员的技能集合覆盖所有必需的技能。问题理解 有一个技能需求列表 req_skills,如 ["java", "python", "cpp"]有 people 列表&…...

InfluxDB(一)——一个高效处理数据的时序数据库

目录 一、什么是时序数据库InfluxDB? 关系型数据库(行式存储)是怎么存的? 时序数据库(列式存储)是怎么存的? 二、InfluxDB的特点 1. 极致的写入性能 2. 高效的存储压缩 3. 独特的数据模型…...

DeepSeek LintCode 3706 · 满足条件的数对的数量 public long countValidPairs(int[] nums1, int[] nums2, int dif

这个问题是 LintCode 3706 “满足条件的数对的数量”&#xff0c;要求统计满足 nums1[i] - nums1[j] < nums2[i] - nums2[j] diff&#xff08;其中 i < j&#xff09;的数对 (i, j) 的数量。 问题理解 给定两个数组 nums1 和 nums2&#xff0c;以及一个整数 diff&#…...

光伏混合储能直流微电网simulink模型 1.直流微电网由锂电池,超级电容,光伏和直流负载组成 2

光伏混合储能直流微电网simulink模型 1.直流微电网由锂电池&#xff0c;超级电容&#xff0c;光伏和直流负载组成 2.光伏采用电导增量法实现最大功率输出 3.锂电池和超级电容采用直流母线电压控制策略&#xff0c;根据直流母线电压高低实现充放电 实现以下目标&#xff1a; 1.光…...

OpenClaw省钱全攻略,掌握这5招,每月少花几百块冤枉钱

手把手教你一键部署OpenClaw&#xff0c;连接微信、QQ、飞书、钉钉等&#xff0c;1分钟全搞定&#xff01; 刚把OpenClaw折腾好&#xff0c;你可能正沉浸在AI秒回代码、自动理任务的神奇体验里&#xff0c;心里直呼过瘾。可还没等新鲜劲过去&#xff0c;一翻后台账单&#xff…...

别只盯着 Claw 了,这波“真香”技能才是真的生产力神器!

手把手教你一键部署OpenClaw&#xff0c;连接微信、QQ、飞书、钉钉等&#xff0c;1分钟全搞定&#xff01; 说白了&#xff0c;各家大厂出的 Claw 产品&#xff0c;核心逻辑就是“AI 大模型 技能插件”。模型是地基&#xff0c;而你用得爽不爽&#xff0c;全看这些技能给不给…...

深夜调车的时候突然发现,Apollo的泊车轨迹优化藏着不少“骚操作“。咱们今天不聊虚的,直接扒开代码看三个核心模块怎么打架...哦不,怎么配合的

apollo 泊车轨迹优化代码 hybridastariaps平滑优化obca平滑优化 第一个图是matlab绘制 后面的图是程序用sdl库绘制先看Hybrid A*这个愣头青。这货生成的轨迹就像刚拿驾照的新手&#xff0c;能避开障碍物但轨迹拧巴得很。看看它扩展节点的代码片段&#xff1a; Node3D* expand(…...

Ruby开发工具JetBrains RubyMine

链接&#xff1a;https://pan.quark.cn/s/6d78ff88b12eJetBrains RubyMine是一个全新的为Ruby 和 Rails开发者准备的代码编辑器 &#xff0c;对于Ruby这种比较新兴的编程语言&#xff0c;如果你是Ruby的爱好者&#xff0c;不妨试试使用它作为你的开发工具。软件是建立在IntellJ…...

Python面向对象:封装、继承、多态

作为Python面向对象编程&#xff08;OOP&#xff09;的三大核心特性&#xff0c;封装、继承、多态是从编程新手进阶到熟练开发者的必备知识。它们不是晦涩的理论&#xff0c;而是能让代码更简洁、复用性更强、扩展性更好的实用工具。 一、什么是面向对象&#xff1f; 在讲三大特…...

COMSOL锂枝晶生长仿真模拟:四场耦合(化学场、浓度场、电场、应力场)

comsol锂枝晶生长仿真模拟-应力耦合。 化学场、浓度场、电场、应力场&#xff0c;四场耦合模拟锂枝晶的生长。锂金属负极在固态电池中总爱搞事情&#xff0c;枝晶刺穿隔膜的戏码天天上演。实验室里做破坏性测试成本太高&#xff0c;数值仿真就成了预判枝晶生长路径的透视眼。CO…...

SecGPT-14B+OpenClaw联调指南:解决模型响应超时问题

SecGPT-14BOpenClaw联调指南&#xff1a;解决模型响应超时问题 1. 问题背景与场景定位 上周在尝试用OpenClaw调用SecGPT-14B分析一份12万字的网络安全报告时&#xff0c;遭遇了令人头疼的响应超时问题。这个场景很典型——当我们需要处理长文本安全分析时&#xff0c;模型推理…...