eclipse 快速建立PHP调试环境

 更新时间:2016年11月25日 16:10  点击:1990

 

 eclipse 快速建立PHP调试环境

   在网上看了许多关于eclipse 建立PHP调试环境的文章,自己去尝试了一翻,但都没有成功,后来自己到Zend的官方去看,原来是版本的问题.现在提供完整的配置步骤.希望初学者能快速建立好环境,把精力集中到代码而不是配置上.如果您看完还没有配置成功,您还可以点击此处查看FLASH视频.

我的环境如下:Windows-xp+Wamp(Windos Apache Mysql PHP集成安装环境)或者xampp(类似wamp).

1.准备工作


  •   从网上下载wamp5_1.7,或者xampp-win32-1.6.5,参考地址: http://www.codepub.com/d/downpage.php?n=1&id=7656::1162764159    http://www.apachefriends.org/zh_cn/xampp-windows.html#1787    安装过程十分简单,wamp只需要点下一步下一步就可以,而xampp需要解压到盘符的根目录下,否则无法启动.

  • 到Zend的网站下载
    zenddebugger:http://downloads.zend.com/pdt/server-debugger/ZendDebugger-5.2.12-cygwin_nt-i386.zip
    eclipse:http://downloads-source.zend.com/pdt/all-in-one/pdt-1.0.2.R20080103_debugger-5.2.12.v20071210-all-in-one-win32.zip

    最好是以上版本,否则调试可能会出现错误.

2.Zend Debugger安装(编译),以xamp为例,wamp类似


  •  将ZendDebugger.dll复制xampp的php目录下,启动xampp,打开如下地址:http://localhost/xampp/phpinfo.php查看php.ini文件的地址,如下图:

    打开上图中的php.ini文件,

以下是我看Pixy中一些程序的记录,主要是为了之后能够比较快速的理解程序的思路,记录下来,要不然那么多东西光靠脑子怎么行。有的地方可能有所纰漏,我自己看着可能都觉得不太好。

ProgramConverter
- convert()
    首先利用PhpParser建立一棵parseTree,但是这棵tree只在这里使用而已。利用这棵tree、输入文件以及ProgramConverter对象本身建立TacConverter对象baseTac,然后调用baseTac.convert()。这个baseTac即是可以通过本对象返回的TacConverter属性。然后通过baseTac.getIncludeNodes()获得需要处理的被包含文件。
    进入while循环,前提是函数内局部变量goOn为true和没有“-w”参数。该while循环命名为(w1*),设置goOn=false。如果需要处理的包含文件链表不为空,进入第二个while循环(w2*)。通过for循环将所有的CfgNodeInclude结点单独提取出来,如果这个node是需要跳过的(skip),就取下一个node;如果不是直接通过“常量”包含文件的话,就继续取下一个,这个展示不处理;如果以上两条都不满足,调用include()方法,返回一个内部枚举类型IncStatus,重设将要处理链表,继续w2*。使用baseTac处理一下之后,如果不存在non-literal includes就跳出w1*。否则,开始处理non-literal includes。(253:this.baseTac.backpatch();)。使用baseTac中得到的所有方法,包括用户方法和Main方法计算(259 - 260)。建立AliasAnalysis对象,并以之作为参数建立LiteralAnalysis对象,调用analyze()开始分析。然后,获取包含结点设置为将要处理的包含文件链表,进入for循环,逐个检测,如果已经检测过,跳过,否则即为non-literal的包含文名,按条件分别处理。在通过this.include()方法的返回值决定for循环的去向。再通过this.baseTac.assignFunctions(),然后重新设置需要处理的包含链表,继续w1*。
    将之前得到的可能会有用的包含文件列表中实际没有用的都去掉。并将literalAnalysis置为null,以节省内存。如果需要使用AliasAnalysis,作出相应处理(361 - 364行),否则,利用baseTac调用replaceGlobals(),将所有函数的局部变量使用相应的全局变量替换,进行type分析,与前边的literal过程分析差不多。然后将functions转换为CfgNode,然后输出统计信息。释放资源,调用baseTac.addSuperGlobalElements()添加全局元素,将节点倒序排列。
- include()
    得到应该包含的文件,如果文件不存在,返回NOTFOUND。否则,在allFiles中添加该文件,并将包含与被包含添加到includeGraph中,如果添加成功,对被包含的文件建立parseTree,并建立TacConverter对象,但是这里的对象都只是用来检测里边的include,并将这些CfgNodeInclude添加进从convert()传过来的weComeAfterwards中,以待处理。这样将goOn=true,循环检测。

CfgEdge
    inEdges对于CfgNodeIf来说,是指判断条件,而outEdges是结果。对于其他的node有点说不清楚。


InterAnalysis
    从这个程序看,将被扫描文件分析之后,得到的主要是TacConverter,由他得到TacFunction,然后再得到CfgNode,一个CfgNode对应一个Context,二者共同组成InteWorkListElemnt。在InterAnalysisInfo中则是每一个Cfgode对应一个InterAnalysisNode,在这个node中,由先前与刚才CfgNode对应的Context对应一个LatticeElement,而Latticelement则分别存放相应的信息。如AliasLatticelement存放MustAliases和MayAliases,而DepLatticeElement则存放TacPlace、DepSet、Vatiable等。
    对于test.php来说,通过initTransferFunction()时,在ProgramConverter.convert()中产生了TransferFunctionId,而在checker.analyzeTaint()中则还得到了ConpositeTransferFunction。这时,每个InterAnalysisNode所包含的TransferFunction是确定了的实例,因而下边的transfer方法调用时会调用相应的实例的方法。对于本例,由于TransferFunctionId.transfer()返回的是传入的参数本身,故调用transfer之后得到的outValue与inValue是一样的。仅出现在当analyze()中node为后便三种的时候,第一种没有使用outValue,第二种直接使outValue = inValue。
- initGeneric()
    后边的interAnalysisInfo()怎么就有长度了,没搞清楚。通过initTransferFunction()好像能够将genericAnalysisInfo添加数据,试验中是23个。但是 interAnalysisInfo也是23个。因该是这样的,二者指向同一个内存地址,对genericAnalysisInfo添加内容,就使得interAnalysisInfo也有了同样的内容。
- analyze ()
    这个方法主要是针对不同的node采取不同的措施。主要分为了5类node
        - CfgNodeCall
        - CfgNodeExit
        - CfgNodeIf
        - CfgNodeCallRet
        - 其他
            通过inValue转换得到outValue,然后得到node的所有outgoing的边(outEdges),将每条边的终点节点即node的继承者successor得到,然后通过当前的context和刚得到的outValue、successor共同增殖(propagete),向analysisNode设置新的 PhiValue,并向workList中添加InterWorkListElement。这里我理解propagate是产生一个InterWorkListElement,因为在analyze中使用的是它。
    在analyze()刚开始的时候,workList中只有一个元素InterWorkListElement(this.mainHead, this.mainContext)。
    analyze()中通过analysisNode获得的LatticeElement由test.php第一次在ProgramConverter.convert()中时都是TypeLatticeElement,而在Checker中analyzeTaint()时则全是DepLatticeElement。通过调用dump方法可知,前几个的结果即placeToDep为空,而后便则打印出整个Map。

- propagate(Context context, LatticeElement value, CfgNode target)
    在analyze()中多数情况下调用都是(当前context,outValue,successor)
    通过target得到InterAnalysisInfo中对应的analysisNode,不为null的话,通过context得到target的oldPhiValue,如果oldPhiValue=null,则将其设为所有LatticElementd的初始值,实际上也是null。如果value==oldPhiValue,则说明值没有改变,可以返回了。否则,在lattice中使用value和oldPhiValue计算一个newPhiValue,如果这个newPhiValue与oldPhiValue不同,则将其设置为target的Phivalue,并在workList中添加一个InterWorkListElement以便analyze()中继续分析。




DepClient
    - collectSinks()
        对于test0225.php而言,对XSS检测得到的functions数目为2,但是sinks数目为5;对SQL检测functions数目为2,sinks数目为1。
        首先通过depAnalysis实例得到所有的TacFunction,然后对于每个TacFunction获得Cfg之后对CfgNode排序然后逐个检测。
        得到的TacFunction有两个分别为:_main和foo,里边包含的CfgNode分别是21个和3个。而对于XSS检测有5个sink,均为echo,这里不管是否会产生XSS,均作为sink返回。

    - findDangerousUninit(DepGraph relevant)
        首先找出relevant中的uninit nodes,结果显示在上一个方法中XSS的5个sink中,后两个返回结果都为空。对于不为空的uninitNode,则是找出其父节点Predecessor,如果父结点不为1个,则抛出异常,否则取出这一个父结点,研究两种情况:
            - DepGraphOpNode    直接认定为evil function返回。
            - DepGraphNormalNode    调用initiallyTainted()方法查看返回值,如果为ALWAYS或者IFRG,则认为是evil function,返回。

    - initiallyTainted(TacPlace place)
        这里place考虑三种情况:
            - Constant(常量) 这种情况下,直接就认为不可能是tainted,返回NEVER
            - Variable(变量) 又分两种情况
                - superglobals 在某些特定情况下认为是harmless,其余都是可能有害的。详见DepClient.java
                - non-superglobals 同上。但是某些跟命令行“-g”选项有关。
                - others 都认为是有害的。



TacConverter
    - start()
        通过传入的PhpTree的root建立起两个CfgNode,作为Cfg的root和exit,然后将tree中的各个node连接起来,将phptree转换成Cfg。

至于上文中提到的test0225.php,文件如下:


<?php
function foo ()
{

        
$var =  $_GET[''evil''];
        
return $var;

}

//$a =  $_GET[''evil''];
$b = foo ();

//$a=5;
//echo $a;

echo $b;
// $a is 6 here
echo $_GET[''a''];

echo $e;

$x = explode(''_'', $get);
mysql_query($x[0]);

if (true)    echo "ABCD";

if ($a == ''a'' && $c == ''d''echo "dfg";

?> 

<

Linux下源代码安装apache+mysql+php

/*******************************
 * I am pefocus,pefocus is me !*
 *******************************/

编译环境:RedHat Enterprise AS 5,开启SELlinux

所需要的软件:apache,php,phpmyadmin,mysql,GD及库相关        
libpng-1.2.24.tar.bz2  
zlib-1.2.3.tar.gz
freetype-2.3.5.tar.gz 
libxslt-1.1.22.tar.gz  
jpegsrc.v6b.tar.gz
gd-2.0.36RC1.tar.bz2  
libxml2-2.6.30.tar.gz  

下载地址:
http://www.apache.org
http://www.php.net
http://www.mysql.com
http://www.ijg.org/files/jpegsrc.v6b.tar.gz
http://www.zlib.net/zlib-1.2.3.tar.gz
http://prdownloads.sourceforge.net/libpng/libpng-1.2.8-config.tar.gz?download
http://easynews.dl.sourceforge.net/sourceforge/freetype/freetype-2.1.3.tar.bz2
http://telia.dl.sourceforge.net/sourceforge/freetype/freetype-2.1.3.tar.bz2

1.安装apache
tar -xvf httpd-2.2.0.tar.gz
cd httpd-2.2.0
./configure --prefix=/usr/local/apache2 --enable-module=so
make
make install

设置apache自启动:
cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd
然后vi /etc/init.d/httpd
在第3行加入
# chkconfig: 2345 70 30
# processname: httpd
注意:#号不能去掉!
最后chkconfig --add httpd

2.freetype
tar vjf freetype-2.1.3.tar.bz2
cd freetype-2.1.3
./configure
make
make install

3.jpeg
tar xvf jpegsrc.v6b.tar.gz
cd jpeg-6b/
./configure --enable-shared --enable-static
make
mkdir -v /usr/local/man
mkdir -v /usr/local/man/man1
make install

4.zlib
tar xvf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure
make
make install

PHP 5中用abstract关键字标明抽象方法,含有抽象方法的类是抽象类,也必须要用abstract标明。


<?php
abstract class AbstractClass {
   
abstract public function test();
}

class ImplementedClass extends AbstractClass {
   
public function test() {
       
echo "ImplementedClass::test() called. ";
   }
}

$o = new ImplementedClass;
$o->test();
?> 
PHP 5也支持接口的概念,并为之引入了interface和implements关键字。和Java一样,PHP 5使用接口也实现类似于“多重继承”的效果。语法如下:


<?php
interface displayable {
  
function display();
}
interface printable {
  
function doprint();
}

class foo implements displayable,printable {
  
function display() {
    
// code
  }   function doprint() {
    
// code
  }
}
?>
抽象类和接口的引入使PHP成了一个完全面向对象的语言。多说一句:这样的语法和Java实在是太像了。

class runtime
{
    var $StartTime = 0;
    var $StopTime = 0;
 
    function get_microtime()
    {
        list($usec, $sec) = explode('' '', microtime());
        return ((float)$usec + (float)$sec);
    }
 
    function start()
    {
        $this->StartTime = $this->get_microtime();
    }
 
    function stop()
    {
        $this->StopTime = $this->get_microtime();
    }
 
    function spent()
    {
        return round(($this->StopTime - $this->StartTime) * 1000, 1);
    }
 
}
 
 
//例子
$runtime= new runtime;
$runtime->start();
 
//你的代码开始
 
$a = 0;
for($i=0; $i<1000000; $i++)
{
    $a += $i;
}
 
//你的代码结束
 
$runtime->stop();
echo "页面执行时间: ".$runtime->spent()." 毫秒";
 
?>

<
[!--infotagslink--]

相关文章

  • Tomcat配置及如何在Eclipse中启动

    这篇文章主要介绍了Tomcat配置及如何在Eclipse中启动,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-04
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • 在ASP.NET 2.0中操作数据之七十二:调试存储过程

    在开发过程中,使用Visual Studio的断点调试功能可以很方便帮我们调试发现程序存在的错误,同样Visual Studio也支持对SQL Server里面的存储过程进行调试,下面就让我们看看具体的调试方法。...2021-09-22
  • 标准版Eclipse搭建PHP环境的详细步骤

    一、下载Eclipse的PHP插件  百度搜索phpeclipse,看到某条结果是带有SourceForge.net字样的,点进去,找到Download按钮,点击之后,等待5秒就会开始下载了。二、安装Eclipse的PHP插件  插件下载完成之后,解压,然后把site.xml...2015-11-24
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • Node调试工具JSHint的安装及配置教程

    现在我们介绍一种在Node下检查简单错误的JS代码验证工具JSHint。  JSHint的具体介绍参考http://www.jshint.com/about/,说直白点儿,JSHint就是一个检查JS代码规范与否的工具,它可以用来检查任何(包括server端和client端...2014-05-31
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • JavaScrip调试技巧之断点调试

    首先,在各个浏览器中,断点调试支持的最好的当然是Firefox,Firefox不仅可以使用Firebug调试页面js脚本,还可以用高级调试工具例如JavaScript Debugger (Venkman) 来调试Firefox扩展里的js。除此之外,Firefox还支持一些更为...2015-10-23
  • idea 无法debug调试的解决方案

    这篇文章主要介绍了idea 无法debug调试的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-09
  • PHP实现创建以太坊钱包转账等功能

    这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
  • C#客户端程序Visual Studio远程调试的方法详解

    这篇文章主要给大家介绍了关于C#客户端程序Visual Studio远程调试的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
  • php微信公众账号开发之五个坑(二)

    这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
  • ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单

    首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31
  • PHP如何通过date() 函数格式化显示时间

    这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
  • tomcat9 下载安装和配置+整合到eclipse的教程详解

    这篇文章主要介绍了tomcat9 下载安装和配置+整合到eclipse,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-28
  • PHP+jQuery+Ajax实现多图片上传效果

    今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
  • golang与php实现计算两个经纬度之间距离的方法

    这篇文章主要介绍了golang与php实现计算两个经纬度之间距离的方法,结合实例形式对比分析了Go语言与php进行经纬度计算的相关数学运算技巧,需要的朋友可以参考下...2016-07-29
  • c# 代码调试技巧和如何远程调试

    这篇文章主要介绍了c# 代码调试技巧和如何远程调试,帮助大家更好的理解和使用c#编程语言,感兴趣的朋友可以了解下...2020-12-08