php调试性能[xdebug / xhprof ]

xdebug 官方地址: xdebug >>>>

在WAMP上的配置:

看看张宴的BLOG>>>>讲如何使用

但实际上用下来不是太好。有的函数执行时间没有? 是不是要看看xhprof了?

[xhprof] 网上都是linux,这里要显示提windows下的,尽管生产环境会大不相同,但还是有参考价值的 环境说明: 1.下载:wamp 2.2d (32位),64位的好像xhprof没有人去编译。。。 Apache 2.2.21 Php 5.3.10 Mysql 5.5.20 2。下载 xhprof扩展: 下载在这里:>>>> 现在下载的是 XHProf 0.10.3 for PHP 5.3 vc9 这个版本 ,放在c:\wamp\ …. php\ext目录下,刷新wamp就可以加载xhprof了,在php就可以看到他的扩展项了

xhprof

xhprof

该 图来原:>>>>,thx 哈尼洛可

3。下载日志查看工具 Graphviz ,下载去他的官网>>>>> 安装到c:\根目录好了

3.现在要修改一下日志输出目录了 php.ini最后加好 [quote] [xhprof] xhprof.output_dir=”c:/wamp/xhprof_log” [/quote]

4.调试和查看 在这里下载xhprof 查看工具文件: 解压放在 c:\wamp\www\xhprof目录下

配置xhprof目录下的config.php [quote] define(‘ERROR_FILE’, ‘c:/wamp/logs/xhprof_dot_errfile.log’); define(‘TMP_DIRECTORY’, ‘c:/wamp/tmp/xhprof/tmp/’); define(‘DOT_BINARY’, ‘c:/Grafika/Graphviz/bin/dot.exe’); [/quote] 执行 http://localhost/xhprof/examples/sample.php

看看c:/wamp/xhprof_log 目录下有没有日志文件 ? 按照sample提示的查看报表: http://localhost/xhprof/xhprof_html/index.php?run=生成日志 的编号&source=xhprof_foo

KO,就可以看 到日志,性能好坏了


出错参考: PHP Warning: PHP Startup: Unable to load dynamic library ‘c:/wamp/bin/php/php5.3.8/ext/php_xhprof.dll’ – %1 is not a valid Win32 application.\r\n in Unknown on line 0
Warning: PHP Startup: Unable to load dynamic library ‘c:/wamp/bin/php/php5.3.8/ext/php_xhprof.dll’ – %1 is not a valid Win32 application. 【64位的wamp用了32位扩展】 in Unknown on line 0

这种可能是就是xhprof是不是

php引用,对象对比例子

<?php
function bool2str($bool)
{
    if ($bool === false) {
        return 'FALSE';
    } else {
        return 'TRUE';
    }
}
 
function compareObjects(&$o1, &$o2)
{
    echo 'o1 == o2 : ' . bool2str($o1 == $o2) . "\n";
    echo 'o1 != o2 : ' . bool2str($o1 != $o2) . "\n";
    echo 'o1 === o2 : ' . bool2str($o1 === $o2) . "\n";
    echo 'o1 !== o2 : ' . bool2str($o1 !== $o2) . "\n";
}
 
class Flag
{
    public $flag;
 
    function Flag($flag = true) {
        $this->flag = $flag;
    }
}
 
class OtherFlag
{
    public $flag;
 
    function OtherFlag($flag = true) {
        $this->flag = $flag;
    }
}
 
$o = new Flag();
$p = new Flag();
$q = $o;
$s = &$o;
$r = new OtherFlag();
 
echo "Two instances of the same class\n";
compareObjects($o, $p);
 
echo "\nTwo references to the same instance\n";
compareObjects($o, $q);
 
echo "\nTwo references to the same instance\n";
compareObjects($s, $q);
 
echo "\nInstances of two different classes\n";
compareObjects($o, $r);
?>

php中引用与对象备忘

<?php
$instance = new StdClass;//自定义一个类
$assigned   =  $instance; //在php5中,这种写法作用和下面一样,而不用传&,但还是有区别滴。。。
$reference  =& $instance; //作用是和上面相同,但本质还是不同的,$reference是个引用,他会跟着$instance共存亡
 
$instance->var = '$assigned will have this value';
var_dump($instance); //
var_dump($reference); //
var_dump($assigned); //以上三者都一样!不管赋值还是其他改变
 
$instance = null; // $instance and $reference become null
 
var_dump($instance); //他也不在了
var_dump($reference); //他已经不在了
var_dump($assigned); //他还在
?>

在PHP5手册中: 类与对象一章里: 当把一个对象已经创建的实例赋给一个新变量时,新变量会访问同一个实例,就和用该对象赋值一样。此行为和给函数传递入实例时一样。 但是把该对象的引用,赋值给一个变量,确实是用的引用


中文手册: 对象和引用 在php5 的对象编程经常提到的一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。下面通过一些例子来说明。

php的引用是别名,就是两个不同的变量名字指向相同的内容。 在php5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。

当对象作为参数传递,作为结果返回, 或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。

自 PHP 5 起,new 自动返回引用,因此在此使用 =& 已经过时了并且会产生 E_STRICT 级别的消息。 这句话很别扭


<?php
$a = 1;
$b =& $a;
unset($a); //如果把 $a=null ,下面的结果就不一样了
var_dump($a);  //a 已经不在了
var_dump($b); //b还在
?>

函数的引用返回:

function &test()
{
static $b=0;//申明一个静态变量
$b=$b+1;
echo $b;
return $b;
}
 
$a=test();//这条语句会输出$b的值为1
$a=5;
$a=test();//这条语句会输出$b的值为2
 
$a=&test();//这条语句会输出$b的值为3
$a=5;
$a=test();//这条语句会输出$b的值为6

$this self

$this 在一个对象的方法中,$this 永远是调用它的对象的引用。

self: 有点静态调用的意思:

class clsParent {
    static public function say( $str ) {
        self::do_print($str);//如果这里用$this->do_print($str); 会报没有这个实例的
    }
 
    static public function do_print( $str ) {
        echo "parent says $str";
    }
}
 
class clsChild extends clsParent{
    static public function do_print( $str ) {
        echo "child says $str";
    }
}
 
clsChild::say('Hello');
?>

其他: //下面再来个小插曲 php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

通俗的讲 1:如果有下面的代码

$a=”ABC”; $b=$a;

其实此时$a与$b都是指向同一内存地址而并不是$a与$b占用不同的内存

2:如果在上面的代码基础上再加上如下代码

$a=”EFG”;

由于$a与$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储

静态调用:

<?php
class A
{
    function foo()
    {
        if (isset($this)) {
            echo '$this is defined (';
            echo get_class($this);
            echo ")\n";
        } else {
            echo "\$this is not defined.\n";
        }
    }
}
 
class B
{
    function bar()
    {
        A::foo();
    }
}
 
$a = new A();
$a->foo();
A::foo();//直接静态调用,而不用方法是不是静态方法 ,这样用有时是大有好处的
$b = new B();
$b->bar();
B::bar();
?>

类静态调用的好处:http://heshun.org/?p=178