vregistry/packapp

PackApp.php 工具,用于通过压缩、混淆、打包源代码来创建项目文件的打包包

0.1.4 2017-04-16 04:50 UTC

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 内部的 cssjs 也进行压缩。寻找 htmlcssjs 中的嵌入 php 以进行压缩(除混淆的 js 外)。您可以为更多文件类型创建用户插件。

jsphp 代码可以混淆以阻止其未经授权的使用。打包代码的反向工程变得过于昂贵。打包器使用的标识符替换算法比简单的 base64_encodeeval 应用更具有保护性。但是,您必须遵循某些命名规则以避免重命名冲突。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 - 调试标志(默认为 falsetrue - 不压缩)

$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* 文件中的 stylescript 标签,其内容也会被压缩。文件(除 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 选项)并遵循命名规则,以避免标识符替换冲突

  1. 小心使用变量变量($$var)或将它们的名称添加到排除列表中(见示例)。
  2. 不要使用与任何(系统)对象属性名称相同的变量名称。
  3. 用户常量名称必须与应用程序中使用的任何系统常量名称不同。
  4. 通过 __get/__set 魔术方法从数组/对象或计算得到的元素名称必须与应用程序中使用的任何变量/属性名称不同。
  5. 不要混淆要自动加载的类/特质的名称,以及回调中指定的类/方法/函数名称,如 call_user_func('myclass','mymethod')
  6. '__' 前缀的标识符不会被混淆。您也可以用这个来排除您的标识符。
  7. 如果需要,请为您的标识符添加前缀或将它们添加到排除列表中,以遵循(2、3、4、5)。
  8. 小心函数、类、特质和定义的常量的大小写不敏感的名称。
  9. 示例命名约定
    • 变量、属性、常量 - 使用驼峰命名法(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.phpupdate.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兼容性