2023年6月21日发(作者:)

php在线解密mzphp,mzphp2:mzphp:第⼀款⽀持scss语法、cssspri。。。gitbook 在线⽂档:enphp 在线加密:更新历史[2016.12.30]新增:增加 domain router 可加⼊默认 request 参数增加模板引擎压缩 类可同时实例化多个缓存 CACHE::instance('xxx')增加 DB::select() 查询列表,可返回索引下标增加 hook ⽅法,可⽤于实现插件或者扩展。base_control 加⼊缓存页⾯功能,在 control 对应⽅法中调⽤ $this->cache_page($cache_key, $cache_time = 60);,即可缓存当前页⾯渲染结果,下次访问直接读内存。模板 static 语法增加⾃动检测同⽬录 ,⽤于⾃动压缩后,可不需要调⽤ mzphp 的 js 压缩引擎,获得更⾼性能。修复:修复 abs_url dir='0' 的问题修复 pdo_mysql 在 PHP7下的BUG重命名 hook 缓存⽂件修复在 cli 命令⾏下运⾏脚本太久导致运⾏时间显⽰不正确的问题.修复 spider 类在⾃动识别 charset 时对于 jpg 图⽚有 xml 代码时的问题,$header 传⼊ array('charset'=>'bin') 关闭⾃动识别 htmlcharset功能。优化:优化 redis 类的性能,更加友好⽀持 redis 扩展⽅法,例如 CACHE::instance('redis')->lpop();优化 mysql build_where ⽅法[2016.1.27]新增:⽀持从⼊⼝⽂件中加载 control新增独创的 EnPHP ⼯具:可将 PHP 项⽬混淆加密,欢迎试⽤模板引擎新增编译前缀,⽤于站群模式多个站点可复⽤不同⽬录下相同⽂件名的模板新增地址重写⽀持多级数组,例:/where[time][0]/20120102/where[time][1]/20120103/url ⽅法 action 增加默认值spider 类在 HTTPS 请求时⽀持 SSL 证书模板引擎新变量{CDN},⽤于绑定 CDN 路径修复:core::json_encode 不⽀持部分中⽂字符集的 BUGspider 在 5.6 版本中⽆法⽀持 @ 上传⽂件的问题在某些环境下的 warning 提⽰优化:优化模板引擎,去除兼容变量,部分⽆⽤注释性能评测既然⼤家都对性能这么有疑问,那么我拿 Hello World 来做⼀个简单的评测:如何评测性能?XDEBUG 后能产⽣⼀个 profile通过 wincachegrind 能直观看到框架每⼀⾏的性能损耗。测试环境Windows 虚拟机,i7 2核 + 1G内存。PHP 最基础环境。测试框架mzphp 最新版本(2015.11.30)TP 最新版本(2015.11.30)CI 最新版本(3.02)测试结果为了最佳性能,会让三个框架连续运⾏ 20 次,然后输出 XDEBUG 的 profile:最终的 profile ⽂件⼤⼩对⽐:结果对⽐mzphp 的 profile line-by-line结果:TP 的 profile line-by-line结果:CI 的 profile line-by-line结果:mzphp 的 profile overall结果:TP 的 profile overall结果:CI 的 profile overall结果:mzphp 跑热后,项⽬加载以及页⾯运⾏的时间为 1.6msCI 跑热后,项⽬加载以及页⾯运⾏的时间为 2.7ms⽽ TP 跑热后,页⾯运⾏时间为:5.5ms具体的 profile 数据,⼤家可以下载⾃⾏查看(window 下使⽤ wincachegrind 查看):序很久以来,楼主开发站点⽆数,⼀直希望能有⼀个枚,⽇开数站的 PHP 框架出现。mzphp 介绍PHP 开发框架 mzphp,拥有特点:性能,⾼性能极致加载、⾼效率编译和读取!清晰,⼤量注释及实例,⼏分钟就上马进门!⼩巧,整个框架 100k,⼏乎没有冗余代码!奔放,⽀持 http 和 cli 双运⾏,php {$control} {$action} 就能体验 PHP 在命令⾏下的奔放。(可⽤于后台常驻内存、爬⾍等)易⽤,优化过的 discuz 模板引擎,使模板调⽤更加简约(兼容 php 标签,⽀持static、block、{method()}等标签)安全,简单⼜安全的取参数过程,有效防⽌ xss,封装的 SQL 防注⼊过程,确保系统安全。扩展,丰富的库和插件:MySQL、PDO 引擎、scss 语法⽀持、css 压缩、css sprite ⽣成、js 合并、js 压缩等。(前后端开发相亲相爱不再分离)调试,详细的 DEBUG、运⾏时间和SQL查询信息,只需在 URL 中加上固定参数,简单好⽤。mzphp 做为⼀直追求⾼效、简单、快速开发的 PHP 框架,希望⼤家多多⽀持。mzphp 运⾏的环境操作系统:windows、linuxPHP 环境:PHP 5.3+PHP 扩展:php-gd、php-mbstring、php-curlPHP 扩展(数据库):php-mysql 或 php-pdoPHP 扩展(缓存):php-memcached 或 php-redis如果需要 php 在 cli (命令⾏) 下运⾏,⽽您的操作系统是 windows。请在系统 -> 环境变量 -> PATH -> 添加你的 所在路径拉取 mzphp 代码git clone git@:mz/完后,可更新⼦项⽬例⼦:git submodule update⽣成第⼀个项⽬假我们需要建⽴的项⽬名称为:hello_world请在项⽬⽬录建⽴⼀个hello_world(与 mzphp ⽬录同级)复制 tools ⽬录下的 create_ 到 hello_world ⽬录。提供两种⽅法⽣成项⽬结构:第⼀种:打开浏览器访问 create_ ,⽣成第⼆种:在命令⾏下cd hello_worldphp create_访问⽣成的 ,可看到 mzphp Framework 字样,即访问成功.mzphp ⽬录⽂件cache 缓存⽀持(file、memcache、redis)core 核⼼⽅法db 数据库⽀持(mysql、pdo_mysql、pdo_sqlite)debug 调试⽀持helper ⼀些扩展库以及⽅法(log、misc、spider)plugin 插件⽬录 ⼊⼝⽂件项⽬⽬录⽂件conf 项⽬配置⽬录control 项⽬控制器⽬录core 默认 include 的库、基类、⽅法等data 项⽬数据保存⽬录static 所有静态⽂件(css/js/图⽚)存储⽬录view 项⽬模板⽬录 ⼊⼝⽂件配置项⽬参数打开项⽬ conf/conf.{env}.php 可按照注释编辑对应的参数。{env}代表运⾏环境,由 $_SERVER['ENV'] 来控制 (默认为 debug)。在 nginx 中,您可以通过添加:fastcgi_param ENV 'online';来切换线上、线下环境。附上⼀些⼩的参数修改 中,在定义 DEBUG 处,来设置启动 debug 的 url 参数。 中,在定义 FRAMEWORK_PATH 处,可修改 mzphp 框架所处的路径调试⽅法 中,你可以直接设置 define('DEBUG', 1) 永久打开 debug也可以修改 hello_world_debug 这个字符串来告之项⽬当 url 中包含该字符时,⾃动开启 debug。debug 开启时,右下⾓将出现⼀个浮动的运⾏时间展⽰,点击开来可以看到具体页⾯运⾏的信息。注意mzphp 框架为了减少磁盘 I/O,提⾼加载性能,会在项⽬第⼀次运⾏时,⽣成的缓存⽂件在 data/ 中。缓存的代码为: mzphp 框架下所有⽂件和项⽬ core ⽬录中所有 *. ⽂件。当开启 debug 后,所有⽂件均为动态加载,会跳过加载缓存 。当开启 debug 后,模板编译后的缓存⽂件不会加载。当开启 debug 后,css 合并、js 合并等静态⽂件会重新⽣成。mzphp 控制器在项⽬ control ⽬录中建⽴⼀个 user_同时,在该⽂件中定义⼀个 user_control 继承 base_control!defined('FRAMEWORK_PATH') && exit('Accesss Deined');class user_control extends base_control {public function on_index(){// define user$user = 'djunny';// assign variablesVI::assign('user', $user);// default template path is view/user_$this->show();}}$this->show 调⽤显⽰模板,可以⾃动识别为 view/user_,即 {$control}_{$action}.htm假如,view/user_ 如下:hello {$user}使⽤ ?c=user-index 可访问到 user_control 的 on_index ⽅法,显⽰结果:hello djunny同时,使⽤命令⾏下:php user index也能在命令⾏下看到同样的结果⼩建议:在命令⾏下,你可以 core 中建⽴⼀个 cmd_control,在析构⽅法中做⼀些限制,例如判断是否 cmd 下运⾏(可以⽤ core::is_cmd() ⽅法), user_control 继承 cmd_control,能有效的防⽌ control 被 http 请求到。在命令⾏下,不建议使⽤ echo 来输出 log,可以使⽤帮助类 log::info($output) 来输⼊出 log。$output 可以为字符串、数字、数组、MAP。VI::assign 是传引⽤绑定变量、VI::assign_value 是传值绑定变量如果调⽤ $this->show('user/index'),代表渲染 view/user/ 模板⽂件。mzphp DAO 数据层第⼀步:配置 conf ⽂件中的 db。第⼆步:创建 user 表:CREATE TABLE `user` (`id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '',PRIMARY KEY (`uid`)) DEFAULT CHARSET=utf8 COMMENT='user'第三步,model 层有⼆种调⽤⽅法。第⼀种,不定义 model,直接使⽤!defined('FRAMEWORK_PATH') && exit('Accesss Deined');class user_control extends base_control {public function on_index(){// SELECT * FROM user WHERE id =1$user = DB::T('user')->get(1);// ...}}此⽅法⽤于简单的 DAO 层调⽤。第⼆种,在项⽬ model ⽬录中,新建⼀个 定义 user 继承⾃ base_model,!defined('FRAMEWORK_PATH') && exit('Accesss Deined');class user extends base_model {function __construct() {parent::__construct('user', 'id');}}>在控制器中使⽤!defined('FRAMEWORK_PATH') && exit('Accesss Deined');class user_control extends base_control {public function on_index(){// SELECT * FROM user WHERE id =1$user = $this->user->get(1);// ...}}mzphp 中,控制器会⾃动加载并初始化对应的 model 层。另外:mzphp 也⽀持原⽣查询 SQL,使⽤以下⽅法:// add table prefix$table = DB::table('user');// build SQL$sql = sprintf("SELECT * FROM %s WHERE id=%d", $table, 1);// get query and return first row$first_row = DB::query($sql, 1);// get query$query = DB::query($sql);while($val = DB::fetch($query)){log::info($val);}// select method// get first row from user where id =1$user = DB::select('user', array('id'=>1), ' id ASC', 0);// get all user array$user_list = DB::select('user');// get user count$user_count = DB::select('user', 0, 0, -2);mzphp 模板引擎 - 基础语法默认注释语法{code} 嵌⼊属性语法{$variable} 输出变量{CONSTANT} 输出常量{$array['index']} 输出数组下标{function(param1, param2, )} 调⽤原⽣⽅法模板中动态渲染内容,基本上由以上语法组成。语法1 多⽤于 html 块级输出,例:语法2 多⽤于元素属性输出,例:语法6 调⽤原⽣⽅法,输出值必须为⽅法结果 returnmzphp 模板引擎 - ⼦模板说明:加载⼀个⼦模板。(⼦模板最多⽀持三层嵌套)语法:mzphp 模板引擎 - 逻辑判断说明:if else 逻辑判断语法:a = b AND b = $bb = $b OR a = $aa = 1a != 1mzphp 模板引擎 - 循环说明:循环输出列表,可嵌套输出语法:categories[$index]= {$cate['name']}mzphp 模板引擎 - eval 标签说明:执⾏ php 代码。语法:mzphp 模板引擎 - ⽅法调⽤标签说明:调⽤的⽅法并输出返回的内容。(⽅法必须以返回值)语法:{date('Y-m-d')}{substr('123', 1)}{print_r(array(1), 1)}{spider::html2txt('')}mzphp 模板引擎 - 静态⽂件语法:说明:source_file ⽂件后缀为 scss 或者 js 时,会调⽤对应的编译类对⽂件进⾏编译和⽣成,⽣成的⽂件路径:static/{$target_file}is_compress 参数可以为 0 或 1(默认 1),为 1 时,source_file 压缩,反之⽽不压缩。在 debug 开启后,每次访问页⾯,都会⽣成⼀遍静态⽂件。在代码 push 的时候,需要产⽣的所有静态⽂件提交(线上不会再编译静态资源)规范建议编译后的缓存⽂件名都使⽤ _ 开头命名,这样后期⽅便清理。编译后的 css ⽂件只能在原 css ⽬录(否则相对路径的图⽚可能加载失败)编译后的 js ⽂件最好在原 js ⽬录(除⾮你的 js ⽂件没有对路径有依赖)静态⽂件寻找先后顺序static/view/关于 css sprite当 source_file 以 * 结尾时, 识别为 css sprite 模式,程序将会对 source_file ⽬录中的所有⽂件进⾏合并,读取所有图⽚的 size ,⽣成对应的 scss ⽂件和合并的 png ⽂件:target_ (命名⽅式:.filename-png,⽂件名中_和.替换成-)target_(不需要重复的图⽚合并⽂件)target_ (需要 x 轴重复的图⽚合并⽂件)target_(需要 y 轴重复的图⽚合并⽂件)实例在以上例⼦中,系统做了以下处理:1.先合并 scss/png/ 中所有图⽚为: scss/,同时⽣成坐标 scss ⽂件:scss// 中调⽤ @import 'sprite'; 然后⽤ scss 语法来继承对应的 icon 或 图⽚即可,例(图⽚路径中.会变成-,更具体可以先成⽣⼀次后,打开⽣成后的看看):.find{@extend .loading-png;}3.开启合并⽂件 js/_ ,并将 js/ 写⼊。4.读取 js/,写⼊ js/_ 尾部。5.读取 js/,并压缩,写⼊ js/_6. 替换成 空7. 替换成 < link rel="stylesheet" href="scss/_">8. 替换成 < script src="js/_"> script>9. 均替换成空mzphp 地址重写地址重写规则:.htaccessOptionsRewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d#control + actionRewriteRule ^(w+)(?:[/-_|.,])(w+)(?:[/-_|.,])(.*)$ ?c=$1-$2&rewrite=$3 [L]#controlRewriteRule ^(w+)(?:[/-_|.,])(.+)$ ?c=$1&rewrite=$2 [L]apache [ISAPI_Rewrite]RepeatLimit 32RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d#control + actionRewriteRule ^(w+)(?:[/-_|.,])(w+)(?:[/-_|.,])(.*)$ ?c=$1-$2&rewrite=$3 [L]#controlRewriteRule ^(w+)(?:[/-_|.,])(.+)$ ?c=$1&rewrite=$2 [L]#control + actionrewrite ^(w+)(?:[/-_|.,])(w+)(?:[/-_|.,])(.*)$ ?c=$1-$2&rewrite=$3 last;#controlrewrite ^(w+)(?:[/-_|.,])(.+)$ ?c=$1&rewrite=$2 last;iis 7mzphp ⾃定义 URL1.⾮地址重写链接:?c=control-action&var=...2.系统地址重写(该地址中的 / 分隔符和 [.html] 均可在conf⽂件中配置):/control/action/param1/param1value/[.html]conf/conf.[env].php 配置⽂件://url rewrite params'rewrite_info' => array('comma' => '/', // options: / - _ | . ,'ext' => '.html',// for example : .htm),使⽤系统地址重写时,您可以使⽤url⽅法,来⽣成url:function url($control, $action, $params = array()) ;例:echo url('index', 'index', array('id'=>1));echo url('index-index', array('id'=>1));echo url('index-index', 'id=1&time=2015');3.⾃定义地址重写:?c=control-action&rewrite=例如,我们需要使⽤:/help/123/ 来映射 ?c=article-help&id=123可以在 urlrewrite 重写⽂件中配置(以 .htaccess 语法为例):RewriteRule ^(help)/(d+)/?$ ?c=article-$1&rewrite=id/$2 [L]注:本例中 rewrite 参数传⼊的分割符(/),视 rewrite_info 中的 comma ⽽定。钩⼦⽅法 HOOK通过钩⼦⽅法,能在系统任何代码处调⽤在 hook 中注册的⽅法。可⽤于插件或者扩展功能实现。运⾏ hookfunction hook($name) {}输出 hook输⼊ hook ⼀般在模板中直接调⽤⽐较多function out_hook($returns, $implode = '') {}钩⼦使⽤例⼦在项⽬根⽬录的 中 ,定义存放钩⼦类的⽬录(例⼦中定义为项⽬根⽬录的 hook⽬录)define('HOOK_PATH', ROOT_PATH.'hook/');在对应⽬录下,创建⼀个 hook ⽬录 。hook ⽬录下建⽴⼀个 hook_,内容如下:class hook_xxx {static function func($abc = ''){return '';}}TIP:hook_ 和 PHP ⽂件 class hook_xxx 必须⼀致。此时,清理 tmp ⽬录(如果没有开启 DEBUG 模式则需要每次修改 hook ⽂件后操作)后,在任意代码地⽅调⽤:hook('func');也⽀持参数传⼊:hook('func', 'abc');即调⽤对应 hook 到所有类包含的 func 静态⽅法。TIP:并不是每个⽅法都会被 hook,记住,hook_xxx 类中带 _ (下划线)开头的静态⽅法是⽆法调⽤的。TIP:同理,您可以将不想公开的⽅法⽤ _ (下划线)开头,防⽌ hook cache 到过多的⽅法,这样既可以优化 hook 扫描时的性能,⼜可以避免外部访问到。hook ⽅法 返回结果类型为:Array因为在 hook ⽬录中,存在的同样静态⽅法的类会有多个,调⽤时每个⽅法都会去调⽤⼀遍,所以会以数组形式返回。循环输出或者在模板中可⽤{out_hook(hook('func'), '')}即可。⼩技能hook 可以按⽂件名顺序来排序,加排序的⽅法:___数字越⼤,越优先加载,TIP:插件排序,⾮特殊情况建议不要使⽤~TIP: 如果调⽤ hook 途中,需要中⽌加载其它类的调⽤。请在⽅法中返回:return array(// 通知 hook 系统不需要再运⾏其它 hook 类⾥的⽅法了'HOOK' => HOOK_STOP,// 返回的结果'return' => 'xxxxx',);EnPHP 加密⼯具的说明EnPHP ⼯具的路径:tools/enphp_HP 是⼀款可以加密混淆 PHP 5-7 的⼯具,现内置于 mzphp Framework 中。EnPHP 经多⽅测试已经⽀持加密混淆 99% 以上的 PHP 代码,欢迎测试反馈。使⽤⽅法:将 enphp_ 拷⾄您的项⽬中修改 enphp 中适合你的 option 参数(选)修改 enphp_control 中 on_index ⽅法⾥需要加密的⽂件(选)在浏览器中访问本⽂件,或者使⽤ php enphp_ 命令⾏模式执⾏加密P.S. 重要的事情说三遍:备份!备份!备份!请在加密前备份好您的源码⽂件,通过 EnPHP 加密的⽂件均⽆法恢复!否则请不要使⽤。P.S.S. 您也可以将 enphp 类与 spider 类拷出去单独使⽤。enphp 在线加密地址:更多实例敬请期待。

2023年6月21日发(作者:)

php在线解密mzphp,mzphp2:mzphp:第⼀款⽀持scss语法、cssspri。。。gitbook 在线⽂档:enphp 在线加密:更新历史[2016.12.30]新增:增加 domain router 可加⼊默认 request 参数增加模板引擎压缩 类可同时实例化多个缓存 CACHE::instance('xxx')增加 DB::select() 查询列表,可返回索引下标增加 hook ⽅法,可⽤于实现插件或者扩展。base_control 加⼊缓存页⾯功能,在 control 对应⽅法中调⽤ $this->cache_page($cache_key, $cache_time = 60);,即可缓存当前页⾯渲染结果,下次访问直接读内存。模板 static 语法增加⾃动检测同⽬录 ,⽤于⾃动压缩后,可不需要调⽤ mzphp 的 js 压缩引擎,获得更⾼性能。修复:修复 abs_url dir='0' 的问题修复 pdo_mysql 在 PHP7下的BUG重命名 hook 缓存⽂件修复在 cli 命令⾏下运⾏脚本太久导致运⾏时间显⽰不正确的问题.修复 spider 类在⾃动识别 charset 时对于 jpg 图⽚有 xml 代码时的问题,$header 传⼊ array('charset'=>'bin') 关闭⾃动识别 htmlcharset功能。优化:优化 redis 类的性能,更加友好⽀持 redis 扩展⽅法,例如 CACHE::instance('redis')->lpop();优化 mysql build_where ⽅法[2016.1.27]新增:⽀持从⼊⼝⽂件中加载 control新增独创的 EnPHP ⼯具:可将 PHP 项⽬混淆加密,欢迎试⽤模板引擎新增编译前缀,⽤于站群模式多个站点可复⽤不同⽬录下相同⽂件名的模板新增地址重写⽀持多级数组,例:/where[time][0]/20120102/where[time][1]/20120103/url ⽅法 action 增加默认值spider 类在 HTTPS 请求时⽀持 SSL 证书模板引擎新变量{CDN},⽤于绑定 CDN 路径修复:core::json_encode 不⽀持部分中⽂字符集的 BUGspider 在 5.6 版本中⽆法⽀持 @ 上传⽂件的问题在某些环境下的 warning 提⽰优化:优化模板引擎,去除兼容变量,部分⽆⽤注释性能评测既然⼤家都对性能这么有疑问,那么我拿 Hello World 来做⼀个简单的评测:如何评测性能?XDEBUG 后能产⽣⼀个 profile通过 wincachegrind 能直观看到框架每⼀⾏的性能损耗。测试环境Windows 虚拟机,i7 2核 + 1G内存。PHP 最基础环境。测试框架mzphp 最新版本(2015.11.30)TP 最新版本(2015.11.30)CI 最新版本(3.02)测试结果为了最佳性能,会让三个框架连续运⾏ 20 次,然后输出 XDEBUG 的 profile:最终的 profile ⽂件⼤⼩对⽐:结果对⽐mzphp 的 profile line-by-line结果:TP 的 profile line-by-line结果:CI 的 profile line-by-line结果:mzphp 的 profile overall结果:TP 的 profile overall结果:CI 的 profile overall结果:mzphp 跑热后,项⽬加载以及页⾯运⾏的时间为 1.6msCI 跑热后,项⽬加载以及页⾯运⾏的时间为 2.7ms⽽ TP 跑热后,页⾯运⾏时间为:5.5ms具体的 profile 数据,⼤家可以下载⾃⾏查看(window 下使⽤ wincachegrind 查看):序很久以来,楼主开发站点⽆数,⼀直希望能有⼀个枚,⽇开数站的 PHP 框架出现。mzphp 介绍PHP 开发框架 mzphp,拥有特点:性能,⾼性能极致加载、⾼效率编译和读取!清晰,⼤量注释及实例,⼏分钟就上马进门!⼩巧,整个框架 100k,⼏乎没有冗余代码!奔放,⽀持 http 和 cli 双运⾏,php {$control} {$action} 就能体验 PHP 在命令⾏下的奔放。(可⽤于后台常驻内存、爬⾍等)易⽤,优化过的 discuz 模板引擎,使模板调⽤更加简约(兼容 php 标签,⽀持static、block、{method()}等标签)安全,简单⼜安全的取参数过程,有效防⽌ xss,封装的 SQL 防注⼊过程,确保系统安全。扩展,丰富的库和插件:MySQL、PDO 引擎、scss 语法⽀持、css 压缩、css sprite ⽣成、js 合并、js 压缩等。(前后端开发相亲相爱不再分离)调试,详细的 DEBUG、运⾏时间和SQL查询信息,只需在 URL 中加上固定参数,简单好⽤。mzphp 做为⼀直追求⾼效、简单、快速开发的 PHP 框架,希望⼤家多多⽀持。mzphp 运⾏的环境操作系统:windows、linuxPHP 环境:PHP 5.3+PHP 扩展:php-gd、php-mbstring、php-curlPHP 扩展(数据库):php-mysql 或 php-pdoPHP 扩展(缓存):php-memcached 或 php-redis如果需要 php 在 cli (命令⾏) 下运⾏,⽽您的操作系统是 windows。请在系统 -> 环境变量 -> PATH -> 添加你的 所在路径拉取 mzphp 代码git clone git@:mz/完后,可更新⼦项⽬例⼦:git submodule update⽣成第⼀个项⽬假我们需要建⽴的项⽬名称为:hello_world请在项⽬⽬录建⽴⼀个hello_world(与 mzphp ⽬录同级)复制 tools ⽬录下的 create_ 到 hello_world ⽬录。提供两种⽅法⽣成项⽬结构:第⼀种:打开浏览器访问 create_ ,⽣成第⼆种:在命令⾏下cd hello_worldphp create_访问⽣成的 ,可看到 mzphp Framework 字样,即访问成功.mzphp ⽬录⽂件cache 缓存⽀持(file、memcache、redis)core 核⼼⽅法db 数据库⽀持(mysql、pdo_mysql、pdo_sqlite)debug 调试⽀持helper ⼀些扩展库以及⽅法(log、misc、spider)plugin 插件⽬录 ⼊⼝⽂件项⽬⽬录⽂件conf 项⽬配置⽬录control 项⽬控制器⽬录core 默认 include 的库、基类、⽅法等data 项⽬数据保存⽬录static 所有静态⽂件(css/js/图⽚)存储⽬录view 项⽬模板⽬录 ⼊⼝⽂件配置项⽬参数打开项⽬ conf/conf.{env}.php 可按照注释编辑对应的参数。{env}代表运⾏环境,由 $_SERVER['ENV'] 来控制 (默认为 debug)。在 nginx 中,您可以通过添加:fastcgi_param ENV 'online';来切换线上、线下环境。附上⼀些⼩的参数修改 中,在定义 DEBUG 处,来设置启动 debug 的 url 参数。 中,在定义 FRAMEWORK_PATH 处,可修改 mzphp 框架所处的路径调试⽅法 中,你可以直接设置 define('DEBUG', 1) 永久打开 debug也可以修改 hello_world_debug 这个字符串来告之项⽬当 url 中包含该字符时,⾃动开启 debug。debug 开启时,右下⾓将出现⼀个浮动的运⾏时间展⽰,点击开来可以看到具体页⾯运⾏的信息。注意mzphp 框架为了减少磁盘 I/O,提⾼加载性能,会在项⽬第⼀次运⾏时,⽣成的缓存⽂件在 data/ 中。缓存的代码为: mzphp 框架下所有⽂件和项⽬ core ⽬录中所有 *. ⽂件。当开启 debug 后,所有⽂件均为动态加载,会跳过加载缓存 。当开启 debug 后,模板编译后的缓存⽂件不会加载。当开启 debug 后,css 合并、js 合并等静态⽂件会重新⽣成。mzphp 控制器在项⽬ control ⽬录中建⽴⼀个 user_同时,在该⽂件中定义⼀个 user_control 继承 base_control!defined('FRAMEWORK_PATH') && exit('Accesss Deined');class user_control extends base_control {public function on_index(){// define user$user = 'djunny';// assign variablesVI::assign('user', $user);// default template path is view/user_$this->show();}}$this->show 调⽤显⽰模板,可以⾃动识别为 view/user_,即 {$control}_{$action}.htm假如,view/user_ 如下:hello {$user}使⽤ ?c=user-index 可访问到 user_control 的 on_index ⽅法,显⽰结果:hello djunny同时,使⽤命令⾏下:php user index也能在命令⾏下看到同样的结果⼩建议:在命令⾏下,你可以 core 中建⽴⼀个 cmd_control,在析构⽅法中做⼀些限制,例如判断是否 cmd 下运⾏(可以⽤ core::is_cmd() ⽅法), user_control 继承 cmd_control,能有效的防⽌ control 被 http 请求到。在命令⾏下,不建议使⽤ echo 来输出 log,可以使⽤帮助类 log::info($output) 来输⼊出 log。$output 可以为字符串、数字、数组、MAP。VI::assign 是传引⽤绑定变量、VI::assign_value 是传值绑定变量如果调⽤ $this->show('user/index'),代表渲染 view/user/ 模板⽂件。mzphp DAO 数据层第⼀步:配置 conf ⽂件中的 db。第⼆步:创建 user 表:CREATE TABLE `user` (`id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '',PRIMARY KEY (`uid`)) DEFAULT CHARSET=utf8 COMMENT='user'第三步,model 层有⼆种调⽤⽅法。第⼀种,不定义 model,直接使⽤!defined('FRAMEWORK_PATH') && exit('Accesss Deined');class user_control extends base_control {public function on_index(){// SELECT * FROM user WHERE id =1$user = DB::T('user')->get(1);// ...}}此⽅法⽤于简单的 DAO 层调⽤。第⼆种,在项⽬ model ⽬录中,新建⼀个 定义 user 继承⾃ base_model,!defined('FRAMEWORK_PATH') && exit('Accesss Deined');class user extends base_model {function __construct() {parent::__construct('user', 'id');}}>在控制器中使⽤!defined('FRAMEWORK_PATH') && exit('Accesss Deined');class user_control extends base_control {public function on_index(){// SELECT * FROM user WHERE id =1$user = $this->user->get(1);// ...}}mzphp 中,控制器会⾃动加载并初始化对应的 model 层。另外:mzphp 也⽀持原⽣查询 SQL,使⽤以下⽅法:// add table prefix$table = DB::table('user');// build SQL$sql = sprintf("SELECT * FROM %s WHERE id=%d", $table, 1);// get query and return first row$first_row = DB::query($sql, 1);// get query$query = DB::query($sql);while($val = DB::fetch($query)){log::info($val);}// select method// get first row from user where id =1$user = DB::select('user', array('id'=>1), ' id ASC', 0);// get all user array$user_list = DB::select('user');// get user count$user_count = DB::select('user', 0, 0, -2);mzphp 模板引擎 - 基础语法默认注释语法{code} 嵌⼊属性语法{$variable} 输出变量{CONSTANT} 输出常量{$array['index']} 输出数组下标{function(param1, param2, )} 调⽤原⽣⽅法模板中动态渲染内容,基本上由以上语法组成。语法1 多⽤于 html 块级输出,例:语法2 多⽤于元素属性输出,例:语法6 调⽤原⽣⽅法,输出值必须为⽅法结果 returnmzphp 模板引擎 - ⼦模板说明:加载⼀个⼦模板。(⼦模板最多⽀持三层嵌套)语法:mzphp 模板引擎 - 逻辑判断说明:if else 逻辑判断语法:a = b AND b = $bb = $b OR a = $aa = 1a != 1mzphp 模板引擎 - 循环说明:循环输出列表,可嵌套输出语法:categories[$index]= {$cate['name']}mzphp 模板引擎 - eval 标签说明:执⾏ php 代码。语法:mzphp 模板引擎 - ⽅法调⽤标签说明:调⽤的⽅法并输出返回的内容。(⽅法必须以返回值)语法:{date('Y-m-d')}{substr('123', 1)}{print_r(array(1), 1)}{spider::html2txt('')}mzphp 模板引擎 - 静态⽂件语法:说明:source_file ⽂件后缀为 scss 或者 js 时,会调⽤对应的编译类对⽂件进⾏编译和⽣成,⽣成的⽂件路径:static/{$target_file}is_compress 参数可以为 0 或 1(默认 1),为 1 时,source_file 压缩,反之⽽不压缩。在 debug 开启后,每次访问页⾯,都会⽣成⼀遍静态⽂件。在代码 push 的时候,需要产⽣的所有静态⽂件提交(线上不会再编译静态资源)规范建议编译后的缓存⽂件名都使⽤ _ 开头命名,这样后期⽅便清理。编译后的 css ⽂件只能在原 css ⽬录(否则相对路径的图⽚可能加载失败)编译后的 js ⽂件最好在原 js ⽬录(除⾮你的 js ⽂件没有对路径有依赖)静态⽂件寻找先后顺序static/view/关于 css sprite当 source_file 以 * 结尾时, 识别为 css sprite 模式,程序将会对 source_file ⽬录中的所有⽂件进⾏合并,读取所有图⽚的 size ,⽣成对应的 scss ⽂件和合并的 png ⽂件:target_ (命名⽅式:.filename-png,⽂件名中_和.替换成-)target_(不需要重复的图⽚合并⽂件)target_ (需要 x 轴重复的图⽚合并⽂件)target_(需要 y 轴重复的图⽚合并⽂件)实例在以上例⼦中,系统做了以下处理:1.先合并 scss/png/ 中所有图⽚为: scss/,同时⽣成坐标 scss ⽂件:scss// 中调⽤ @import 'sprite'; 然后⽤ scss 语法来继承对应的 icon 或 图⽚即可,例(图⽚路径中.会变成-,更具体可以先成⽣⼀次后,打开⽣成后的看看):.find{@extend .loading-png;}3.开启合并⽂件 js/_ ,并将 js/ 写⼊。4.读取 js/,写⼊ js/_ 尾部。5.读取 js/,并压缩,写⼊ js/_6. 替换成 空7. 替换成 < link rel="stylesheet" href="scss/_">8. 替换成 < script src="js/_"> script>9. 均替换成空mzphp 地址重写地址重写规则:.htaccessOptionsRewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d#control + actionRewriteRule ^(w+)(?:[/-_|.,])(w+)(?:[/-_|.,])(.*)$ ?c=$1-$2&rewrite=$3 [L]#controlRewriteRule ^(w+)(?:[/-_|.,])(.+)$ ?c=$1&rewrite=$2 [L]apache [ISAPI_Rewrite]RepeatLimit 32RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d#control + actionRewriteRule ^(w+)(?:[/-_|.,])(w+)(?:[/-_|.,])(.*)$ ?c=$1-$2&rewrite=$3 [L]#controlRewriteRule ^(w+)(?:[/-_|.,])(.+)$ ?c=$1&rewrite=$2 [L]#control + actionrewrite ^(w+)(?:[/-_|.,])(w+)(?:[/-_|.,])(.*)$ ?c=$1-$2&rewrite=$3 last;#controlrewrite ^(w+)(?:[/-_|.,])(.+)$ ?c=$1&rewrite=$2 last;iis 7mzphp ⾃定义 URL1.⾮地址重写链接:?c=control-action&var=...2.系统地址重写(该地址中的 / 分隔符和 [.html] 均可在conf⽂件中配置):/control/action/param1/param1value/[.html]conf/conf.[env].php 配置⽂件://url rewrite params'rewrite_info' => array('comma' => '/', // options: / - _ | . ,'ext' => '.html',// for example : .htm),使⽤系统地址重写时,您可以使⽤url⽅法,来⽣成url:function url($control, $action, $params = array()) ;例:echo url('index', 'index', array('id'=>1));echo url('index-index', array('id'=>1));echo url('index-index', 'id=1&time=2015');3.⾃定义地址重写:?c=control-action&rewrite=例如,我们需要使⽤:/help/123/ 来映射 ?c=article-help&id=123可以在 urlrewrite 重写⽂件中配置(以 .htaccess 语法为例):RewriteRule ^(help)/(d+)/?$ ?c=article-$1&rewrite=id/$2 [L]注:本例中 rewrite 参数传⼊的分割符(/),视 rewrite_info 中的 comma ⽽定。钩⼦⽅法 HOOK通过钩⼦⽅法,能在系统任何代码处调⽤在 hook 中注册的⽅法。可⽤于插件或者扩展功能实现。运⾏ hookfunction hook($name) {}输出 hook输⼊ hook ⼀般在模板中直接调⽤⽐较多function out_hook($returns, $implode = '') {}钩⼦使⽤例⼦在项⽬根⽬录的 中 ,定义存放钩⼦类的⽬录(例⼦中定义为项⽬根⽬录的 hook⽬录)define('HOOK_PATH', ROOT_PATH.'hook/');在对应⽬录下,创建⼀个 hook ⽬录 。hook ⽬录下建⽴⼀个 hook_,内容如下:class hook_xxx {static function func($abc = ''){return '';}}TIP:hook_ 和 PHP ⽂件 class hook_xxx 必须⼀致。此时,清理 tmp ⽬录(如果没有开启 DEBUG 模式则需要每次修改 hook ⽂件后操作)后,在任意代码地⽅调⽤:hook('func');也⽀持参数传⼊:hook('func', 'abc');即调⽤对应 hook 到所有类包含的 func 静态⽅法。TIP:并不是每个⽅法都会被 hook,记住,hook_xxx 类中带 _ (下划线)开头的静态⽅法是⽆法调⽤的。TIP:同理,您可以将不想公开的⽅法⽤ _ (下划线)开头,防⽌ hook cache 到过多的⽅法,这样既可以优化 hook 扫描时的性能,⼜可以避免外部访问到。hook ⽅法 返回结果类型为:Array因为在 hook ⽬录中,存在的同样静态⽅法的类会有多个,调⽤时每个⽅法都会去调⽤⼀遍,所以会以数组形式返回。循环输出或者在模板中可⽤{out_hook(hook('func'), '')}即可。⼩技能hook 可以按⽂件名顺序来排序,加排序的⽅法:___数字越⼤,越优先加载,TIP:插件排序,⾮特殊情况建议不要使⽤~TIP: 如果调⽤ hook 途中,需要中⽌加载其它类的调⽤。请在⽅法中返回:return array(// 通知 hook 系统不需要再运⾏其它 hook 类⾥的⽅法了'HOOK' => HOOK_STOP,// 返回的结果'return' => 'xxxxx',);EnPHP 加密⼯具的说明EnPHP ⼯具的路径:tools/enphp_HP 是⼀款可以加密混淆 PHP 5-7 的⼯具,现内置于 mzphp Framework 中。EnPHP 经多⽅测试已经⽀持加密混淆 99% 以上的 PHP 代码,欢迎测试反馈。使⽤⽅法:将 enphp_ 拷⾄您的项⽬中修改 enphp 中适合你的 option 参数(选)修改 enphp_control 中 on_index ⽅法⾥需要加密的⽂件(选)在浏览器中访问本⽂件,或者使⽤ php enphp_ 命令⾏模式执⾏加密P.S. 重要的事情说三遍:备份!备份!备份!请在加密前备份好您的源码⽂件,通过 EnPHP 加密的⽂件均⽆法恢复!否则请不要使⽤。P.S.S. 您也可以将 enphp 类与 spider 类拷出去单独使⽤。enphp 在线加密地址:更多实例敬请期待。