开发环境: win10 + php5.4 NTS (phpstudy)

git clone git@github.com:hudeyongs/xhprof.git

 

以 thinkphp 使用为例

// 检测 -- 开始
xhprof_enable();

// 待测试的业务代码  -- 开始
require './ThinkPHP/ThinkPHP.php';
// ...
// // 待测试的业务代码  -- 结束

// 检测 -- 停止
// stop profiler
$xhprof_data = xhprof_disable();
$XHPROF_ROOT = str_replace('\\', '/', 'D:\phpStudy\WWW\xhprof');
include_once $XHPROF_ROOT . "/xhprof_lib/config.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

// save raw data for this profiler run using default
// implementation of iXHProfRuns.
$xhprof_runs = new XHProfRuns_Default();

// save the run under a namespace "xhprof_foo"
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

// 这里会在页面生成一个连接,点击连接可以看到测试的结果
echo "<pre>".
     "<a href='http://xhprof1.com/index.php?run=$run_id&source=xhprof_foo'>".
     "View the XH GUI for this run".
     "</a>\n".
     "</pre>\n";

效果参考:

 

 

4.0

$foo[] 比 array_push 更快,为什么?

4.1

以下的输出结果是:

<?php
$a[1] = 'Washington';
$a[] = 'Adams';
$a['Honest'] = 'Lincoln';
$a[] = 'Jfferson';
print_r($a);
?>

 

4.2 以下程序的输出结果是:
<?php
$a = range(10, 30, 10);
$b = range('c', 'a');
print_r(array_combine($b, $a));
?>

 

4.3
迭代数组的常用方法:
<?php
// eg: 1
foreach($array as $value){} 
// eg: 2
for($key = 0, $size = count($array); $key < $size; $key++){} 
// eg: 3
reset($array); while(list($key, $value) = each($array)){} 
// 扩展: 
// eg: 4
array_walk: 
bool array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] ) 

<?php 

$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple"); 

function test_alter(&$item1, $key, $prefix) 
{      
    $item1 = "$prefix: $item1"; 
} 

function test_print($item2, $key) 
{ 
    echo "$key. $item2<br />\n"; 
} 

echo "Before ...:\n"; 
array_walk($fruits, 'test_print'); 
array_walk($fruits, 'test_alter', 'fruit'); 
echo "... and after:\n"; array_walk($fruits, 'test_print'); 
?>
// 输出如下:
Before ...:
d. lemon
a. orange
b. banana
c. apple
... and after:
d. fruit: lemon
a. fruit: orange
b. fruit: banana
c. fruit: apple
/**
注意点:
典型情况下 callback 接受两个参数。array 参数的值作为第一个,键名作为第二个。 返回值: 成功时返回 true, 失败时返回 false,通过第二个参数 callback 按引用传值改变原来的数组
*/

 

// eg: 5

array_map 
// 原型
array array_map ( callable $callback , array $array1 [, array $... ] ) 
/** 返回值: 新数组,值由被回调函数处理过后的元素组成 */ 
<?php 
function cube($n) {      
    return($n * $n * $n); 
} 
$a = array(1, 2, 3, 4, 5); 
$b = array_map("cube", $a); 
print_r($b); 
?> 
// current 和 next 内部指针 ?>

 

 

<?php
class Test implements ArrayAccess
{
   private $testData;

   public function offsetExists($key)
   {
      return isset($this->testData[$key]);
   }

   public function offsetSet($key, $value)
   {
      $this->testData[$key] = $value;
   }

   public function offsetGet($key)
   {
      return $this->testData[$key];
   }

   public function offsetUnset($key)
   {
      unset($this->testData[$key]);
   }
}

$obj = new Test();

$obj['data'] = 'data';

if(isset($obj['data']))
{
   echo 'has setting';
}

echo $obj['data'];

更多: http://php.net/manual/zh/class.arrayaccess.php

server {
...
server_name ~^(.+).your_domain_here.com$; # eg: bbs.hackoops.com
set $domain $1;
...
location / {
root html/$domain/; # => html/bbs
index index.php index.html index.htm;
}
...
location ~ \.php {
root html/$domain/; # => html/bbs
...
}

1、php字符串中单引号和双引号包含字符串的区别正确的是
A:单引号速度快,双引号速度慢
B:单引号不解析变量,但是会解析包含的\n、\t等转义字符
C:单引号和双引号都可以解析变量
D:双引号里面可以解析变量

2. php中关于字符串处理函数以下说法正确的是
A:implode( )方法可以将字符串拆解为数组
B:str_replace()可以替换指定位置的字符串
C:substr( )可以截取指定位置的字符串
D:strlen( )可以取到字符串的字符数

3. 考虑如下脚本。标记处应该添加什么代码才能让脚本输出字符串php?
$alpha = ‘abcdefghijklmnopqrstuvwxyz’;
$letters = array(15, 7, 15);
foreach($letters as $val)
{
/* 这里应该加入什么 */
}
A.echo chr($val);
B.echo asc($val);
C.echo substr($alpha, $val, 2);
D.echo $alpha{$val};
E.echo $alpha{$val+1}

4. 以下哪一项不能把字符串$s1 和$s2 组成一个字符串?
A.$s1 + $s2
B.”{$s1}{$s2}”
C.$s1.$s2
D.implode(”, array($s1,$s2))
E.以上都可以

5. 以下脚本输出什么?
$s = ‘12345’;
$s[$s[1]] = ‘2’;
echo $s;

6. 关于字符编码下列描述错误的是?
A.GBK和utf8都是字符编码。
B.GBK编码下一个字符占2个字节,一个utf8编码的字符占用3个字节。
C.通过分析字符字节范围的方式,并不能百分百确定一个字符的编码。
D.UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。

7. 如果用+操作符把一个字符串和一个整型数字相加,结果将怎样?
A.解释器输出一个类型错误
B.字符串将被转换成数字,再与整型数字相加
C.字符串将被丢弃,只保留整型数字
D.字符串和整型数字将连接成一个新字符串
E.整形数字将被丢弃,而保留字符串

10. PHP代码的执行结果是:
$s = file_get_contents (“http://www.php.net”);
strip_tags ($s, array (‘p’));
echo count ($s);

A.www.php.net的主页的字符数
B.剔除
标签后的www.php.net主页的字符数
C.1
E.剔除
以外的标签后的www.php.net主页的字符数

1. D
答案分析:单引号代表按原样输出。比如’hello\r\n’,输出的就是hello\r\n。但如果是双引号,则会对其中的转义字符进行转换。比如还是刚才的字符串,由于\r\n是换行标记,所以双引号内的”hello\r\n”就会输出hello后再换行。

2. C
答案分析:字符函数的基本使用,可能D选项是最容易出错的。需要注意的是,strlen只能截取字符长度,不能截取字符个数。

3. D
答案分析:substr 函数能够胜任,但考虑到输出三个字母就需要三次调用该函数,所以排除此方法。那么$alpha{$val}和$alpha{$val+1}是仅有的两个可能输出题目要求的字符串的选项。因为 0 是数组的第一个索引,所以答案是 D。

4. A
答案分析:除 A 以外的选项都能输出题目要求的字符串。
PHP中,加号+不能把两个字符串合并成一个。

5. B
答案分析:可以用访问数组元素的方式访问字符串中的字符,因此脚本只是把字符串中的第二个字符($s[1])替换成了字符 2,最终将输出 12245。答案是 B。

6. B
答案分析:GBk编码中的汉字是占2个字节,和utf8编码中汉字是占三个字节的,但并不是所有字符都如此,比如英文字符,在两种编码中,都只占一个字节。

7. C
答案分析:西文字符编码的关系,我国国家标准局采用了加以修正的两字节汉字编码方案,只用了两个字节的低7位。这个方案可以容纳 128×128=16384 种不同的汉字;
为了与标准ASCII码兼容,每个字节中都不能再用32个控制功能码和码值为32的空格以及127的操作码。
所以每个字节只能有94个编 码。这样,双七位实际能够表示的字数是:94×94=8836个。

9. B
答案分析:字符串将被转换成数字(如果无法发生转换就是0),然后与整型数字相加。

10. C
答案分析:代码的本意是剔除www.php.net主页上除了p以外的的所有HTML标签。可实际上,在代码的最后一行使用了count函数,它统计变量中的元素数量,而不是字符串中的字符数。由于字符串是标量,对字符串使用count函数将永远返回1。答案是C。