3、内存使用信息<br />
通过侦测脚本的内存使用情况,有利于代码的优化。PHP提供了一个垃圾收集器和一个非常复杂的内存管理器。脚本执行时所使用的内存量,有升有跌。为了得到当前的内存使用情况,我们可以使用memory_get_usage()函数。如果需要获得任意时间点的最高内存使用量,则可以使用memory_limit()函数。<br />
<br />
以下为引用的内容: <br />
echo“Initial:“.memory_get_usage().”bytes\n”; <br />
/*prints <br />
Initial:361400bytes <br />
*/ <br />
<br />
//let’suseup some memory <br />
for($i=0;$i<100000;$i++){ <br />
$array[]=md5($i); <br />
} <br />
<br />
//let'sremovehalfofthearray <br />
for($i=0;$i<100000;$i++){ <br />
unset($array[$i]); <br />
} <br />
<br />
echo"Final:".memory_get_usage()."bytes\n"; <br />
/*prints <br />
Final:885912bytes <br />
*/ <br />
<br />
echo"Peak:".memory_get_peak_usage()."bytes\n"; <br />
/*prints <br />
Peak:13687072bytes <br />
*/ <br />
<br />
4、CPU使用信息<br />
为此,我们要利用getrusage()函数。请记住这个函数不适用于Windows平台。<br />
print_r(getrusage()); <br />
/*prints <br />
Array <br />
( <br />
[ru_oublock]=>0 <br />
[ru_inblock]=>0 <br />
[ru_msgsnd]=>2 <br />
[ru_msgrcv]=>3 <br />
[ru_maxrss]=>12692 <br />
[ru_ixrss]=>764 <br />
[ru_idrss]=>3864 <br />
[ru_minflt]=>94 <br />
[ru_majflt]=>0 <br />
[ru_nsignals]=>1 <br />
[ru_nvcsw]=>67 <br />
[ru_nivcsw]=>4 <br />
[ru_nswap]=>0 <br />
[ru_utime.tv_usec]=>0 <br />
[ru_utime.tv_sec]=>0 <br />
[ru_stime.tv_usec]=>6269 <br />
[ru_stime.tv_sec]=>0 <br />
) <br />
这可能看起来有点神秘,除非你已经有系统管理员权限。以下是每个值的具体说明(你不需要记住这些)<br />
ru_oublock:blockoutputoperations <br />
ru_inblock:blockinputoperations <br />
ru_msgsnd:messagessent <br />
ru_msgrcv:messagesreceived <br />
ru_maxrss:maximumresidentsetsize <br />
ru_ixrss:integralsharedmemorysize <br />
ru_idrss:integralunshareddatasize <br />
ru_minflt:pagereclaims <br />
ru_majflt:pagefaults <br />
ru_nsignals:signalsreceived <br />
ru_nvcsw:voluntarycontextswitches <br />
ru_nivcsw:involuntarycontextswitches <br />
ru_nswap:swaps <br />
ru_utime.tv_usec:usertimeused(microseconds) <br />
ru_utime.tv_sec:usertimeused(seconds) <br />
ru_stime.tv_usec:systemtimeused(microseconds) <br />
ru_stime.tv_sec:systemtimeused(seconds) <br />
要知道脚本消耗多少CPU功率,我们需要看看‘usertime’和’systemtime’两个参数的值。秒和微秒部分默认是单独提供的。你可以除以100万微秒,并加上秒的参数值,得到一个十进制的总秒数。让我们来看一个例子:<br />
//sleepfor3seconds(non-busy) <br />
sleep(3); <br />
$data=getrusage(); <br />
echo“Usertime:“. <br />
($data['ru_utime.tv_sec']+ <br />
$data['ru_utime.tv_usec']/1000000); <br />
echo“Systemtime:“. <br />
($data['ru_stime.tv_sec']+ <br />
$data['ru_stime.tv_usec']/1000000); <br />
/*prints <br />
Usertime:0.011552 <br />
Systemtime:0 <br />
*/ <br />
尽管脚本运行用了大约3秒钟,CPU使用率却非常非常低。因为在睡眠运行的过程中,该脚本实际上不消耗CPU资源。还有许多其他的任务,可能需要一段时间,但不占用类似等待磁盘操作等CPU时间。因此正如你所看到的,CPU使用率和运行时间的实际长度并不总是相同的。下面是一个例子:<br />
//loop10milliontimes(busy) <br />
for($i=0;$i<10000000;$i++){ <br />
<br />
} <br />
<br />
$data=getrusage(); <br />
echo"Usertime:". <br />
($data['ru_utime.tv_sec']+ <br />
$data['ru_utime.tv_usec']/1000000); <br />
echo"Systemtime:". <br />
($data['ru_stime.tv_sec']+ <br />
$data['ru_stime.tv_usec']/1000000); <br />
<br />
/*prints <br />
Usertime:1.424592 <br />
Systemtime:0.004204 <br />
*/ <br />
这花了大约1.4秒的CPU时间,但几乎都是用户时间,因为没有系统调用。系统时间是指花费在执行程序的系统调用时的CPU开销。下面是一个例子:<br />
$start=microtime(true); <br />
//keepcallingmicrotimeforabout3seconds <br />
while(microtime(true)-$start<3){ <br />
} <br />
<br />
$data=getrusage(); <br />
echo"Usertime:". <br />
($data['ru_utime.tv_sec']+ <br />
$data['ru_utime.tv_usec']/1000000); <br />
echo"Systemtime:". <br />
($data['ru_stime.tv_sec']+ <br />
$data['ru_stime.tv_usec']/1000000); <br />
/*prints <br />
Usertime:1.088171 <br />
Systemtime:1.675315 <br />
*/ <br />
现在我们有相当多的系统时间占用。这是因为脚本多次调用microtime()函数,该函数需要向操作系统发出请求,以获取所需时间。你也可能会注意到运行时间加起来不到3秒。这是因为有可能在服务器上同时存在其他进程,并且脚本没有100%使用CPU的整个3秒持续时间。