PHP面试题(部分)

来源:互联网 发布:会员充值管理系统php 编辑:程序博客网 时间:2024/05/17 22:12
1. apache 两种工作模式,prefork、workder
    prework:预产生子进程,每个子进程只产生一个线程,内存使用高,没有线程安全问题,比worker更高效
    worker:每个子进程产生多个线程,内存使用低,但是有线程安全问题,而且由于线程共享内存,一个线程的异常会影响其他的,是进程奔溃,但由于使用了多线程,适用于海量的流量访问
2. php的构造hash table冲突漏洞,是hash table退化成链表,2的16次方
3. php工作原理:
    四层结构:zend引擎、extensions扩展、sapi、应用
    webserver通过sapi和php交换数据
    sapi有apache2handler、cgi、cli 3中模式
4. innodb和mysiam的区别
    a. 事务的支持区别
    b. 行锁和表锁
    c. 没where的count(*),mysiam更快,直接读取预先保存好的数字
    d. innodb单次插入的效率很低,如果开启的是autocommit=1,因为要刷新日志,所以如果使用多values一起insert或者开启事务,效率和mysiam差不多
    e. myisam单独表文件,innodb有表结构描述文件,无法一次性copy
5. php的漏洞
   a. register_globals,会把get参数当做变量定义进来
   b. 尽量不用eval,system、exec、passthru函数
   c. 跨站脚本攻击xss:注意输出转义htmlspecialchars
   d. sql注入:注意intval以及mysql_real_escape_string对参数转义
   e. 跨站请求伪造:访问恶意网站,偷取用户的cookie,提交到cookie对应的正式网站,实现一些漏洞功能,提交的方式可以是img里包含代码自动post,对应策略就是检查http Referer,看请求是否来自外站或者给每个页面增加一个token,提交的时候会验证token的有效性,比如rails的做法
6. 冒泡排序
$a = array(1,3,5,2,4,9,7);
$len = count($a);
for ($i=0; $i < $len-1; $i++) { 
    for ($j=0; $j < $len-$i-1; $j++) { 
        if ($a[$j] > $a[$j+1]) {
            $tmp = $a[$j+1];
            $a[$j+1] = $a[$j];
            $a[$j] = $tmp;
        }
    }
}
7. 插入排序:向一个有序的数组中插入一个数字,排在应该排的位置,顺序判断,O(n2)
[46] 31 6 19 23
[31 46] 6 19 23
[6 31 46] 19 23
[6 19 31 46] 23
[6 19 23 31 46]


$a = array(46,31,6,19,23);
function insertSort(&$arr){
    //先默认第一个下标为0的数是排好的数
    for($i=1;$i<count($arr);$i++){
        //确定插入比较的数
        $insertVal = $arr[$i];
        //确定与前面比较的数比较
        $insertIndex = $i-1;


        //表示没有找到位置
        while($insertIndex>=0 && $insertVal<$arr[$insertIndex]){
            //把数后移
            $arr[$insertIndex+1] = $arr[$insertIndex];
            $insertIndex --;
        }
        //插入(给$insertval找到位置了)
        $arr[$insertIndex+1] = $insertVal;
    }
}


8. 选择排序:从一个无序数组中取出最小,放到一个空或者有序数组的最后
[46 31 6 19 23]
6 [46 31 19 23]
6 19 [46 31 23]
6 19 23 [46 31]
6 19 23 31 [46]
function selectSort(&$array){  
    $len = count($array);
    for($i=0; $i<$len-1; $i++){
        $k = $i;
        for($j=$i+1; $j< $len; $j++){
            if($array[$j] < $array[$k]){
                $k = $j;//选择符合交换的数据的下标
            }
        }
        if($k != $i){  
            $temp = $array[$i];
            $array[$i] = $array[$k];
            $array[$k] = $temp;
        }print_r($array);
    }
}


9. 快速排序:第一个数字为分界,左边都是小于这个数字的,右边大于这个数字的,分成左右2个数组,然后每个数组又按第一个为界然后递归
function quick_sort($array){
    if (count($array) <= 1){
        return $array;
    }
    $key = $array[0];
    $left_arr = array();
    $right_arr = array();
    for ($i=1; $i<count($array); $i++){
        if ($array[$i] <= $key){
            $left_arr[] = $array[$i];
        }else{
            $right_arr[] = $array[$i];
        }
    }
    $left_arr = quick_sort($left_arr);
    $right_arr = quick_sort($right_arr);
    return array_merge($left_arr, array($key), $right_arr);
}


原创粉丝点击