1、字符串”\r”,”\n”,”\t”,”\x20”分别代表什么?
答案: “\r”代表的含义是:
在Linux、unix 中表示返回到当行的最开始位置,在Mac OS 中表示换行且返回到下一行的最开始位置,相当于Windows 里的 \n 的效果。
“\n”代表的含义是:
在Windows 中表示换行且回到下一行的最开始位置。相当于Mac OS 里的 \r 的效果,在Linux、unix 中只表示换行,但不会回到下一行的开始位置。
“\t”所代表的含义是:
键盘上的“TAB”键,跳格(移至下一列)。
“\x20”所代表的含义是:
是32在ASCII表中16进制的表示。
2、 以下语句输出的结果是什么
- $a = 3;
- echo "$a",'$a',"\\\$a","${a}","$a"."$a","$a"+"$a";
得到的结果是:3$a\$a3336
3、以下语句输出的结果是什么
- setcookie("a","value");
- print $_COOKIE['a'];
得到的结果是:
value(若只是这两段编码运行,则会提示PHP Notice: Undefined index: a)
4、php中将当前页面重定向到另一个页面怎么写?
header();
5、什么是魔术引号(magic_quotes_gpc)?
魔术引号(Magic Quotes)是一个自动将进入 PHP 脚本的数据进行转义的过程。
提示:最好在编码时不要转义而在运行时根据需要而转义。
6、在类的方法中,如何调用其父类的同名方法?
parent::方法名
7、php中如何取得get,post参数,和上传的文件
- $_GET,$_POST,$_FILES
8、如何取得客户端的ip(要求取得一个int)
- $_SERVER["REMOTE_ADDR"];ip2long进行转换
9、include和require的区别
require:出现错误后直接终止退出,程序不再执行
include:包含一个不存在的文件,会提示警告程序会继续执行
10、extends的作用是什么
类的继承
11、@test()和&test()的区别
@test()的作用是屏蔽test()方法中警告的作用
&test()引用test()方法
12、array+array与array_merge()的区别
二者之间的区别是:
1 键名为数字时,array_merge()不会覆盖掉原来的值,但+合并数组则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉(不是覆盖)
2 键名为字符时,+仍然把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉,但array_merge()此时会覆盖掉前面相同键名的值
13、请列举最少3个php对象的魔术方法和说明它们的用途
构造方法: __construct()
析构方法__destruct()
__get() 控制私有的受保护的未定义的成员属性的访问
__set() 对私有的受保护的未定义的成员属性进行赋值控制
__isset() 对私有的受保护的未定义成员属性进行isset和empty的判断控制
等等
14、什么是fpm
FastCGI Process Manager:FastCGI进程管理器
15、描述一下php开发中常见的几种攻击以及解决方案
SQL注入:
解决这个问题的办法是,将 PHP 的内置 mysql_real_escape_string() 函数用作任何用户输入的包装器。这个函数对字符串中的字符进行转义,使字符串不可能传递撇号等特殊字符并让MySQL根据特殊字符进行操作。
跨站点脚本攻击(XSS):
strip_tags() 函数,这个函数可以清除任何包围在 HTML 标记中的内容或者使用htmlspecialchars() 函数。
16、echo intval(0.58*100) 输出的结果是57,试分析这是为什么?
原因就是浮点数精度的问题。
简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999…。
这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333…。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。
如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数
17、用最少的代码写一个求3值最大值的函数.
- function who($a,$b,$c) {
- return $a > $b ? ($a > $c ? $a : $c) : ($b > $c ? $b : $c);
- }
- echo who(33,53,12);
18、求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数
- $date1 = strtotime('2013-09-09');
- $date2 = strtotime('2011-12-11');
- echo ($date1-$date2)/(24*3600);
19、函数实现-字符串“open_door" 转换成 “OpenDoor"、"make_by_id" 转换成 "MakeById"。
- function towords($str) {
- $newStr = str_replace("_"," ",$str);
- $newStr = ucwords($str);
- $newStr = str_replace(" ","_",$str);
- return $newStr;
- }
- echo towords("open_door");
20、echo count('abc'); 输出的结果是什么
结果为1
21、用pHp写出显示客户端Ip与服务器Ip的代码
- echo getenv('REMOTE_ADDR');
- echo getenv('SERVER_ADDR');
- echo gethostbyname('<a href="http://www.baidu.com/">www.baidu.com</a>');
22、 error_reporting(2047)什么作用?
相当于 error_reporting('E_ALL'); 输出所有的错误
23、打开php.ini中的Safe_mode,会影响哪些参数?至少说出6个。
此模块打开时,php将检查当前脚本的拥有者是否和被操作文件的拥有者相同,因此,将影响文件操作类函数,程序执行函数 (program Execution Functions)。这些函数有.pathinfo,basename,fopen,system,exec,proc_open 等函数;
24、请写一个函数验证电子邮件的格式是否正确(要求使用正则)
- function checkEmail($mail){
- $reg= '/^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$/';
- $rst = preg_match($reg,$mail);
- if($rst){
- return TRUE;
- } else {
- return FALSE;
- }
- }
25、写个函数用来对二维数组排序。
array_multisort()
26、问题:请用最简单的语言告诉我PHP是什么?
回答:PHP全称:Hypertext Preprocessor,是一种用来开发动态网站的服务器脚本语言。
27、 禁用COOKIE 后 SEESION 还能用吗?
不能
28、抓取远程图片到本地,你会用什么函数?
fsockopen();
29、你觉得在PV10W的时候, 同等配置下,LUNIX 比WIN快多少?
不做优化的情况下一样
30、 简述POST 和GET传输的最大容量分别是多少?
2MB(可在php.ini中更改),1024B
31、要求写一段程序,实现以下数组$arr1转换成数组$arr2:
$arr1 = array ( ‘0′ => array (‘fid’ => 1, ‘tid’ => 1, ‘name’ =>’Name1′ ), ‘1′ => array (‘fid’ => 1, ‘tid’ => 2 , ‘name’ =>’Name2′ ), ‘2′ => array (‘fid’ => 1, ‘tid’ => 5 , ‘name’ =>’Name3′ ), ‘3′ => array (‘fid’ => 1, ‘tid’ => 7 , ‘name’ =>’Name4′ ), ‘4′ => array (‘fid’ => 3, ‘tid’ => 9, ‘name’ =>’Name5′ ) ); $arr2 = array ( ‘0′ => array ( ‘0′ => array ( ‘tid’ => 1, ‘name’ => ‘Name1′), ‘1′ => array ( ‘tid’ => 2, ‘name’ => ‘Name2′), ‘2′ => array ( ‘tid’ => 5, ‘name’ => ‘Name3′), ‘3′ => array ( ‘tid’ => 7, ‘name’ => ‘Name4′) ), ‘1′ => array ( ‘0′ => array ( ‘tid’ => 9, ‘name’ => ‘Name5′ ) ) );
- <?php
- $arr1 = array (
- ‘0′ => array (‘fid’ => 1, ‘tid’ => 1, ‘name’ =>’Name1′ ),
- ‘1′ => array (‘fid’ => 1, ‘tid’ => 2 , ‘name’ =>’Name2′ ),
- ‘2′ => array (‘fid’ => 1, ‘tid’ => 5 , ‘name’ =>’Name3′ ),
- ‘3′ => array (‘fid’ => 1, ‘tid’ => 7 , ‘name’ =>’Name4′ ),
- ‘4′ => array (‘fid’ => 3, ‘tid’ => 9, ‘name’ =>’Name5′ )
- );
- function changeArrayStyle($arr){
- foreach($arr as $key=>$value){
- $result[$value[fid]][]=$value;
- }
- return array_values($result);
- }
- $arr2=changeArrayStyle($arr1);
- echo “<pre>”;
- var_dump($arr2);
- ?>
32、请简述数据库设计的范式及应用。
一般第3范式就足以,用于表结构的优化,这样做既可以避免应用程序过于复杂同时也避免了SQL语句过于庞大所造成系统效率低下。
回答:
第一范式:若关系模式R的每一个属性是不可再分解的,再属于第一范式。
第二范式:若R属于第一范式,且所有的非码属性都完全函数依赖于码属性,则为第二范式。
第三范式:若R属于第二范式,且所有的非码属性没有一个是传递函数依赖于候选码,则属于第三范式。
33、一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数,用SQL语句及视图、存储过程分别实现。
存储过程:
DELIMITER // create procedure proc_countNum(in columnId int,out rowsNo int) begin select count(*) into rowsNo from member where member_id=columnId; end call proc_countNum(1,@no); select @no;
视图:
create view v_countNum as select member_id,count(*) as countNum from member group by member_id select countNum from v_countNum where member_id=1
34、表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
select case when first_name>middle_name then case when first_name>last_name then first_name else last_name end else case when middle_name>last_name then middle_name else last_name end end as name from member;
35、请简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析?
(1)尽量选择较小的列;
(2)将where中用的比较频繁的字段建立索引;
(3)select中避免使用*;
(4)避免在索引列上使用计算、not in和<>等操作;
(5)当只需要一行数据时候使用limit1;
(6)保证单表数据不超过200w,实时分割表;
针对查询较慢的语句,可以使用explain来分析该语句具体的执行情况。
36、 如果模板是用smarty模板。怎样用section语句来显示一个名为$data的数组。比如:
$data = array( [0] => array( [id]=8 [name]=’name1′) [1] => array( [id]=10 [name]=’name2′) [2] => array( [id]=15 [name]=’name3′) …… )
写出在模板页的代码? 若用foreach语句又要怎样显示呢?
{section name=loop loop=$data} {$data[loop].id} {$data[loop].name} {/section} {foreach from=$data item=id key=k} {$k} – {$id} {/foreach}
37、写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。(目录操作)
- <?php
- $d = dir(dirname(__file__));
- //echo “Handle: ” . $d->handle . “n”;
- //echo “path: ” . $d->path . “n”;
- while ( false !== ($entry = $d->read ()) ) {
- echo $entry . “<br />”;
- }
- $d->close ();
- ?>
38、 两张表 city表和province表。分别为城市与省份的关系表。
city表: id City provinceid 1 广州 1 2 深圳 1 3 惠州 1 4 长沙 2 5 武汉 3 ………. 广州
province表: id province 1 广东 2 湖南 3 湖北 ……….
(1) 写一条sql语句关系两个表,实现:显示城市的基本信息?
显示字段:城市id ,城市名, 所属省份 。
如:Id(城市id) Cityname(城市名) privence(所属省份)
。。。。。。。。。
。。。。。。。。。
(2)如果要统计每个省份有多少个城市,请用group by 查询出来。?
显示字段:省份id ,省份名,包含多少个城市。
答案:
1.select A.id,A.Cityname,B.province from city A,province B where A.provinceid=B.id 2.select B.id,B.province,count(*) as num from city A,province B where A.provinceid=B.id group by B.id
39、请使用伪语言结合数据结构冒泡排序法对以下一组数据进行排序 10 2 36 14 10 25 23 85 99 45。
- $a = array(10,2,36,14,10,25,23,85,99,45);
- for($j=0 ; $j<9 ; $j )
- for($i=0 ; $i<9-$j ; $i )
- if($a[$i] > $a[$i 1]) {
- $t = $a[$i] ;
- $a[$i] = $a[$i 1] ;
- $a[$i 1] = $t ; }
- echo var_dump($a);
40、COOKIE、SESSION的联系和区别,多台web服务器如何共享SESSION?
cookie在客户端保存状态,session在服务器端保存状态。但是由于在服务器端保存状态的时候,在客户端也需要一个标识,所以session也可能要借助cookie来实现保存标识位的作用。
cookie包括名字,值,域,路径,过期时间。路径和域构成cookie的作用范围。cookie如果不设置过期时间,则这个cookie在浏览器进程 存在时有效,关闭时销毁。如果设置了过期时间,则cookie存储在本地硬盘上,在各浏览器进程间可以共享。
session存储在服务器端,服务器用一种散列表类型的结构存储信息。当一个连接建立的时候,服务器首先搜索有没有存储的session id,如果没有,则建立一个新的session,将session id返回给客户端,客户端可以选择使用cookie来存储session id。也可以用其他的方法,比如服务器端将session id附在URL上。
区别:
(1).cookie在本地,session在服务器端。
(2).cookie不安全,容易被欺骗,session相对安全。
(3).session在服务器端,访问多了会影响服务器性能。
(4). cookie有大小限制,为3K
多服务器共享session可以尝试将session存储在memcache中。
41、一段php代码,写出输出结果:
- /**** 这个程序****/
- $a=0;
- $b=0;
- if(($a=3)>0||($b=3)>0){
- $a ;
- $b ;
- echo $a ;//3
- echo $b; //0;输出b的值 $b=3没有执行
- }
- $a=0;
- $b=0;
- if(($a=3)>0 || ($b=3)>0){
- $a++;
- $b++;
- echo $a ;//4
- echo $b; //1
- }
42、php中WEB上传文件的原理是什么,如何限制上传文件的大小?
is_uploaded_file() 和 move_uploaded_file()
利用php的文件函数来实现上传 这段代码分为两个文件,一个为upload.html,一个是upload.php upload.html
- <form enctype=”multipart/form-data” action=”upload.php” method=”post”>
- <input type="hidden" name="max_file_size" value="100000">
- <input name="userfile" type="file">
- <input type="submit" value="上传文件">
- </form>
请注意我们要实现文件的上传,必须指定为multipart/form-data,否则服务器将不知道要干什么。
值得注意的是文件upload.html中表单选项 MAX_FILE_SIZE 的隐藏值域,通过设置其Value(值)可以限制上载文件的大小。
MAX_FILE_SIZE 的值只是对浏览器的一个建议,实际上它可以被简单的绕过。因此不要把对浏览器的限制寄希望于该值。实际上,PHP设置中的上传文件最大值,是不会失效的。但是最好还是在表单中加上MAX_FILE_SIZE,因为它可以避免用户在花时间等待上传大文件之后才发现该文件太大了的麻烦。
PHP默认的上传限定是最大2M,想上传超过此设定的文件,需要调整PHP、apache等的一些参数. 下面,我们简要介绍一下PHP文件上传涉及到的一些参数:打开php.ini,
参数 设置 说明
file_uploads on 是否允许通过HTTP上传文件的开关。默认为ON即是开
upload_tmp_dir — 文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
upload_max_filesize 8m 望文生意,即允许上传文件大小的最大值。默认为2M
post_max_size 8m 指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M
说明
一般地,设置好上述四个参数后,在网络正常的情况下,上传<=8M的文件是不成问题 但如果要上传>8M的大体积文件,只设置上述四项还一定能行的通。除非你的网络真有100M/S的上传高速,否则你还得继续设置下面的参数。
max_execution_time 600 每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time 600 每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit 8m 每个PHP页面所吃掉的最大内存,默认8M
把上述参数修改后,在网络所允许的正常情况下,就可以上传大体积文件了
43、写一个函数,可以遍历文件夹下的所有文件和文件夹.
- <?php
- function my_scandir($dir)
- {
- $files = array();
- if ( $handle = opendir($dir) ) {
- while ( ($file = readdir($handle)) !== false ) {
- if ( $file != ".." && $file != "." ) {
- if ( is_dir($dir . "/" . $file) ) {
- $files[$file] = my_scandir($dir . "/" . $file);
- }else {
- $files[] = $file;
- }
- }
- }
- closedir($handle);
- return $files;
- }
- }
- dump(my_scandir("D:\wwwroot"));
- function dump($vars){
- $content = "<div align=left><pre>\n" . htmlspecialchars(print_r($vars, true)) . "\n</pre></div>\n";
- echo "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"></head><body>{$content}</body></html>";
- return;
- }
opendir -- 打开目录句柄
resource opendir ( string path)
返回一个目录句柄,可以在之后用在 closedir(),readdir() 和 rewinddir() 调用中。
如果 path 不是一个合法的目录或者因为权限限制或文件系统错误而不能打开目录,opendir() 返回 FALSE 并产生一个 E_WARNING 级别的 PHP 错误信息。可以在 opendir() 前面加上“@”符号来抑制错误信息的输出。
readdir -- 从目录句柄中读取条目
string readdir ( resource dir_handle)
返回目录中下一个文件的文件名。文件名以在文件系统中的排序返回。
请留意下面例子中检查 readdir() 返回值的风格。我们明确地测试返回值是否全等于(值和类型都相同 - 更多信息参见比较运算符)FALSE,否则任何目录项的名称求值为 FALSE 的都会导致循环停止(例如一个目录名为“0”)。
is_dir -- 判断给定文件名是否是一个目录
bool is_dir ( string filename)
如果文件名存在并且为目录则返回 TRUE。如果 filename 是一个相对路径,则按照当前工作目录检查其相对路径。
注: 本函数的结果会被缓存。详细信息参见 clearstatcache()。
注: 本函数不能作用于远程文件,被检查的文件必须通过服务器的文件系统访问。
scandir -- 列出指定路径中的文件和目录
array scandir ( string directory [, int sorting_order])
返回一个 array,包含有 directory 中的文件和目录。如果 directory 不是一个目录,则返回布尔值 FALSE,并产生一条 E_WARNING 级别的错误。
默认情况下,返回值是按照字母顺序升序排列的。如果使用了可选参数 sorting_order(设为 1),则按照字母顺序降序排列。
44、有mail.log的一个文档,内容为若干邮件地址,其中用'\n'将邮件地址分隔。要求从中挑选出sina.com的邮件地址(包括从文件读取、过滤到列印出来)。
mail.log内容如下:
james@sina.com.cn
jack@163.com
zhansan@sohu.com
lisi@hotmail.com
wangwu@gmail.com
aaaa@sina.com
(如果是大公司,往往还告诉你,该log日志的大小1G,而能供你使用的内存只有500M,让你综合考虑速度,内存来完成该题)
答:第一种是:直接使用file_get_contents();
- $info=file_get_contents(mail.log);
- $list=explode('\n',$info);
- foreach($list as $v){
- if(substr($v,-9)=='@sina.com'){
- echo $v.'
- ';
- }
- }
- fclose($fp);
第二种是:使用fopen函数
- $fp=fopen('mail.log','r');
- while(!fof($fp)){
- $line=fgets($fp);
- if(substr($line,-9)=='@sina.com'){
- echo $line.'
- ';
- }
- }
- fclose($fp);
第二种是:正则
- $mail = file_get_contents('mail.log');
- $pattern = "/\S+sina\.com/";
- $rpattern = "/\\n/";
- preg_filter($rpattern,"",$mail);
- if(preg_match_all($pattern,$mail,$matches))
- {
- print_r($matches);
- }
上面三种方法的区别是file_get_contents()一次性将文件读入内存中处理,浪费内存,而第二种三种则是一行一行的读取,不会浪费内存
45、 sort():对数组按照值进行一个排序(按照英文字母的顺序进行排序)
arsort():对数组进行逆向排序并保持索引关系
ksort():对数组按照键值进行排序(按照的英文字母的顺序进行排序)
krsort():对数组按照键值进行逆向排序
46、__autoload()魔术函数作用?
使用这个魔术方法的基本条件是:类文件的文件名要和类的名字保持一致
这个魔术方法的作用是当我们实例化一个类的时候,如果没有引入该文件,则就会自动的执行这个魔术函数,这个函数就会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后,就自动的include或者require来加载这个类,然后程序继续执行,若果这个路径下该文件不存在时,就提示错误。
好处是:使用这个魔术方法可以不必加载多个文件
47、__call()魔术方法的作用是:当我们调用一个不存在的成员方法的时候,php会先自动的调用这个魔术方法来进行执行。
有两个参数:第一个表示的是这个不存在方法名,第二个是这个方法的所有的参数,一般是一个数组
但是我个人认为__call()魔术方法的作用在于调试,更多的是定位到错误,同时捕捉到异常,当一个方法不存在 的时候,我们会优先调用这个魔术方法
48、那些函式可以用来在正在执行的脚本中插入函式库?
答:有:include() include_once() require() require_once() com_load() donet_load()
函式库也包括 com物件和.net 函式库
49、http协议中的post和get有何区别?
GET用于获取信息,不应该用于修改信息,POST可用于更新修改信息。
GET可传输数据大小和URL有关,而POST没有限定大小,大小和服务器配置有关。
GET放在URL中,因此不安全,而POST传输数据对于用户来说是不可见的,所以相对安全。
在ajax: post不被缓存,get被缓存所以一般在请求结尾加Math.random();
SERVER端接受:因为在submit提交的时候是按不同方式进行编码的,所以服务端在接受的时候会按照不同的方式进行接受!
编码方式:如果传递数据是非-ASCII,那么GET一般是不适应的,所以在传递的时候会做编码处理!
50、js中网页前进和后退的代码
前进: history.forward();=history.go(1); 后退: history.back();=history.go(-1);
51、window(A)中用window.open打开了window(B),如何从窗口B调用窗口A中的内容?A、B仅仅是窗口的代号,不是窗口名字
window.opener.document.getElementById()
52、了解ajax吗?用过吗?……
- var xmlhttp = new XMLHttpRequest();
- var xmlhttp = new ActiveXObject(“Microsoft.XMLHttp”);
- xmlhttp.open(‘get’,url,true);
- xmlhttp.onreadystatechang=function(){
- if(xmlhttp.readyState ==4){
- if(xmlhttp.status==200){alert(xmlhttp.responseText);xmlhttp=null;}
- }
- }
- xmlhttp.send(null);
- Ajax.open(“POST”,url,true);
- //如果是POST方式提交数据,下两行必不可少
- Ajax.setrequestheader(“content-length”,sendData.length);
- Ajax.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);
- Ajax.send(sendData);//要POST的数据
53、写出 访问 http://www.sina.com.cn 所需的报文头。
可以用get_heards(http://www.sina.com.cn)查看
54、 echo count(“abc”); 输出什么?
答案:1
55、用PHP代码写出显示客户端IP与服务器IP的代码。
答案:客户端 getenv(‘REMOTE_ADDR’);
服务器端 getenv(‘SERVER_ADDR’);// gethostbyname(“www.phpmst.com”);
56、error_reporting(2047)什么作用?
答案:相当于 error_reporting(‘E_ALL’); 输出所有的错误。
57、如何实现PHP、JSP交互?
答案: 题目有点含糊不清,SOAP,XML_RPC,Socket function,CURL都可以实现这些,如果是考PHP和Java的整合,PHP内置了这种机制(如果考PHP和.NET的整合,也可以这么回答), 例如$foo = new Java(‘java.lang.System’);
58、打开php.ini中的Safe_mode,会影响哪些参数?至少说出6个。
答案:此模块打开时,php将检查当前脚本的拥有者是否和被操作文件的拥有者相同,因此,将影响文件操作类函数,程序执行函数(program Execution Functions)。这些函数有.pathinfo,basename,fopen,system,exec,proc_open 等函数;
59、请写一个函数验证电子邮件的格式是否正确(要求使用正则)。
- function checkEmail($mail){
- $reg = ‘/^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$/’;
- $rst = preg_match($reg , $mail);
- if($rst){
- return TRUE;
- }else {
- return FALSE;
- } }
60、写个函数用来对二维数组排序。
答案:array_multisort() 。
61、优化MYSQL数据库的方法。
答案:(1).数据库设计方面,这是DBA和Architect的责任,设计结构良好的数据库,必要的时候,去正规化(英文是这个:denormalize,中文翻译成啥我不知道),允许部分数据冗余,避免JOIN操作,以提高查询效率。
(2).系统架构设计方面,表散列,把海量数据散列到几个不同的表里面.快慢表,快表只留最新数据,慢表是历史存档.集群,主服务器Read & write,从服务器read only,或者N台服务器,各机器互为Master。
(3).(1)和(2)超越PHP programmer的要求了,会更好,不会没关系.检查有没有少加索引。
(4).写高效的SQL语句,看看有没有写低效的SQL语句,比如生成笛卡尔积的全连接啊,大量的Group By和order by,没有limit等等.必要的时候,把数据库逻辑封装到DBMS端的存储过程里面.缓存查询结果,explain每一个sql语句。
(5).所得皆必须,只从数据库取必需的数据,比如查询某篇文章的评论数,select count(*) … where article_id = ? 就可以了,不要先select * … where article_id = ?然后msql_num_rows. 只传送必须的SQL语句,比如修改文章的时候,如果用户只修改了标题,那就… set title = ? where article_id = ?不要set content = ?(大文本)。
(6).必要的时候用不同的存储引擎,比如InnoDB可以减少死锁,HEAp可以提高一个数量级的查询速度。
62、写5个不同的自己的函数,来截取一个全路径的文件的扩展名,允许封装php库中已有的函数。
- /*
- 写 5 个不同的自己的函数,来获取一个全路径的文件的扩展名,允许封装 php 库中已有的函数。(新浪)
- */
- // 方法一
- function ext_name1($path){
- $path_info = strrchr($path, '.');//.php
- return ltrim($path_info,'.');
- }
- // 方法二
- function ext_name2($path){
- $path_info = substr($path,strrpos($path, '.'));
- return ltrim($path_info,'.');
- }
- // 方法三
- function ext_name3($path){
- $path_info = pathinfo($path);
- return $path_info['extension'];
- }
- // 方法四
- function ext_name4($path){
- $arr = explode('.', $path);
- return $arr[count($arr)-1];
- }
- // 方法五
- function ext_name5($path){
- $pattern = '/^[^\.]+\.([\w]+)$/';
- return preg_replace($pattern, '${1}', basename($path));
- }
- // 实例
- $path = str_replace('\\', '/', __FILE__);
- echo "$path<br />";
- echo ext_name1($path);echo "<br />";
- echo ext_name2($path);echo "<br />";
- echo ext_name3($path);echo "<br />";
- echo ext_name4($path);echo "<br />";
- echo ext_name5($path);echo "<br />";
63、一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停 的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号
- <?php
- /**
- * [猴子选大王]
- * @param [type] $m [猴子数]
- * @param [type] $n [出局次数]
- * @return [type] [description]
- */
- //echo "1";
- function monkey($m,$n){
- //定义一个数组
- for($i=1;$i<$m+1;$i++){
- $arr[]=$i;
- }
- //数组里的任意一个数
- // $arr=rand(1,10);
- //$arr=array(1,2,3,4,5,6,7,8,9);
- //设置数组指针
- $i=0;
- //循环数组,判断猴子次数
- while(count($arr)>1){
- if(($i+1)%$n==0){
- unset($arr[$i]);//把第m只猴子踢出去
- }else{
- array_push($arr,$arr[$i]);//把第m只猴子放在最后面
- unset($arr[$i]);//删除
- }
- $i++;
- }
- return $arr[$i];//返回结果
- }
- //var_dump((monkey(6,4)));//测试,输出编号
- echo "猴子大王的编号是".intval((monkey(6,8)));
- ?>
64、请写出PHP5权限控制修饰符。
答案:private protected public。
65、对于大流量的网站,您采用什么样的方法来解决访问量问题?
答案:首先,确认服务器硬件是否足够支持当前的流量。
其次,优化数据库访问。
第三,禁止外部的盗链。
第四,控制大文件的下载。
第五,使用不同主机分流主要流量 第六,使用流量分析统计软件。
66、在HTTP 1.0中,状态码 401 的含义是?;如果返回"找不到文件"的提示,则可用 header 函数, 其语句是?
答案:401的含义是未授权。
header(“HTTp/1.0 404 Not Found”);———找不到文件
header(“HTTp/1.1 403 Forbidden”);———不允许访问
67、以Apache模块的方式安装PHP,在文件http.conf中首先要怎样动态装载PHP模块,然后再用什么语句使得Apache把所有扩展名为php的文件都作为PHP脚本处理。
答案:动态装载PHP模块:LoadModule php5_module "c:/php/php5apache2.dll"
把所有扩展名为php的文件都作为pHp脚本处理: AddType application/x-httpd-php-source .phps AddType application/x-httpd-php .php .php5 .php4 .php3 .phtml
68、类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是?
答案:serialize() /unserialize()。
69、一个函数的参数不能是对变量的引用,除非在php.ini中把什么模块设为on。
答案:allow_call_time_pass_reference。
70、PHP的写时复制机制(Copy-On-Write)
例如这种形式
$a = 1; b = $a; //当把a赋值给b时,在内存中a,b其实是指向同一块内存 $b = 2; //只有当b值发生变化,才会内存复制赋新值
写时复制优点:是通过赋值的方式赋值给变量时不会申请新内存来存放新变量所保存的值,而是简单的通过一个计数器来共用内存,只有在其中的一个引用指向变量的值发生变化时才申请新空间来保存值内容以减少对内存的占用。
从PHP底层基础数据结构来看
ref_count和is_ref是定义于zval结构体中
is_ref标识是不是用户使用 & 的强制引用;
ref_count是引用计数,用于标识此zval被多少个变量引用,即写时复制的自动引用,为0时会被销毁
71、nginx等高可用实现
使用双机通过 Keepalived 工具来实现 Nginx 的高可用(High Avaiability),达到一台Nginx入口服务器宕机,另一台备机自动接管服务的效果。
参考链接:https://segmentfault.com/a/1190000002881132
72、常见排序算法
一般冒泡,选择,插入,快速
代码参考:http://www.php100.com/html/dujia/2015/0210/8604.html
需要注意的是选择,快速都是不稳定排序(对于同样数值排序后顺序会发生变化的为不稳定排序),然后需要注意快速的时间复杂度为O(nlog2 n) 其他为O(n?)
73、一致性hash
简介:http://blog.csdn.net/cywosp/article/details/23397179
代码实现:http://my.oschina.net/wangdk/blog/133040
这里我想说的在cache场景时使用一致性hash最大的好处在于当某机宕机或者增加机器时候key的迁移成本是最低,涉及的数据量是最少。大家可以通过普通hash和一致性hash下同等变动机器量来对比下原key命中率的方式来判断迁移成本。
74、系统容错能力
主要集中在重试机制,高可用,超时配置,服务降级,动态健康检查剔除机制等,
具体可参考:http://www.infoq.com/cn/articles/qq-web-system-practise
75、限流防刷
这里只想说下比较前置的也就是在Nginx层来做这些策略,通常我们可以通过一些第三方模块来实现,这里只想说下 OpenResty,OpenResty 是一个基于 Nginx与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
官网:http://openresty.org/cn/
一些场景使用:http://jinnianshilongnian.iteye.com/blog/2280928
更多玩法:http://drops.wooyun.org/tips/6403
最佳实践:https://www.gitbook.com/book/moonbingbing/openresty-best-practices/details
76、SSO(Cookie,Session的区别)
SSO就是我们说的单点登录,说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其 他所有系统的信任。然后这边早期我们是将信任关系会完全放在客户端,会通过对种下Cookie的解密获取登录信息,然后相对安全的方式是将信任关系置于服 务端,客户端通过携带的token,sessionId等方式向服务端请求验证合法性。
具体可参考:http://blog.jobbole.com/92339/
77、秒杀抢购等
对于秒杀类主要还是一个流量的限制,是一个漏斗模型,从Nginx开始的结合日志分析的动态限流防刷策略到真正秒杀时的占位排队,到虚库存耗尽时后 将所有超出流量直接前置给纯静态页面的策略,其实都是层层控流的过程,实际到mysql或者redis等持久化库存数据时候的量已经非常可控。
更多可以参考:http://www.csdn.net/article/2014-11-28/2822858
一些优化策略:http://chuansong.me/n/1334017
78、用PHP打印出前一天的时间,打印格式是2007年5月10日 22:21:21
echo date('Y-m-d H:i:s', strtotime('-1 day'));
79、PHP代码如下:
- $a="hello";
- $b=&$a;
- unset($b);
- $b="world";
- echo $a;
其结果是? hello
- $str="cd";
- $$str="landog";
- $$str.="ok";
- echo $cd;
其结果是?landogok
80、用PHP写一段代码,实现不使用第3个变量,交换$a、$b的值,$a、$b的初始值自己定。
- $a = "abcd";
- $b = "1234";
- echo "初始化时 a=$a,b=$b<br>";
- $a = $a . $b;
- $b = strlen( $b );
- $b = substr( $a, 0, (strlen($a) - $b ) );
- $a = substr( $a, strlen($b) );
- echo "交换后 a=$a,b=$b<br>";
81、根据题目要求,用PHP写出代码。
表名User ID Name Tel Content Date 1 张三 13333663366 大专毕业 2006-10-11 3 张三 13612312331 本科毕业 2006-10-15 5 张四 020-5566556 中专毕业 2006-10-15 4 王五 13521212125 大专毕业 2006-12-25 2 ………… 6 …………
假设数据库连接如下:
$mysql_db=mysql_connect("local","root","pass");
@mysql_select_db("DB",$mysql_db);
(1)查询出所有Name等于“张三”的记录,并输出。
$sql = “select * from User where > $result = mysql_query( $sql ); while( $row = mysql_fetch_array( $result, MYSQL_ASSOC ) ){ echo $row[‘Name’]; }
(2)按ID升序查询,只返回排序后的前3条记录,并输出。
$sql = “select * from User order by ID asc limit 0,3”; $result = mysql_query( $sql ); while( $row = mysql_fetch_array( $result, MYSQL_ASSOC ) ){ echo $row[‘Name’]; }
82、javascript能否定义二维数组,如果不能你如何解决?
javascript不支持二维数组定义,可以用arr[0] = new array()来解决
83、假设a.html和b.html在同一个文件夹下面,用javascript实现当打开a.html五秒钟后,自动跳转到b.html。
- <script>
- function go2b(){
- window.location = "b.html";
- window.close();
- }
- setTimeout( "go2b()",5000 ); //5秒钟后自动执行go2b()
- </script>
84、有两个文件a.html和a.php,代码如下:
a.html
- <html>
- <head>
- <meta http-equiv=Content-Type content=text/html;charset=utf-8>
- <title>PHP程序员面试</title>
- </head>
- <body>
- <center>
- <form method="post" action="a.php">
- <table border="1">
- <tr>
- <td align="right">姓名:</td>
- <td align="left"><input type="text" ></td>
- </tr>
- <tr>
- <td align="right">电话:</td>
- <td align="left"><input type="text" ></td>
- </tr>
- <tr>
- <td align="right">邮箱:</td>
- <td align="left"><input type="text" ></td>
- </tr>
- <tr>
- <td align="right">地址:</td>
- <td align="left"><input type="text" ></td>
- </tr>
- <tr>
- <td align="center" colspan="2">
- <input type="submit" value="提交">
- <input type="reset" value="重填">
- </td>
- </tr>
- </table>
- </form>
- </center>
- </body>
- </html>
a. php
- <?php
- $user_name = $_GET['user_name'];
- $user_tel = $_GET['user_tel'];
- $user_email = $_GET['user_email'];
- $user_add = $_GET['user_add'];
- echo "用户名:$user_name<br>电话:$user_tel<br>邮箱:$user_email<br>地址:$user_add<br>";
- ?>
(1)请画出a.html在浏览器的显示效果图。
(2)在a.html中输入:用户名=张三,电话=020-38259977,邮箱=sunrising@srtek.cn,地址=广州升瑞,按提交按钮后输出结果是?
输出结果应为:
姓名:
电话:
邮箱:
地址:
因为表单是用post方式提交,但在a.php中却用get方式来读取,所以不会读到任何值。
85、利用CSS样式表定义已访问的超链接字体大小为14pt,颜色为red。
- a:visited { font-size: 14pt; color: red; }
86、移动任意一位数或符号,使等式成立, 102 = 101-1。注:是移动不是交换,等号不能分开。
把102的2向上移,变成10的平方。101-1=10的2次方
87、规律题,3、1、4、1、5、9、2、( ), 请按照规律在括号内写出下一表达式。
答案为6,因为∏=3.1415926
88、规律题,5、8、-3、5、-2、3、-1、( ),请按照规律在括号内写出下一表达式。
答案为2,规律为n=(n-2) – |(n-1)| ,n>=3
89、写一个函数,尽可能高效的,从一个标准url里取出文件的扩展名例如: http://www.sina.com.cn/abc/de/fg.php?id=1&a=c&t=12需要取出php或.php
- //写一个函数,尽可能高效的,从一个标准url里取出文件的扩展名,
- //例如:http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出php或.php(新浪)
- $url='http://www.sina.com.cn/abc/de/fg.php?id=1&a=c&t=12';
- echo getExt($url);
- echo "<br/>";
- function getExt($url){
- $arr=parse_url($url);
- //方法一、
- /*$name=basename($arr['path']);
- $extArr=explode('.',$name);
- return $extArr[1];*/
- //方法二、
- /*$path=$arr['path'];
- $str=strrchr($path,'.');
- return $str;*/
- //方法三、
- $pathArr=pathinfo($url);
- //show_dump($pathArr);
- $str = $pathArr['extension'];
- list($type, $vars) = explode('?',$str);
- return $type;
- }
90、描述一下大流量高并发量网站的解决方案
答: 1、确认服务器硬件是否足够支持当前的流量。
2、使用memcache缓存技术,将动态数据缓存到内存中,动态网页直接调用这些文件,而不必在访问数据库。
3、禁止外部的盗链。
4、外部网站的图片或者文件盗链往往会带来大量的负载压力,因此应该严格限制外部对自身图片或者文件盗链,目前可以简单的通过refer来控制盗 链,apache自己就可以通过配置来禁止盗链。
5、控制大文件的下载。 大文件的下载会占用很大的流量,对于非SCSI硬盘来说会消耗,使得网站响应能力下降。
6、使用不同的主机分流主要流量
7、使用流量统计软件。 在网站上安装一个流量统计软件,可以即时知道哪些地方耗费了大量流量,哪些页面需要再进行优化。
8、分库分表。
9、Sphinx全文索引引擎。
91、如何设计或配置Mysql,才能达到高效使用的目的。
答:1、数据库设计方面,设计结构良好的数据库,允许部分数据冗余。 选取最适用的字段属性,尽可能把字段设置为NOTNULL,这样在查询的时候,数据库不用去比较NULL值。
2、系统架构设计方面,表散列,把海量数据散列到几个不同的表里面,集群,数据库查询和写入分开。 写高效sql语句,以提高效率。使用连接(join)来代替子查询使用联合(union)来代替手动创建的临时表所得皆必须,只从数据库取必须的数据。必 要的时候用不同的存储引擎,比如Innodb可以减少死锁,HEAP可以提高一个数量级的查询速度。
使用事务使用外键使用索引
92.如何进行防SQL注 入?
答:1、过滤掉一些常见的数据库操作关键字:select,insert,update,delete,and,*等或者通过系统函 数:addslashes(需要被过滤的内容)来进行过滤。
2、在PHP配置文件中Register_globals=off;设置为关闭状态 //作用将注册全局变量关闭。
比如:接收POST表单的值使用$_POST['user'],如果将register_globals=on;直接使 用$user可以接收表单的值。
3、SQL语句书写的时候尽量不要省略小引号(tab键上面那个)和单引号
4、提高数据库命名技巧,对于一些重要的字段根据程序的特点命名,取不易被猜到的
5、对于常用的方法加以封装,避免直接暴漏SQL语句
6、开启PHP安全模式Safe_mode=on;
7、打开magic_quotes_gpc来防止SQL注入 Magic_quotes_gpc=off;默认是关闭的,它打开后将自动把用户提交的sql语句的查询进行转换,把'转为\',这对防止sql注入有重 大作用。因此开启:magic_quotes_gpc=on;
8、控制错误信息关闭错误提示信息,将错误信息写到系统日志。
9、使用mysqli或pdo预处理。
93、用PHP写出一个安全的用户登录系统需要注意哪些方面。
答:1、密码要使用MD5(密码+字符串)进行加 密。
2、登录表单的名称不要跟数据库字段一样,以免暴漏表字段。
3、用户表的表名、字段名、密码尽量用不容易被猜到的。
4、要使用验证码验证登陆,以防止暴力破解。
5、验证提交的数据是不是来自本网站。
6、登录后台处理代码数据库部分使用预处理,做好过滤,防止sql注入。
或者回答:
1·验证码
2·U盾
3·动态口令卡
4·限制登录次数
5·使用数字键盘
6·密码不能粘贴
7·网址使用ssl,服务器证书https
8·注册验证必须要使用php验证
9·以post提交给后端php程序
94、使用过哪些PHP框架。试描述其优劣点。
答:BroPHP框架:优点:轻量级学习型框架,配置简单,操作简单,容易上手,提供了比较全面的文档。
Thinkphp框架:
ThinkPHP(FCS)是一个轻量级的中型框架,是从Java的Struts结构移植过来的中文PHP开发框架。它使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,各方面都比较人性化,熟悉J2EE的开发人员相对比较容易上手,适合php框架初学者。 ThinkPHP的宗旨是简化开发、提高效率、易于扩展,其在对数据库的支持方面已经包括MySQL、MSSQL、Sqlite、PgSQL、 Oracle,以及PDO的支持。ThinkPHP有着丰富的文档和示例,框架的兼容性较强,但是其功能有限,因此更适合用于中小项目的开发。
优点:
1.易于上手,有丰富的中文文档;
2.框架的兼容性较强,PHP4和PHP5完全兼容、完全支持UTF8等。
3. 适合用于中小项目的开发
缺点
1.对Ajax的支持不是很好;
2.目录结构混乱,需要花时间整理;
3.上手容易,但是深入学习较难。
Yii 框架::
Yii 是一个基于组件的高性能php框架,用于开发大型Web应用。Yii采用严格的OOP编写,并有着完善的库引用以及全面的教程。从 MVC,DAO/ActiveRecord,widgets,caching,等级式RBAC,Web服务,到主题化,I18N和L10N,Yii提供了 今日Web 2.0应用开发所需要的几乎一切功能。事实上,Yii是最有效率的PHP框架之一。
优点
1·纯OOP
2·用于大规模Web应用
3·模型使用方便
4·开发速度快,运行速度也快。性能优异且功能丰富
5·使用命令行工具。
缺点:
1·对Model层的指导和考虑较少
2·文档实例较少
3·英文太多
4·要求PHP技术精通,OOP编程要熟练!
5·View并不是理想view,理想中的view可能只是html代码,不会涉及PHP代码。
Lavarel 框架::
优点
Laravel 的设计思想是很先进的,非常适合应用各种开发模式TDD, DDD 和BDD,作为一个框架,它准备好了一切,composer 是个php 的未来,没有composer,PHP 肯定要走向没落。laravel 最大的特点和优秀之处就是集合了php 比较新的特性,以及各种各样的设计模式,Ioc 容器,依赖注入等。
缺点
基于组件式的框架,所以比较臃肿
CodeIgniter 框架::
优点:
推崇“简单就是美”这一原则。没有花哨的设计模式、没有华丽的对象结构,一切都是那么简单。几行代码就能开始运行,再加几行代码就可以进行输出。可谓是“大道至简”的典范。 配置简单,全部的配置使用PHP脚本来配置,执行效率高;具有基本的路由功能,能够进行一定程度的路 由;具有初步的Layout功能,能够制作一定程度的界面外观;数据库层封装的不错,具有基本的MVC功能. 快速简洁,代码不多,执行性能高,框架简单,容易上手,学习成本低,文档详细;自带了很多简单好用的library,框架适合小型应用.
缺点:
本身的实现不太理想。内部结构过于混乱,虽然简单易用,但缺乏扩展能力。 把Model层简单的理解为数据库操作. 框架略显简单,只能够满足小型应用,略微不太能够满足中型应用需要.
评价:
总体来说,拿CodeIgniter来完成简单快速的应用还是值得,同时能够构造一定程度的layout,便于模板的复用,数据操作层来说封装的不 错,并且CodeIgniter没有使用很多太复杂的设计模式,执行性能和代码可读性上都不错。至于附加的library 也还不错,简洁高效。
95、用过哪些版本控制工具?
svn subversion 版本控制
github 版本控制
96、输出为Mozilla/4.0(compatible;MSIE5.01;Window NT 5.0)时,可能的输出语句是:B
A.$_SERVER['HTTP_USER_AGENT_TYPE'];
B. $_SERVER['HTTP_USER_AGENT'];
C. $_SERVER['USER_AGENT'];
D. $_SERVER['AGENT'];
97、下面功能PHP无法实现的是:D
A. 服务器端脚本运行
B. 命令行脚本运行
C. 客户端图形界面(GUI)程序
D. 浏览器端执行DOM操作
98、下面说法不正确的是:C
A. PHP有四种标量类型:布尔型(boolean),整型(integer),浮点型(float),字符串(string)
B. 浮点型(float)与双精度型(double)是同一种类型
C. 符合类型包括:数组(array),对象(object),资源(resource)
D. 伪类型:混合型(mixed),数字型(number),回调(callback)
99、下面不是PHP语法的组成部分的函数是:AD
A. array B. eval C. each D. list
100、执行下面的代码的结果是什么?A
A. boolean
B. boolean0
C. booleanFALSE
D. booleanfalse
101、SESSION与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?
答:1、http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的 页面不能看做是同一个用户。
2、SESSION保存在服务器端,COOKIE保存在客户端,SESSION依赖COOKIE进行传输,如果COOKIE被 禁用了,SESSION将不能继续使用。
102、HTTP状态中302、403、 500代码含义?
答:300重定向、403服务器拒绝访问、500服务器内部错误。
103、Linux 下建立压缩包,解压缩包的命令。
答:1、压缩:gzip 、tar -cvfz、zip、bzip22、
解压:gunzip、tar -zxvf、unzip、bunzip2
$a=3;$b=4; if($a||$b=5){ ||或和|的区别 echo 'todo'; } $b的值是(a):
A a. 4; b. 5; c. 3; d. false
104、什么是面向对象?主要特征是什么?
答:1、面向对象是程序的一种设计方式,它利于提高程序的重用性,是程序结构更加清晰。
2、主要特征:封装、继承、多态。
评论