vregistry / packapp
PackApp.php 工具,用于通过压缩、混淆、打包源代码来创建项目文件的打包包
Requires
- php: >=5.4.0
This package is auto-updated.
Last update: 2024-09-18 22:46:15 UTC
README
PackApp.php 是将应用程序的项目文件打包成交付包的完整解决方案。源代码经过压缩和混淆,以阻止未经授权的使用。
目标受众:ISV、自由职业者、开发者、经销商等需要将项目转换为交付包的轻量级实用工具的用户。该解决方案面向 PHP 应用程序,但也适用于前端项目。
有很多压缩器、混淆器和编码器。一些商业编码器非常好,但价格昂贵,可能需要系统扩展。其他的是仅限于单一源类型。打包器是一个方便的集成解决方案。
工作原理
PackApp.php 打包项目文件:压缩源代码(html、css、js、json、php、xml)、混淆代码(js、php)并压缩结果文件。源可以是单个文件或可能包含子文件夹的文件夹。目标是打包文件或包含打包文件的文件夹。还处理 ZIP 归档:文件夹到 ZIP、ZIP 到文件夹、ZIP 到 ZIP。
打包器根据文件类型将源代码传递给相应的压缩插件。检测到 html 内部的 css 和 js 也进行压缩。寻找 html、css 和 js 中的嵌入 php 以进行压缩(除混淆的 js 外)。您可以为更多文件类型创建用户插件。
js 和 php 代码可以混淆以阻止其未经授权的使用。打包代码的反向工程变得过于昂贵。打包器使用的标识符替换算法比简单的 base64_encode 和 eval 应用更具有保护性。但是,您必须遵循某些命名规则以避免重命名冲突。PHP 混淆由标准版支持。
有几个选项可以控制处理过程。在特定情况下使用它们,并主要依赖默认设置。通过 GUI 启动打包器或直接实例化和调用。返回有关处理结果的各种统计信息。您可以显示和/或保存此数据。
版本控制
打包器有免费版和扩展版。免费版压缩源代码,只能通过实例化启动。
扩展版还包括 GUI,并在使用前需要设置(许可证注册)。扩展版有以下版本
- PackApp Lte - 精简版;压缩源代码(html、css、js、json、php、xml)并混淆 JavaScript 代码。
- PackApp Std - 标准版;提供精简功能并混淆 PHP 代码。
您可以从 此处 获取扩展版。
用法
程序需要 PHP 5.4+。从您的脚本通过 GUI 启动(免费版除外)或实例化(见 软件包)。
启动脚本必须与 PackApp.php 在同一目录中
require('PackApp.php');
A) 启动 GUI
echo PackApp::Packer();
B) 实例化和调用
$obj = new PackApp( [$lvl [,$opt]] );
$obj->Pack( $old [,$new [,$rpl]] );
参数
$lvl - 处理级别,以下整数的总和
- 0 - 压缩(默认值)
- 1 - 编码 JS(Base62,缩小变量)
- 2 - 混淆 PHP(替换标识符)
- 4 - 紧凑 CSS(删除多余数据)
$opt - 选项数组
- exf - 要排除在打包之外的文件夹/文件名通配符数组(默认为 ['*.min.*'])
- sbd - 递归子目录(默认为 true)
- cpy - 复制非压缩文件(默认为 true)
- pgn - 用户插件(见下文)
- sfx - 默认目标名称后缀(默认为 '_pkd')
- sgn - 预先添加到压缩 php/js/css 代码的签名(指定空值以取消默认值);替换
- {app} - 打包器名称;
- {ver} - 打包器版本;
- {time} - 当前 UTC 时间;
- tml - 程序允许运行的时间限制(对于较大的项目,默认为 30)
- log - 记录级别编号:0 - 无,1 - 仅 ok,2 - 所有(默认为 0)
PHP 混淆选项
- ids - 标识符替换标志(任意顺序,小写表示不区分大小写,默认为 'VDHF')
- V - 变量/属性
- D|d - 定义和类常量(d - 仅定义的常量)
- H - 这里文档/现在文档
- F|f - 函数/方法
- C|c - 类
- T|t - 特性
- exi - 要排除在混淆之外的标识符通配符数组(添加到预定义的数组中)
- pfi - 替换标识符的前缀(默认为 '_')
- lni - 替换标识符的左填充零的长度(默认为 0 - 无填充)
- dbg - 调试标志(默认为 false,true - 不压缩)
$old - 源文件/文件夹/存档
$new -- 目标(默认为 $old 值后跟 sfx 选项值)
$rpl -- 如果存在则替换目标(默认为 false)
返回数据
$obj->Pack() 返回结果关联数组
- code - 'ok' 表示成功;否则失败
- prompt - 关于成功/失败/错误的简要消息
- factor - 统计数组(成功);如果为字符串,则表示安装程序的 HTML(除免费版外)
- string - 统计文本(按换行符分隔)
您可以显示和/或保存统计信息。有关使用方法,请参阅 example.php。
打包
默认情况下,文件会被压缩并混淆(如果需要的话,js, php)。php 模板会打包为 html, js, css, php。当源文件类型与以下之一匹配时,处理源文件(允许通配符);
- *htm* - html 代码(htm, html, phtml, ...)
- css* - 样式表
- js - JavaScript 代码
- json - json 字符串
- xml - xml 源
- php* - php 代码
- inc - php 代码
其余的文件将简单地复制或跳过。使用 pgn 选项用于其他类型(见下文)。文件夹或归档源根据 $new 参数保存到目标文件夹或归档。
压缩
相关文件类型的源文件会被压缩,通过删除注释、空白和换行。检查 *htm* 文件中的 style 和 script 标签,其内容也会被压缩。文件(除 xml 外)也会检查 php 标签以压缩其内容。
混淆
根据 $lvl 参数值混淆压缩后的源文件。JavaScript 代码会被打包到 eval() 语句中,以替换原始标识符。PHP 混淆需要标准版。
插件
该软件包包括用于压缩相关源文件的插件(见 软件包)。您可以使用 pgn 选项定义自己的插件以支持其他文件类型。
['pgn' => ['type' => flag]]
- type - 源文件类型,必须与类名称一致(例如,'sql' 需要 PackSQL.php)
- flag - 布尔值 true - 检查嵌入式 php 代码,false - 跳过检查
例如
创建一个新对象:$obj = new PackApp(1, ['pgn' => ['sql' => false]]);
将插件类放入 plugins 文件夹中。像这样通过静态 minify 方法调用
...
public static function minify($source, $options = []) {
$min = new self($options);
return $min->process($source);
}
...
如果您想将您自己的插件包含到包中,请联系我们。
PHP 代码混淆
PHP 代码混淆需要标准版和 PackAppO 插件。建议在规划和编码阶段就遵循一定的命名规则,以避免重命名冲突(见下文)。
php 源代码处理分为两个阶段。第一个阶段在压缩时记录代码中找到的标识符。第二个阶段对第一个阶段记录的标识符执行跨文件重命名。以下标识符可以根据 obf 选项进行替换
- 变量/属性
- 常量(类和已定义的常量)
- heredocs/nowdocs
- 函数/方法
- 类
- 特质
替换可以是大小写不敏感的(除了变量/属性、heredocs/nowdocs、类常量)。
PHP 标识符
使用标识符排除列表(exi 选项)并遵循命名规则,以避免标识符替换冲突
- 小心使用变量变量($$var)或将它们的名称添加到排除列表中(见示例)。
- 不要使用与任何(系统)对象属性名称相同的变量名称。
- 用户常量名称必须与应用程序中使用的任何系统常量名称不同。
- 通过 __get/__set 魔术方法从数组/对象或计算得到的元素名称必须与应用程序中使用的任何变量/属性名称不同。
- 不要混淆要自动加载的类/特质的名称,以及回调中指定的类/方法/函数名称,如 call_user_func('myclass','mymethod')。
- 以 '__' 前缀的标识符不会被混淆。您也可以用这个来排除您的标识符。
- 如果需要,请为您的标识符添加前缀或将它们添加到排除列表中,以遵循(2、3、4、5)。
- 小心函数、类、特质和定义的常量的大小写不敏感的名称。
- 示例命名约定
- 变量、属性、常量 - 使用驼峰命名法(camelCase);
- heredocs、nowdocs - 使用大写字母(UPPERCASE);
- 函数、方法、类、特质 - 使用帕斯卡命名法(PascalCase);
这些规则遵循自然且安全,避免了标识符名称冲突。使用 dbg 选项来解决非压缩混淆结果中的重命名问题。
安装
解压缩获取到的包,并将文件上传到您选择的网络目录。然后运行 example.php。扩展版需要在使用之前进行设置。如果尚未设置,它将自动启动安装程序。从浏览器运行 PackApp.php 直接启动安装程序。
包含的示例将 tests.zip 文件中的文件压缩/混淆,并将结果输出到 tests_pkd 文件夹。一条消息会通知结果。收集的统计信息由打包器显示并保存到 example.txt。
复制 example.php 并用不同的源、目标选项尝试。运行 index.php 以启动扩展版提供的 GUI。
更新
扩展版提供版本更新。GUI 中的 关于 部分显示安装和更新信息,并允许编辑您的联系数据。从浏览器运行 PackApp.php 并单击 更新 按钮直接检查更新。您的联系数据仅用于重要产品相关消息。如果您的联系信息更改,请进行编辑。
如果更新失败,则创建的 update.php 和 update.json 文件允许恢复 - 运行 update.php。
包
plugins 文件夹包含从开源中调整的混淆器。免费版本不包括 addons 文件夹。文件列表
- PackApp.php - 应用程序打包类
- PackApp.log - 打包日志(动态创建)
- addons/.htaccess - 禁止外部访问
- addons/PackAppO.php - 加密扩展类
- addons/PackAppS.php - 服务类
- addons/PackAppS.json - 配置设置
- plugins/PackCSS.php - 由 Tubal Martin 开发的样式表压缩类
- plugins/PackHTM.php - 由 Stephen Clay 开发的HTML压缩类
- plugins/PackJS.php - 由 Ryan Grove 开发的js压缩类,以及由 Nicolas Martin 开发的压缩类,最初由 Dean Edwards 开发
- plugins/PackJSON.php - 由 Tiste 开发的json压缩类,最初由 Kyle Simpson 开发
- plugins/PackPHP.php - php压缩类,调整自 GelaMu 的算法
- plugins/PackXML.php - 由 Vallo Reima 开发的xml压缩类
- example.php - 实例化示例脚本
- tests.zip - 使用示例的测试文件
- index.php - GUI启动脚本(除免费版本外)
特别感谢提到的作者。有关Packer的任何问题,请联系。
变更日志
- 2016年8月16日
- 压缩CSS选项($lvl参数)
- GUI结果下载
- 2016年10月19日
- ZipArchive PHP7兼容性