1. 基本知识点
503:请求超时 500:内部服务错误,一般是php程序错误导致401:未受权访问
* Include require include_once require_once的区别.
include与require区别:
include包含文件可以return返回值,require不能 ;
require不能在控制结构中根据条件的不同而包含不同的文件。require()语句只会在第一次执行时调用它所包含的文件中的内容替换本身这条语句,当再次被执行时只能执行第一次所包含的语句。但是include()语句可以在循环体中来包含不同的文件,所以php解析器每次遇到include()语句时,对它进行重新处理。
在程序中只要有require,就会被包含,即使你在一个非真的if语句里,所以require一般都放在程序的最头部,
require()语句在PHP程序执行前就会将使用require引用的文件读入,如果requrie包含文件出错,程序会中止,include语句只有在被执行时才会读入要包含的文件,如果include包含文件出错,程序会跳过错误,继续执行
include_once与include(require_once与require) 区别
include_once会检查是否在其它地方导入过,有导入过则不在重复导入,这样可以避免函数或变量重复定义的错误,而include会无限数导入,
require_once同上
* PHP/Mysql中几个版本的进化史,比如mysql4.0到4.1,PHP4.x到5.1的重大改进等等。
mysql4.1 改进了子查询(MyIsam用了R-trees)5.0增加了存诸过程 视图 游标 5.1 有触发器,约束,InnoDB外键等改进
php5主要增强了oo特性,比如构造/析构函数,类中属性和方法的类型(public,private,protected)一些魔术方法(__call,__set,__get等),接口等
* HEREDOC介绍
* 写出一些php魔幻方法;
* 一些编译php时的configure 参数
prefix,with-config-file,with-mysql ,with-myqli,with-gd,with-curl,with-iconv,with-mbstr等
* 向php传入参数的两种方法。
get , post
* (mysql)请写出数据类型(int char varchar datetime text)的意思;请问varchar和char有什么区别;
int:数字型
cahr:固定长度字符串
varchar :可变长度字符串
datetime : 0000-00-00 00:00:00 时间类型
text : 超长字符串,可存2^16-1字节
varchar与char区别:一个固定,一个可变,所以char一般情况下所占空间更大,但查询更快(不需要计算字符串长度)
* error_reporting等调试函数使用
一般在生产环境上设置为:error_reporting(0)用来不显示错误,开发环境设置为:error_reporting(E_ALL)用来显示所有错误
* 您是否用过版本控制软件?如果有您用的版本控制软件的名字是?
用过,subsvn
* posix和perl标准的正则表达式区别;
- 正则表达式(Regular
Expression,缩写为regexp,regex或regxp),又称正规表达式、正规表示式或常规表达式或正规化表示法或正规表示法,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串 。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容 。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的在正则表达式引擎。正则表达式这个概念最初是由 Unix中的工具软件(例如sed和grep)普及开的。(摘自维基百科) -
- PHP同时使用两套正则表达式规则,一套是由电气和电子工程师协会(IEEE)制定的POSIX
Extended 1003.2兼容正则(事实上PHP对此标准的支持并不完善),另一套来自PCRE(Perl Compatible Regular Expression)库提供PERL兼容正则,这是个开放源代码的软件,作者为 Philip Hazel。 -
- 使用POSIX兼容规则的函数有:
- ereg_replace()
- ereg()
- eregi()
- eregi_replace()
- split()
- spliti()
- sql_regcase()
- mb_ereg_match()
- mb_ereg_replace()
- mb_ereg_search_getpos()
- mb_ereg_search_getregs()
- mb_ereg_search_init()
- mb_ereg_search_pos()
- mb_ereg_search_regs()
- mb_ereg_search_setpos()
- mb_ereg_search()
- mb_ereg()
- mb_eregi_replace()
- mb_eregi()
- mb_regex_encoding()
- mb_regex_set_options()
- mb_split()
-
- 使用PERL兼容规则的函数有:
- preg_grep()
- preg_replace_callback()
- preg_match_all()
- preg_match()
- preg_quote()
- preg_split()
- preg_replace()
-
- 定界符:
-
- POSIX兼容正则没有定界符,函数的相应参数会被认为是正则。
-
- PERL兼容正则可以使用任何不是字母、数字或反斜线(\)的字符作为定界符,如果作为定界符的字符必须被用在表达式本身中,则需要用反斜线转义。也可以使用(),{},[]
和 <> 作为定界符 -
- 修正符:
-
- POSIX兼容正则没有修正符。
-
- PERL兼容正则中可能使用的修正符(修正符中的空格和换行被忽略,其它字符会导致错误):
-
- i
(PCRE_CASELESS): - 匹配时忽略大小写。
-
- m(PCRE_MULTILINE):
- 当设定了此修正符,行起始(^)和行结束($)除了匹配整个字符串开头和结束外,还分别匹配其中的换行符(\n)的之后和之前。
-
- s(PCRE_DOTALL):
- 如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。
-
- x(PCRE_EXTENDED):
- 如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略。
-
- e:
- 如果设定了此修正符,preg_replace()
在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。 只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。 -
- A(PCRE_ANCHORED):
- 如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。
-
- D(PCRE_DOLLAR_ENDONLY):
- 如果设定了此修正符,模式中的行结束($)仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,也会被匹配在里面。如果设定了
m 修正符则忽略此选项。 -
- S:
- 当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的
non-anchored 模式有用。 -
- U(PCRE_UNGREEDY):
- 使“?”的默认匹配成为贪婪状态的。
-
- X(PCRE_EXTRA):
- 模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。
-
- u(PCRE_UTF8):
- 模式字符串被当成UTF-8。
-
- 逻辑区隔:
-
- POSIX兼容正则和PERL兼容正则的逻辑区隔符号作用和使用方法完全一致:
- []:包含任选一操作的相关信息。
- {}:包含匹配次数的相关信息。
- ():包含一个逻辑区间的相关信息,可被用来进行引用操作。
- |:表示“或”,[ab]和a|b是等价的。
-
- 元字符与“[]”相关:
-
- 有两组不同的元字符:一种是模式中除了方括号内都能被识别的,还有一种是在方括号“[]”内被识别的。
-
- POSIX兼容正则和PERL兼容正则“[]之外”“一致”的元字符:
- \
有数种用途的通用转义符 - ^
匹配字符串的开头 - $
匹配字符串的结尾 - ?
匹配0或者1 - *
匹配 0 个或多个前面指定类型的字符 - +
匹配 1 个或多个前面指定类型的字符 -
- POSIX兼容正则和PERL兼容正则“[]之外”“不一致”的元字符:
- .
PERL兼容正则匹配除了换行符外的任意一个字符 - .
POSIX兼容正则匹配任意一个字符 -
- POSIX兼容正则和PERL兼容正则“[]之内”“一致”的元字符:
- \
有数种用途的通用转义符 - ^
取反字符,但仅当其为第一个字符时有效 - -
指定字符ASCII范围,仔细研究ASCII码,你会发现[W-c]等价于[WXYZ\\^_`abc] -
- POSIX兼容正则和PERL兼容正则“[]之内”“不一致”的元字符:
- -
POSIX兼容正则中[a-c-e]的指定会抛出错误。 - -
PERL兼容正则中[a-c-e]的指定等价于[a-e]。 -
- 匹配次数与“{}”相关:
-
- POSIX兼容正则和PERL兼容正则在匹配次数方面完全一致:
- {2}:表示匹配前面的字符2次
- {2,}:表示匹配前面的字符2次或多次,默认都是贪婪(尽可能多)的匹配
- {2,4}:表示匹配前面的字符2次或4次
-
- 逻辑区间与“()”相关:
-
- 使用()包含起来的区域是一个逻辑区间,逻辑区间的主要作用是体现出一些字符出现的逻辑次序,另一个用处就是可以用来引用(可以将此区间内的值引用给一个变量)。后一个作用比较奇特:
-
-
- 在引用的时候,括号是可以嵌套的,逻辑次序是按照“(”出现的次序来标定的。
-
- 类型匹配:
-
- POSIX兼容正则:
- [:upper:]:匹配所有的大写字母
- [:lower:]:匹配所有的小写字母
- [:alpha:]:匹配所有的字母
- [:alnum:]:匹配所有的字母和数字
- [:digit:]:匹配所有的数字
- [:xdigit:]:匹配所有的十六进制字符,等价于[0-9A-Fa-f]
- [:punct:]:匹配所有的标点符号,等价于
[.,"'?!;:] - [:blank:]:匹配空格和TAB,等价于[
\t] - [:space:]:匹配所有的空白字符,等价于[
\t\n\r\f\v] - [:cntrl:]:匹配所有ASCII
0到31之间的控制符。 - [:graph:]:匹配所有的可打印字符,等价于:[^
\t\n\r\f\v] - [:print:]:匹配所有的可打印字符和空格,等价于:[^\t\n\r\f\v]
- [.c.]:功能不明
- [=c=]:功能不明
- [:<:]:匹配单词的开始
- [:>:]:匹配单词的结尾
-
- PERL兼容正则(这里可以看出PERL正则的强大):
- \a
alarm,即 BEL 字符(’0) - \cx
"control-x",其中 x 是任意字符 - \e
escape(’0B) - \f
换页符 formfeed(’0C) - \n
换行符 newline(’0A) - \r
回车符 carriage return(’0D) - \t
制表符 tab(’0) - \xhh
十六进制代码为 hh 的字符 - \ddd
八进制代码为 ddd 的字符,或 backreference - \d
任一十进制数字 - \D
任一非十进制数的字符 - \s
任一空白字符 - \S
任一非空白字符 - \w
任一“字”的字符 - \W
任一“非字”的字符 - \b
字分界线 - \B
非字分界线 - \A
目标的开头(独立于多行模式) - \Z
目标的结尾或位于结尾的换行符前(独立于多行模式) - \z
目标的结尾(独立于多行模式)
会影响到system,passthru,exec,shell_exec,popen,phpinfo等等大部分的文件操作函数。
* 写一段上传文件的代码。
functionuploadAllFile($file,$filename,$dir,$maxsize) {
}
* 写代码来解决多进程/线程同时读写一个文件的问题。
- 大家都知道,PH是没有多线程概念的,尽管如此我们仍然可以用“不完美”的方法来模拟多线程。简单的说,就是队列处理。通过对文件进行加锁和解锁,来实现。当一个文件被一个用户操作时,该文件是被锁定的,其他用户只能等待,确实不够完美,但是也可以满足一些要求不高的应用。
- function
T_put($filename,$string){ - $fp
= fopen($filename,’a'); //追加方式打开 - if
(flock($fp, LOCK_EX)){ //加写锁 - fputs($fp,$string);
//写文件 - flock($fp,
LOCK_UN); //解锁 - }
- fclose($fp);
- }
- function
T_get($filename,$length){ - $fp
= fopen($filename,’r'); //追加方式打开 - if
(flock($fp, LOCK_SH)){ //加读锁 - $result
= fgets($fp,$length); //读取文件 - flock($fp,
LOCK_UN); //解锁 - }
- fclose($fp);
- return
$result; - }
* Mysql 的存储引擎,myisam和innodb的区别。
- 简单的表达。
- MyISAM
是非事务的存储引擎。 - innodb是支持事务的存储引擎。
-
- innodb的引擎比较适合于插入和更新操作比较多的应用
- 而MyISAM
则适合用于频繁查询的应用 -
- MyISAM
--表锁。 - innodb--设计合理的话是行锁。
- MyISAM
不会出现死锁。 -
- 最大的区别就是MYISAM适合小数据,小并发;INNODB
适合大数据,大并发。最大的区别就是在锁的级别上。 -
- MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。综述,就可以根据数据表不同的用处是用不同的存储类型。而且MyISAM是文件存储的,可以进行直接在不同操作系统间拷贝使用。 -
- InnoDB:
- InnoDB
给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。在InnoDB表中不需要扩大锁定(lock escalation),因为 InnoDB 的列锁定(row level locks)适宜非常小的空间。InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不一样,举例来说,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操作系统的文件大小,一般为 2 GB。InnoDB所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,可以拷贝文件或用navicat for mysql。 -
- MyISAM
- 每张MyISAM
表被存放在三个文件 :frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex) 引伸。 - 因为MyISAM相对简单所以在效率上要优于InnoDB,小型应用使用MyISAM是不错的选择。
- MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦
2. web 架构,安全,项目经验
* 介绍xdebug,apc,eAccelerator,Xcache,Zend opt的使用经验。
*使用mod_rewrite,在服务器上没有/archivers/567.html这个物理文件时,重定向到index.php?id=567,请先打开mod_rewrite.
* MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
* 写出一种排序算法(原理),并说出优化它的方法。
* 请简单阐述您最得意的开发之作
* 对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题
* 您是否用过模板引擎? 如果有您用的模板引擎的名字是?
* 请介绍Session的原理,大型网站中Session方面应注意什么?
* 测试php性能和mysql数据库性能的工具,和找出瓶颈的方法。
* 正则提出一个网页中的所有链接.
* 介绍一下常见的SSO(单点登陆)方案(比如dedecms整合discuz的passport)的原理。
* 您写过的PHP框架的特点,主要解决什么问题,与其他框架的不同点。
* 大型的论坛/新闻文章系统/SNS网站在性能优化上有什么区别?
*相册类应用:要求在浏览器中能同时选中并上传多个文件,图片要求能剪裁,压缩包在服务器端解压。能上传单个达50M的文件。上传过程中有进度条显示。每个图片能生成四种大小缩略图,视频文件要转成flv供flash播放。叙述要涉及的各类开源软件和简单用途。
*一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n,输出最后那个大王的编号。用程序模拟该过程。
3. unix/linux 基本使用
* linux下查看当前系统负载信息的一些方法。
* 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事件冒泡的不同。
http://blog.sina.com.cn/s/blog_70a32ec401014yb8.html
* 什么是怪异模式,标准模式,近标准模式。
* DTD的定义
* IE/firefox常用hack.
* firefox,IE下的前端js/css调试工具。