5ucms论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 7131|回复: 0
打印 上一主题 下一主题

[开发教程] 微擎系统安装时的环境监测功能剖析教程讲解

[复制链接]

670

主题

785

帖子

8343

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
8343
跳转到指定楼层
楼主
发表于 2017-5-30 07:45:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当从微擎系统安装第一步点击“继续”后,就进入到了第二步“环境监测”如下图所示:

环境监测

  由于“环境监测”这一步的网页太长,上图中只是截取一部分图片。

  本教程将详细分析这一步的网页是如何实现的。

  由于“环境监测”这一步的网页太长,上图中只是截取一部分图片。

  本教程将详细分析这一步的网页是如何实现的。

源码分析

  1)表单与“继续”的关系

  在从第一步“阅读许可协议”到这一步,是点击第一步里面下面的“继续”,然后,走到这一步“环境监测”的,点击第一步里面的“继续”其实是提交了在第一步里面的一个表单,表单如下所示:

  1. <form class="form-inline" role="form" method="post">

  2.   中间略...
  3. </form>
复制代码

  在这一个表单里面使用的提交方法method是post,这个方法是可以通过$_SERVER['REQUEST_METHOD']来获取到的,因为,我们提交了一次表单相当于对当前页面install.php作了一次http请求,所以,使用这个$_SERVER['REQUEST_METHOD']就可以获取到提交表单时的方法。

  在文件install.php里面最上面有这一行代码:
  1. $ispost = strtolower($_SERVER['REQUEST_METHOD']) == 'post';
复制代码


  请注意:这行代码后面是一个比较运算(刚开始时我也把他看成赋值了,所以,在读后面的代码时百思不得其解后面的代码,后来回过头来再来看代码发现原来不是赋值,而是两个等号==)。

  当提交上面的表单,也就是在第一步点击“继续”后,strtolower($_SERVER['REQUEST_METHOD'])值就是post(当在安装第一步的时候其值为GET),所以,$ispost的值是true。

2)cookie保存action的值:

  当在安装的第一步时,点“继续”后,此时的$action值仍然为license,所以,下面的代码在进入到安装第二步环境监测时仍然要执行。

  1. if($action == 'license') {

  2.     if($ispost) {

  3.         setcookie('action', 'env');
  4.         header('location: ?refresh');
  5.         exit;
  6.     }
  7.     tpl_install_license();
  8. }
复制代码



  当进入到这段代码里面后,条件if($ispost)成立,所以,进入到这个条件里面执行里面的代码。

  设置cookie的变量名action 的值为env,并且,定位到当前文件,即类似bbs.5ucms.com/install.php?refresh,并且,在文件后面跟一个参数refresh。这样就相当于告诉服务器正在进入第二步环境监测是通过GET方法来提交请求的。

  当执行到代码header('location: ?refresh')时,相当于重新载入文件install.php,然后,重新执行install.php文件代码。

  此时,通过 $_COOKIE['action']获取到的值,即$action的值为evn了,而不是license了。

  而此时,经过这行代码处理:
  1. $ispost = strtolower($_SERVER['REQUEST_METHOD']) == 'post';
复制代码


  得到的$ispost的值为false。

3)此时,条件if($action == 'license')已经不成立了,实际上程序仍然还在这个条件里面执行代码,还没有跑出来。

4)接着执行if($action == 'env')条件里面的代码:

  因为,$ispost值为false,所以,在这个条件里面的代码:

  1.     if($ispost) {
  2.         setcookie('action', $_POST['do'] == 'continue' ? 'db' : 'license');
  3.         header('location: ?refresh');
  4.         exit;
  5.     }
复制代码



  这段代码是不执行的,因为,条件不成立,这个非常类似上面的条件if($action == 'license')里同的条件代码,第一次不成立不执行里面的条件if($ispost),当进入到第二步才执行这里面条件代码,同样的道理当进入到第二步环境监测时,这段代码里面的if($ispost)条件也不执行,也会在第三步参数配置里面执行。

   这里面的代码就是我们在安装进入到第二步后看到的界面的信息,例如,服务器信息、目录是否有可写权限和PHP环境要求都是由这个条件里面的代码处理的。

  由于处理的代码比较多,而且,大同小异,所以,我们只拿出一段代码作为例子来分析,其它的代码跟作为例子的这段代码相比只是获取的内容不同,结构完全一样没有多大区别,只要把这一个例子搞明白了,其它代码自然就明白了。

  以检测php环境是不是支持pdo代码作为例子:

  1.     $ret['php']['pdo']['ok'] = extension_loaded('pdo') && extension_loaded('pdo_mysql');
  2.     if($ret['php']['pdo']['ok']) {
  3.         $ret['php']['pdo']['value'] = '<span class="glyphicon glyphicon-ok text-success"></span>';
  4.         $ret['php']['pdo']['class'] = 'success';
  5.     } else {
  6.         $ret['php']['pdo']['failed'] = true;
  7.         $ret['php']['pdo']['value'] = '<span class="glyphicon glyphicon-remove text-warning"></span>';
  8.         $ret['php']['pdo']['class'] = 'warning';
  9.         $ret['php']['pdo']['remark'] = '您的PHP环境不支持PDO, 请开启此扩展';
  10.     }
复制代码



  从上面的这段代码可以知道,这里定义了一个三维数据$ret,然后,通过函数检测服务器环境是不是支持pdo扩展是,然后,把结果赋给$ret['php']['pdo']['ok']。

  如果$ret['php']['pdo']['ok']值为true,则设置键value的值为一个对号,这就是为什么我们看到pdo后面有一个绿色的对号的原因,当然,这个对号使用的是bootstrap提供的图文字体,并且,设置键class的值为success,作为支持pdo扩展的标识。

  否则,设置键failed的值为true,表示不支持pdo扩展,设置键value的值为一个绝色警告,键class标识为warning,并把键remark设置为一段提示如何支持pdo的说明。

  其它长长一段代码的结构跟这个判断是否支持pdo的代码差不多,弄明白这个处理的的代码例子就很容易理解其它的了。

5)设置$ret数组里面的键为continue的值为true:$ret['continue'] = true;

  设置这个键continue的默认值为true,表示环境检测假设都没有问题,这里只是给一个初始的值,跟一个变量赋给初始的值没有什么区别。

  下面开始真正判断上面的检测是不是都符合微擎要求:

  1.     foreach($ret['php'] as $opt) {

  2.         if($opt['failed']) {
  3.             $ret['continue'] = false;
  4.             break;
  5.         }
  6.     }
  7.     if($ret['write']['failed']) {
  8.         $ret['continue'] = false;
  9.     }
复制代码



  如果php环境要求只要是出现一项不符合的,则设置$ret['continue']的值为false;如果可写的目录只要有一项没有可写权限也要把这个$ret['continue']设置成false,这么做的原因是为了方便后面判断是不是要继续安装,若$ret['continue']值为true表示可以继续安装,否则,不可以继续安装因为不符号微擎运行环境的基本要求。

6)接着上面的代码执行函数tpl_install_env($ret):

  这个函数的作用就是把输出“环境监测”这一步的网页,当然,这个函数非常类似第一步“阅读许可协议”,也会两部分处理。

  在处理要输出的内容前,先判断一下环境检测里面有没有不支持微擎运行环境的项目,即判断条件$ret['continue']是不是为空,若为空则表示有些地方不符合运行微擎运行环境,也就是服务器不支持运行微擎,否则,支持微擎运行环境,加个“继续”按扭,代码如下:

  1.     if(empty($ret['continue'])) {
  2.         $continue = '<li class="previous disabled"><a href="javascript:;">请先解决环境问题后继续</a></li>';
  3.     } else {
  4.         $continue = '<li class="previous"><a href="javascript:;" onclick="$(\'#do\').val(\'continue\');$(\'form\')[0].submit();">继续 <span class="glyphicon glyphicon-chevron-

  5. right"></span></a></li>';
  6.     }
复制代码



  这段代码下面就是我们看到的“环境监测”显示的所有内容,这里为一个字符串输出。

  我们仍然以pdo输出的字符串来分析,代码如下:

  1. <tr class="{$ret['php']['pdo']['class']}">
  2.     <td>PDO</td>
  3.     <td>支持</td>
  4.     <td>{$ret['php']['pdo']['value']}</td>
  5.     <td>{$ret['php']['pdo']['remark']}</td>
  6. </tr>
复制代码



  这里面的内容正是上面的代码处理好的,这里直接使用数组来调用即可,就这么简单。

  最后一段代码:

  1.         <form class="form-inline" role="form" method="post">
  2.             <input type="hidden" name="do" id="do" />
  3.             <ul class="pager">
  4.                 <li class="previous"><a href="javascript:;" onclick="$('#do').val('back');$('form')[0].submit();"><span class="glyphicon glyphicon-chevron-left"></span> 返回</a></li>
  5.                 {$continue}
  6.             </ul>
  7.         </form>
复制代码



  这个表单就是在安装第二步时提交的表单,这个会在第三步时要使用到里面的隐藏域。

  7)最后引入整个除环境监测的代码外的所有代码函数:tpl_frame();

  处理的方式跟安装第一步完全一样,连代码都一样,唯一不同是{$progress}值变成了50,{$content}的值变成了安装监测步骤。

  程序执行到这里才真正从条件if($action == 'license')里面的if($ispost)条件跳出来,也就是走到这里才真正执行exit代码,这样第二步环境监测就显示在我们面前了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|5ucms.com

GMT+8, 2025-8-13 21:17 , Processed in 0.062500 second(s), 34 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表