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);
}
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);
}