PHP软件工程师的面试题
1. 基本知识点
HTTP协议中几个状态码的含义:503 500 401 200 301 302。。。
答案:200——交易成功
301——删除请求数据
302——在其他地址发现了请求数据
401——请求授权失败
500——服务器产生内部错误
503——服务器过载或暂停维修
Include require include_once require_once 的区别.
答案:
require和include之间有两点重要的区别。
(1)无论require的位置如何,制定文件都将包含到出现require的脚本中。例如,即使require放在计算结果为假的if语句中,依然会包含指定文件。
(2)require出错时,脚本将停止运行,而在使用include的情况下,脚本将继续执行。
include_once、require_once的作用分别与include、require相同。
不同点是会首先验证是否已经包含了该文件,如果已经包含,则不再执行include_once;否则,包含该文件。
PHP/Mysql中几个版本的进化史,比如mysql4.0到4.1,PHP 4.x到5.1的重大改进等等。
暂无答案。
HEREDOC介绍
答案:
1.以<<<End开始标记开始,以End结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号 。开始标记和开始标记相同,比如常用大写的EOT、EOD、EOF来表示,但是不只限于那几个,只要保证开始标记和结束标记不在正文中出现即可(出现在注释里面也不行)。
2.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以(会被当作普通字符串)。在heredoc中,变量不需要用连接符.或,来拼接,
3.heredoc常用在输出包含大量HTML语法的文档的时候。
补充同nowdoc的区别:
简单来说:
1、heredoc是动态的 nowdoc是静态的
2、heredoc类似多行的双引号 newdoc类似多行的单引号
3、heredoc是一种专门处理大段字符串的通用处理方案,而nowdoc是php为了弥补动态实现“heredoc”的效率问题而实现的“高效率”的静态版本
heredoc是从PHP4.0开始引进的,而nowdoc语法则需要5.3版本
写出一些php魔幻方法;
答案:
__construct()_destruct()、__get()、__set()、__call()、__sleep()、__wakeup()、__clone()、__toString()
一些编译php时的configure参数
答案:
–prefix=/usr/local/php php安装目录
–with-config-file-path=/usr/local/php/etc指定php.ini位置
–with-mysql=/usr/local/mysqlmysql安装目录,对mysql的支持
–with-mysqli=/usr/local/mysql/bin/mysql_configmysqli文件目录,优化支持
–enable-safe-mode 打开安全模式
–enable-ftp 打开ftp的支持
–enable-zip 打开对zip的支持
–with-bz2 打开对bz2文件的支持
–with-jpeg-dir 打开对jpeg图片的支持
–with-png-dir 打开对png图片的支持
–with-freetype-dir 打开对freetype字体库的支持
–without-iconv关闭iconv函数,种字符集间的转换
–with-libxml-dir 打开libxml2库的支持
–with-xmlrpc 打开xml-rpc的c语言
–with-zlib-dir 打开zlib库的支持
–with-gd 打开gd库的支持
向php传入参数的两种方法。
答案:方法一 使用$argc $argv
方法二 使用getopt函数()
方法三 提示用户输入,然后获取输入的参数。有点像C语言
(mysql)请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别;
答案:略
error_reporting 等调试函数使用
答案:php 的配置函数就是几个ini_*的函数,主要是针对配置文件的操作,其实就四个函数:ini_get、ini_set、ini_get_all、ini_restore。个人感觉最有用的就是ini_set和ini_get。
您是否用过版本控制软件? 如果有您用的版本控制软件的名字是?
答案:svn
posix和perl标准的正则表达式区别;
答案:OSIX兼容正则没有定界符,函数的相应参数会被认为是正则。
PERL兼容正则可以使用任何不是字母、数字或反斜线(\)的字符作为定界符,如果作为定界符的字符必须被用在表达式本身中,则需要用反斜线转义。也可以使用(),{},[] 和 <> 作为定界符
POSIX兼容正则没有修正符。
PERL兼容正则中可能使用的修正符(修正符中的空格和换行被忽略,其它字符会导致错误)
Safe_mode 打开后哪些地方受限. 答案:system,passthru,exec,shell_exec,popen,phpinfo等等大部分的文件操作函数。 因为Safe_mode是php非常重要的内嵌的安全机制。默认是关闭的
如果 PHP 打开了save model,system() 和其它程序执行函数将拒绝启动不在此目录中的程序。必须使用 / 作为目录分隔符,包括 Windows 中 safe_mode_allowed_env_varsstring
被安全模式限制或屏蔽的函数
函数名 限制
dbmopen() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
dbase_open() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
filepro() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
filepro_rowcount() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
filepro_retrieve() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
ifx_* sql_safe_mode 限制, (!= safe mode)
ingres_* sql_safe_mode 限制, (!= safe mode)
mysql_* sql_safe_mode 限制, (!= safe mode)
pg_loimport() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
posix_mkfifo() 检查被操作的目录是否与被执行的脚本有相同的UID(所有者)。
putenv() 遵循 ini 设置的safe_mode_protected_env_vars 和safe_mode_allowed_env_vars 选项。请参考 putenv() 函数的有关文档。
move_uploaded_file() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
chdir() 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
dl() 当 PHP 运行在 安全模式 时,不能使用此函数。
backtick operator 当 PHP 运行在 安全模式 时,不能使用此函数。
shell_exec()(在功能上和 backticks 函数相同)当 PHP 运行在 安全模式 时,不能使用此函数。
exec() 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。
system() 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。
passthru() 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。
popen() 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。
fopen() 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
mkdir() 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
rmdir() 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
rename() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
unlink() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
copy() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。 (onsource and target)
chgrp() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
chown() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。
chmod() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。另外,不能设置 SUID、SGID 和 sticky bits
touch() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。
symlink() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。 (注意:仅测试 target)
link() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。 (注意:仅测试 target)
apache_request_headers() 在安全模式下,以“authorization”(区分大小写)开头的标头将不会被返回。
header() 在安全模式下,如果设置了 WWW-Authenticate,当前脚本的 uid 将被添加到该标头的 realm 部分。
PHP_AUTH 变量 在安全模式下,变量 PHP_AUTH_USER、PHP_AUTH_PW 和 PHP_AUTH_TYPE 在 $_SERVER 中不可用。但无论如何,您仍然可以使用 REMOTE_USER 来获取用户名称(USER)。(注意:仅 PHP 4.3.0 以后有效)
highlight_file(), show_source() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。(注意,仅在 4.2.1 版本后有效)
parse_ini_file() 检查被操作的文件或目录是否与被执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与被执行的脚本有相同的 UID(所有者)。(注意,仅在 4.2.1 版本后有效)
set_time_limit() 在安全模式下不起作用。
max_execution_time 在安全模式下不起作用。
mail() 在安全模式下,第五个参数被屏蔽。(注意,仅自 PHP 4.2.3 起受影响)
写代码来解决多进程/线程同时读写一个文件的问题。
参考答案:
<?php
$fp = fopen("/tmp/lock.txt","w+");
if (flock($fp, LOCK_EX)) { // 进行排它型锁定
fwrite($fp, "Writesomething here\n");
flock($fp, LOCK_UN); //释放锁定
} else {
echo "Couldn'tlock the file !";
}
fclose($fp);
?>
写一段上传文件的代码。
参考答案:
$uploaddir.="uploadfiles/".date("Y")."/".date("m")."/".date("d")."";
if (!is_dir($uploaddir))
{
if (!mkdir($uploaddir,0777,TRUE) || !chmod($uploaddir, 0777))
{
exit("创建上传目录失败");
}
}
if($_FILES["filename"])
{
$filename =addslashes($_FILES['filename']["name"]);//客户端文件名
$arrTemp =explode(".",$filename);//取后缀
$filename_sever =date("his").rand(100,999);
$filename_sever .=".".$arrTemp[count($arrTemp)-1];
if(move_uploaded_file($_FILES['s_photo']['tmp_name'],$uploaddir."/".$filename_sever)){
}else{
exit("上传失败");
}
}
Mysql 的存储引擎,myisam和innodb的区别。
参考答案:
1、两者在文件构成上有区别;
2、InnoDB支持事务处理,MyISAM不支持;
3、对无WHERE子句的COUNT(*)操作的不同:MyISAM中保存了该值,直接读取,InnoDB需要作全表扫描;
4、锁的区别:InnoDB支持表级锁和行级锁,MyISAM只支持表级锁;
2. web 架构,安全,项目经验
介绍xdebug,apc,eAccelerator,Xcache,Zendopt的使用经验。
使用mod_rewrite,在服务器上没有/archivers/567.html这个物理文件时,重定向到index.php?id=567,请先打开mod_rewrite.
MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
写出一种排序算法(原理),并说出优化它的方法。
请简单阐述您最得意的开发之作
对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题
参考:
数据库延迟插入。性能有改善但是可能还是无法应付高并发
浏览数据写入缓存,统一更新。统计数据比较滞后,还要运行一个负责更新的消息队列
分析系统Log。需要有服务器的配置权限,与系统整合工作量比较大。
您是否用过模板引擎? 如果有您用的模板引擎的名字是?
请介绍Session的原理,大型网站中Session方面应注意什么?
测试php性能和mysql数据库性能的工具,和找出瓶颈的方法。
参考:
三个MySQL性能测试工具:The MySQL Benchmark Suite、MySQL super-smack、MyBench。除了第一个为MySQL性能测试工具,其他两个都为压力测试工具。
xhprof 是facebook开源出来的一个php性能测试工具,也可以称之为profile工具xdebug
正则提出一个网页中的所有链接.
参考:
<?
if(isset($url)){
echo "$url 有下列裢接:<br>";
$fcontents = file($url);
while(list(,$line)=each($fcontents)){
while(eregi('(href[[:space:]]*=[[:space:]]*"?[[:alnum:]:@/._-]+"?)(.*)',$line,$regs)){
$regs[1] =eregi_replace('(href[[:space:]]*=[[:space:]]*"?)([[:alnum:]:@/._-]+)("?)',"\\2",$regs[1]);
echo" $regs[1]<br>";
$line = $regs[2];
}
}
}
?>
介绍一下常见的SSO(单点登陆)方案(比如dedecms整合discuz的passport)的原理。
您写过的PHP框架的特点,主要解决什么问题,与其他框架的不同点。
大型的论坛/新闻文章系统/SNS网站在性能优化上有什么区别?
相册类应用:要求在浏览器中能同时选中并上传多个文件,图片要求能剪裁,压缩包在服务器端解压。能上传单个达50M的文件。上传过程中有进度条显示。每个图片能生成四种大小缩略图,视频文件要转成flv供flash播放。叙述要涉及的各类开源软件和简单用途。
一 群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…, 如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。用程序模拟该过程。
3. unix/linux 基本使用
linux下查看当前系统负载信息的一些方法。
参考:
uptime
vim的基本快捷键。
ssh 安全增强方法;密码方式和rsa key 方式的配置。
rpm/apt/yum/ports 装包,查询,删除的基本命令。
Makefile的基本格式,gcc 编译,连接的命令,-O0 和-O3区别。
gdb,strace,valgrind的基本使用.
4. 前端,HTML,JS
css盒模型。
javascript中的prototype。
javascript中this对象的作用域。
IE和firefox事件冒泡的不同。
什么是怪异模式、标准模式,近标准模式?
DTD的定义
IE/firefox常用hack.
firefox,IE下的前端js/css调试工具。
参考: FireFox浏览器上面的FireBug的工具
IE 调试工具IETester+DebugBar