PHP 之面试资料(一)

来源:互联网 发布:狗扑源码 编辑:程序博客网 时间:2024/05/14 04:06
<?php    session_id()    session_unset()会释放所有session变量。    is_numeric     mysql_real_escape_string()     $a = crc32('khdkjdkndslkjjd');    $b = sprintf('%u',$a);    echo $b;    var likes =eval('<?php echo json_encode($data);?>');    1.复合索引的情况下,如果查询条件不包含索引列的最左边部分,即不满足最左前缀原则,则不会使用索引    2.or分割开的条件,如果 or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到    3..字段使用函数,将无法使用索引    (7).Join 语句中 Join 条件字段类型不一致的时候 MySQL 无法使用索引    3.优化ORDER BY语句    通过索引排序是性能最好的,通常如果SQL语句不合理,就无法使用索引排序,以下几种情况是无法使用索引排序的。    (1).查询使用了两种不同的排序方向,但是索引列都是正序排序的;    (2).查询的whereorder by中的列无法组合成索引的最左前缀;    (3).查询在索引列的第一列上是范围条件;    (4)查询条件上有多个等于条件。对排序来说,这也是一种范围查询    show variables like 'long_query_time' ; //可以显示当前慢查询时间    set long_query_time=1 ;//可以修改慢查询时间    SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool_pages_%';    //复制一个表    CREATE TABLE mydb.mytablenew LIKE mydb.mytable;    INSERT INTO mydb.mytablenew SELECT * FROM mydb.mytable;    ALTER TABLE mydb.mytable RENAME mydb.mytablezap;    ALTER TABLE mydb.mytablenew RENAME mydb.mytable;    DROP TABLE mydb.mytablezap;    show full processlist; 

1 数据库设计三大范式

1,数据的原子性2,确保每列都和主键相关,意思是:只做一件事3,确保每列都和主键直接相关,而不是间接相关,意思是不能存在传递依赖

2 rest

  GET request to /api/users – 列举出所有的用户   GET request to /api/users/1 – 列出ID为1的用户信息   POST request to /api/users – 插入一个新的用户   PUT request to /api/users/1 – 更新ID为1的用户信息   DELETE request to /api/users/1 – 删除ID为1的用户 

3 show processlist

找到id ,kill id

4 使用独立的Session服务器可以解决负载均衡场景中的Session共享问题

file_get_contents('php://input')

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53

5 设置开启慢日志

show variables like "%slow%";mysql> set global slow_query_log=ON;Query OK, 0 rows affected (0.03 sec)mysql> set global slow_launch_time=5;Query OK, 0 rows affected (0.00 sec)

6 PHP保留两位小数例子 四舍五入

<?php    /** 1.number_format */    $number = 1234.5678;    $nombre_format_francais = number_format($number, 2, ',', ' '); // 1234,57    $english_format_number = number_format($number, 2, '.', '');   // 1234.57(我一般用这个)    /** 2.round */    $number = 1234.5678;    echo round($number ,2); //1234.57    /** 3.sprintf */    $formatted = sprintf ("%s有¥%01.2f。", $name, $money);    echo $formatted; //张三有¥123.10。?>

7 判断变量

    $var = 0;     // 结果为 true,因为 $var 为空     if (empty($var)) {         echo '$var is either 0 or not set at all';     }     echo PHP_EOL;    // 结果为 false,因为 $var 已设置     if (isset($var)) {         echo '$var is not set at all';     }    如果变量为0,则empty()会返回TRUEisset()会返回TRUE;    如果变量为空字符串,则empty()会返回TRUEisset()会返回TRUE;    如果变量未定义,则empty()会返回TRUEisset()会返回FLASE; 

8 幂等有以下几种定义

    对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。

9

    $request_method = strtolower($_SERVER['REQUEST_METHOD']);         case 'put':           parse_str(file_get_contents('php://input'), $put_vars);          $data = $put_vars;          break;     <?php    parse_str("name=Bill&age=60",$myArray);    print_r($myArray);    ?>      

10 http中get与post区别

    //GET与POST方法实例:    GET /books/?sex=man&name=Professional HTTP/1.1    Host: www.wrox.com    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)    Gecko/20050225 Firefox/1.0.1    Connection: Keep-Alive    POST / HTTP/1.1    Host: www.wrox.com    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)    Gecko/20050225 Firefox/1.0.1    Content-Type: application/x-www-form-urlencoded    Content-Length: 40    Connection: Keep-Alive----此处空一行----)    name=Professional%20Ajax&publisher=Wiley    

11 缓存方面的几个问题,LRU LFU

 在FIFO Cache设计中,核心原则就是:如果一个数据最先进入缓存中,则应该最早淘汰掉。也就是说,当缓存满的时候,应当把最先进入缓存的数据给淘汰掉。在FIFO Cache中应该支持以下操作;

12

file() 函数用于把 整个文件 读入一个数组中,数组中的每个单元都是文件中相应的一行,包括换行符在内。成功返回一个数组,失败则返回 FALSE。

13

<?php     print_r($argv); //使用场景 linux下,php ./test.php 111 222 --$argv[0]文件名,$argv[1]第一个参数?>

14 fseek(file,offset,whence)

参数  描述file    必需。规定要在其中定位的文件。offset  必需。规定新的位置(从文件头开始以字节数度量)。whence  可选。可能的值:SEEK_SET - 设定位置等于 offset 字节。默认。SEEK_CUR - 设定位置为当前位置加上 offset。SEEK_END - 设定位置为文件末尾加上 offset (要移动到文件尾之前的位置,offset 必须是一个负值)。

15、nginx 的 upstream目前支持 4 种方式的分配

1)、轮询(默认)       每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 2)、weight       指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 2)、ip_hash       每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。  3)、fair(第三方)       按后端服务器的响应时间来分配请求,响应时间短的优先分配。  4)、url_hash(第三方)

16

Sharding不是一个某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是水平扩展(Scale Out,亦或横向扩展、向外扩展)的解决方案,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。

17

lvs工作方式的逻辑是非常之简单,而且工作在网络4层仅做请求分发之用,nginx工作在网络的7层,所以它可以针对http应用本身来做分流策略,比如针对域名、目录结构等,相比之下lvs并不具备这样的功能,Haproxy的优点:    它的优点正好可以补充nginx的缺点。支持session保持,同时支持通过获取指定的url来检测后端服务器的状态。    支持tcp模式的负载均衡。比如可以给MySQL的从服务器集群和邮件服务器做负载均衡。    HAProxy的特点是:    HAProxy是工作在网络7层之上。

18、LVS负载均衡技术:

(1)LVS-DR模式(Direct routing):直接路由模式。用得最多!可以跟100个以上Real Server(2)LVS-NAT模式(Network Address Translaton): 只能跟3~5个Real Server;(3)LVS-TUN模式(IP Tunneling): 应用于远程,尤其是外网等    

19、UNIX 常用信号的意义

SIGHUP     终止进程     终端线路挂断SIGINT     终止进程     中断进程SIGQUIT   建立CORE文件终止进程,并且生成core文件SIGILL   建立CORE文件       非法指令SIGTRAP   建立CORE文件       跟踪自陷SIGBUS   建立CORE文件       总线错误SIGSEGV   建立CORE文件       段非法错误SIGFPE   建立CORE文件       浮点异常SIGIOT   建立CORE文件       执行I/O自陷SIGKILL   终止进程     杀死进程SIGPIPE   终止进程     向一个没有读进程的管道写数据SIGALARM   终止进程     计时器到时SIGTERM   终止进程     软件终止信号SIGSTOP   停止进程     非终端来的停止信号SIGTSTP   停止进程     终端来的停止信号SIGCONT   忽略信号     继续执行一个停止的进程SIGURG   忽略信号     I/O紧急信号SIGIO     忽略信号     描述符上可以进行I/OSIGCHLD   忽略信号     当子进程停止或退出时通知父进程SIGTTOU   停止进程     后台进程写终端SIGTTIN   停止进程     后台进程读终端SIGXGPU   终止进程     CPU时限超时SIGXFSZ   终止进程     文件长度过长SIGWINCH   忽略信号     窗口大小发生变化SIGPROF   终止进程     统计分布图用计时器到时SIGUSR1   终止进程     用户定义信号1SIGUSR2   终止进程     用户定义信号2SIGVTALRM 终止进程     虚拟计时器到时1) SIGHUP 本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联. 2) SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出 3) SIGQUIT 和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号. 4) SIGILL 执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号. 5) SIGTRAP 由断点指令或其它trap指令产生. 由debugger使用. 6) SIGABRT 程序自己发现错误并调用abort时产生. 6) SIGIOT 在PDP-11上由iot指令产生, 在其它机器上和SIGABRT一样. 7) SIGBUS 非法地址, 包括内存地址对齐(alignment)出错. eg: 访问一个四个字长的整数, 但其地址不是4的倍数. 8) SIGFPE 在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误. 9) SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞, 处理和忽略. 10) SIGUSR1 留给用户使用 11) SIGSEGV 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据. 12) SIGUSR2 留给用户使用 13) SIGPIPE Broken pipe 14) SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号. 15) SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理. 通常用来要求程序自己正常退出. shell命令kill缺省产生这个信号. 17) SIGCHLD 子进程结束时, 父进程会收到这个信号. 18) SIGCONT 让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符 19) SIGSTOP 停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别: 该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略. 20) SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号 21) SIGTTIN 当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行. 22) SIGTTOU 类似于SIGTTIN, 但在写终端(或修改终端模式)时收到. 23) SIGURG 有"紧急"数据或out-of-band数据到达socket时产生. 24) SIGXCPU 超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/ 改变 25) SIGXFSZ 超过文件大小资源限制. 26) SIGVTALRM 虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间. 27) SIGPROF 类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间. 28) SIGWINCH 窗口大小改变时发出. 29) SIGIO 文件描述符准备就绪, 可以开始进行输入/输出操作. 30) SIGPWR Power failure 有两个信号可以停止进程:SIGTERM和SIGKILL。 SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假 如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。对于SIGKILL信号,进程是不能忽略的。这是一个 “我不管您在做什么,立刻停止”的信号。假如您发送SIGKILL信号给进程,Linux就将进程停止在那里。

20

字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore)。

21

有符号就是signed:在存放整数的储存单元中,最左边的一位是表示符号位,该位为0,表示数值为正,1为负.无符号就是unsigned:就是最左边的那一位没有符号位

22

Keepalived,集群,Layer3,4&7工作在IP/TCP协议栈的IP层,TCP层,及应用层

23 TCP与UDP区别

TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快 

24 选择排序

代码如下:$array3 = array(11,-3,51,-7,9,100,2,-56,32,21);   for ($i = 0;$i < count($array3) - 1;$i++){      for ($j = $i + 1;$j < count($array3);$j++){        if ($array3[$j] < $array3[$i]){          $temp = $array3[$i];          $array3[$i] = $array3[$j];          $array3[$j] = $temp;        }      }   }   foreach ($array3 as $value){      echo $value.'&nbsp; ';   }输出结果:-56 -7 -3 2 9 11 21 32 51 100

25、单点登录sso–需实现session共享与cookie跨域—–jsonp

http://blog.csdn.net/clh604/article/details/20365967/(访问原博主的)http://blog.chinaunix.net/uid-25508399-id-3431705.html(访问原博主的)需求是有2个域名:www.a.com和www.b.com,b.com需要获取a.com中的cookie,解决方法是这样的:在a.com编写一个设置cookie的页面:set_cookie.php 代码如下:<script src="http://www.b.com/set_cookie.php?name=yhp"></script>在b.com编写一个设置cookie的页面:set_cookie.php 代码如下:header("P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR");setcookie("cookie_name", $_GET['name'],time()+365*24*60*60);在b.com编写一个获取cookie的页面:get_cookie.php 代码如下:echo var_dump($_COOKIE);我们先访问 www.a.com/set_cookie.php,再访问 www.b.com/get_cookie.php,发现已经可以获取到cookie了,这其实就是做了一个中转的技巧,b.com中set_cookie.php代码中的 P3P header主要是针对IE浏览器拒绝第三方cookie的问题

26

nginx 的限制连接模块limit_zone与limit_req_zone

27 redis 事物

 WATCH mykey val = GET mykey val = val + 1 MULTI SET mykey $val EXEC

28、语法()

flock(file,lock,block)参数  描述file    必需。规定要锁定或释放的已打开的文件。lock    必需。规定要使用哪种锁定类型。block   可选。若设置为 1 或 true,则当进行锁定时阻挡其他进程。说明flock() 操作的 file 必须是一个已经打开的文件指针。lock 参数可以是以下值之一:要取得共享锁定(读取的程序),将 lock 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。要取得独占锁定(写入的程序),将 lock 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。要释放锁定(无论共享或独占),将 lock 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。如果不希望 flock() 在锁定时堵塞,则给 lock 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)。

29、PHP的垃圾收集机制是怎样的

在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁;这是PHP 的GC垃圾处理机制,防止内存溢出。 当一个 PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中所有对象同时被销毁。GC进程一般都跟着每起一个SESSION而开始运行的.gc目的是为了在session文件过期以后自动销毁删除这些文件.

30、

    shell编程实现1-100之和    #! /bin/bash    i=100    j=1    while [ $j -le $i ]; do    sum=$[$sum+$j]    j=$[$j+1]    done    echo $sum

31在safe_mode打开的情况下,下列函数将会收到限制:

    ckdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,  require,highlight_file,show_source,include,symlink,link,touch,mkdir,unlink

32MYISAM 和 InnoDB的区别是什么?

MYISAM不支持事务InnoDB支持事务MYISAM是表级锁 由于是表级锁,对高并发性的update效率较低;InnoDB是行级锁由于是行级锁,对高并发性的update效率相对较高MYISAM支持全文索引InnoDB不支持全文索引MYISAM使用用于大量select操作的数据库,InnoDB适合用于执行大量的INSERT或UPDATE操作的数据库34、在《数据库原理》里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正式因为如此,所以一个表最多只能有一个聚簇索引http://blog.sina.com.cn/s/blog_77e26b1e0102v0ap.html

33 冒泡

    function maopao($arr) {        $count = count($arr);        for($i=0; $i<$count-1; ++$i) {            for($j=0; $j<$count-$i-1; ++$j) {            if($arr[$j] > $arr[$j+1]) {                $temp = $arr[$j];                $arr[$j] = $arr[$j+1];                $arr[$j+1] = $temp;                }            }        }    return $arr;    }

34 PHP的语言结构和函数的区别

相信大家经常看到对比一些PHP应用中,说用isset() 替换 strlen(),isset比strlen执行速度快等。  例子:      if ( isset($username[5]) ) {      // The username is at least six characters long.      }      原因是isset是语言结构,而strlen是一个函数。那什么是语言结构呢?它和函数有什么不同吗?            1、  什么是语言结构和函数            语言结构:就是PHP语言的关键词,语言语法的一部分;它不可以被用户定义或者添加到语言扩展或者库中;它可以有也可以没有变量和返回值。      函数:    由代码块组成的,可以复用。            2、  语言结构为什么比函数快      原因是在PHP中,函数都要先被PHP解析器分解成语言结构,所以有此可见,函数比语言结构多了一层解析器解析。这样就能比较好的理解为      什么语言结构比函数快了。            3、  语言结构和函数的不同            语言结构比对应功能的函数快      语言结构在错误处理上比较鲁棒,由于是语言关键词,所以不具备再处理的环节      语言结构不能在配置项(php.ini)中禁用,函数则可以。      语言结构不能被用做回调函数

35 php中语言结构有哪些

echo() print() die() isset() unset() include(),注意,include_once()是函数 require(),注意,require_once()是函数 array() list() empty() 

36 插入排序:

代码如下:$array4 = array(11,-3,51,-7,9,100,2,-56,32,21);   for ($i = 1;$i < count($array4);$i++){       $insertVal = $array4[$i];       $insertIndex = $i - 1;       while ($insertIndex >=0 && $insertVal < $array4[$insertIndex]){          $array4[$insertIndex + 1] = $array4[$insertIndex];          $insertIndex--;       }       $array4[$insertIndex + 1] = $insertVal;   }   foreach ($array4 as $value){      echo $value.'&nbsp; ';   }输出结果:-56 -7 -3 2 9 11 21 32 51 100

37 快速排序

代码如下:function quickSort($arr){       if (count($arr) < 1){           return $arr;       }       $key = $arr[0];       $left_arr = array();       $right_arr = array();          for($i=1; $i < count($arr); $i++){           if($arr[$i] <= $key){               $left_arr[] = $arr[$i];           } else {               $right_arr[] = $arr[$i];           }       }       $left_arr = quickSort($left_arr);       $right_arr = quickSort($right_arr);       return array_merge($left_arr, array($key), $right_arr);   }   $arr = array(11,-3,51,-7,9,100,2,-56,32,21);   $arr2= quickSort($arr);   foreach ($arr2 as $key=>$value){       echo $value."&nbsp;&nbsp;";   }输出结果:-56 -7 -3 2 9 11 21 32 51 100

(总结了一些面试题,有的没有标题,就用序号代替了……)

0 0
原创粉丝点击