PHP面试专用笔记精简版
【PHP笔记】
1.require 遇到即包含文件,require_once 只包含一次。require 遇到错误会终止,一般放在程序的最前面;include遇到错误会继续执行,一般放在流程控制语句中。
2.使用empty()函数检测变量时,在””、0、”0”、NULL、FALSE、array()、等情况下都被认为是空的。
3.提高PHP性能的方法:尽量把类定义成static;echo比print快;echo用逗号连接字符串效率高;require_once()比require慢,并且尽量不要使用相对路径;使用函数代替正则;不要滥用@操作符;打开apache的mod_deflate模块可以提高网页浏览速度;尽量少用全局变量和对象属性($this->num++);循环内部不要声明变量;多维数组尽量不要循所环嵌套赋值;使用ip2long()和long2ip()把IP地址转成整型。
4.优化网站响应时间:① 减少HTTP请求。例如:合并JS和CSS文件,利用浏览器的Cache功能避免下载相同的文件。② 不长修改的动态内容静态化。③ 优化数据库。④ 使用负载均衡,例如HTTP重定向、反向代理服务器。⑤ 使用缓存,例如memcached。
5.屏蔽所有错误输出,使用:error_reporting(E_ALL & ~E_DEPRECATED & ~E_NOTICE & ~E_WARNING);
6.字符串函数: strtolower(),strlen($str),strstr(),strpos(),strrev($str),str_replace($old,$new,$str)。
7.数组函数:sort(),rsort(),asort(),arsort(),ksort(),krsort();array_keys(),array_values(),array_key_exist();array_push(),array_pop(),array_unique();array_merge(),array_chunk();array_filter(),array_walk(),array_map();count(),in_array(),array_count_values(),array_reverse($arr)。
8.$this不能在类外部使用,析构函数不能传参数。
9.静态变量 public static $a,[类外访问] 类名::$a; [类内访问] 类名::$a 或者 self::$a。静态方法只能操作静态变量;非静态方法可以操作静态变量和非静态变量。(访问方式同上)
10.继承 extends:子类默认不会调用父类的构造函数。子类访问父类的方法(包括构造函数): 父类::方法名(); 或者 parent::方法名(); 如果子类的方法和父类方法相同,称为 方法重写(或者叫:方法覆盖)。多态的体现:当子类没有覆盖父类的方法则调用父类的方法,当子类覆盖了父类的方法,则调用自己的方法。
11. 抽象类(可以是public/protected/private)和抽象方法是当父类的一些方法不能确定时会用到。抽象类 abstract class Obj{}; 抽象方法不能有方法体 abstract public function func_name(param1,...); 抽象类中可以没有抽象方法,但是抽象方法必须存在于抽象类中!如果A1类继承了一个抽象类 A,则要求A1类实现从A类继承的所有抽象方法
12.接口(更加抽象的抽象类,接口的方法都不能有方法体且必须是public,不能去实例化接口)。接口中可以有属性,但是必须是常量,并且是public。一个接口不能继承其他的类,但是可以继承别的接口。一个接口可以继承多个其它的接口.当一个类去实现了某些接口,则必须把所有接口的方法都实现。 一个类可以同时继承他的父类,而且实现接口: class A1 extends A implements iUsb2,iUsb3{⋯}
13.final关键字:修饰类 或者 方法,不能修饰属性。 ① 希望某个类不能被继承: final class A{} ② 希望某个方法不能被子类重载(改写): class A{final public function func_name(){} }
14.操作文件和目录的函数: dirname($path),pathinfo($path),realpath($path),filetype($path),getimagesize("1.jpg");mkdir(),opendir(),closedir(),rename(),rmdir(),readdir();fopen(),fclose(),unlink(),copy(),fwrite(),file_put_contents($filename [,FILE_APPEND]),is_writable(),fread(),move_uploaded_file($upload_file,$path);[enctype="multipart/form-data"],stat()。
15.HTTP端口80,HTTPS端口443.HTTP返回状态码:1xx请求已接受,2xx请求成功,3xx重定向,4xx客户端错误,5xx服务器端错误。常见状态码:200 OK, 204 No Content(执行PHP但页面不跳转,header(‘HTTP/1.1 204 No Content’);),301(永久重定向),302(临时重定向,默认),304 NOT MODIFIED(未修改,表示是从浏览器缓存中取的数据),307(重定向并且保留POST的数据),400(客户端请求有语法错误),401(请求未经授权),403(服务器拒绝提供服务),404(请求资源不存在),500(服务器错误),503(服务器暂时错误,一段时间后可能会恢复正常)。
12. ob_start();session_start();$_SESSION[user]=1;ob_end_flush();session_unset(),session_destroy();setcookie()。
13. cur_init(),curl_setopt(),curl_exec($curl),curl_close()。
14. $mem->connect("localhost", 11211);$data=$mem->get($key); $mem->set($key, ‘abcdefg’, MEMCACHE_COMPRESSED, 3600);
15.【正则】:\d所有数字[0-9],\D除所有数字外[^0-9],\w所有字符[a-zA-Z_0-9],\W除所有字符外 [^a-zA-Z_0-9]。
* 匹配任意次;+ 匹配1次或多次;?匹配0次或1次;.匹配任意次但不包含回车换行;|选择匹配(或者);^匹配开头;$匹配尾部;{m}匹配前一个内容的重复次数为m次;{m,}大于等于m次;{m,n} m次到n次;( ) 合并整体匹配。
《模式修正符》: 【/正则/U 】 小写i:不区分大小写;小写m:匹配首内容或尾内容时采用多行识别匹配;小写s:将转义回车取消视为单行匹配;小写x:忽略正则中的空白;大写A:强制从头开始匹配;大写D:强制$匹配尾部无任何内容;大写U:禁止贪婪匹配,只跟踪到最近的一个匹配符并结束,常用在采集程序。
preg_grep()匹配查找,返回数组; preg_match()在字符串中查找匹配项,返回数组; preg_split()分割字符串; preg_replace()替换子字符串。
[页面超链接] '/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/i';[邮箱] /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/;[手机号] "/^1(3|5|8)\d{9}$/" 。
16. 删除分支:git branch -D staging;查看日志:git log;提交代码:git commit [指定文件] [-a] -m '说明注释';查看当前分支: git branch;切换分支:git checkout master;将master分支拉下来:git pull origin master;将内容合并到master:git merge renxing;将最新的代码提交到master:git push origin master。创建用户:git config --global user.name “renxing”;git config --global user.email renxing@qq.com;克隆项目到本地:git clone ssh:renxing@svngit.qq.com:29418/qgzs_apiv2.git。
17.header("Content-type: text/html; charset=utf-8");ini_set ('memory_limit', '1280M');<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
18.【单例模式】
<?php
class demo{
private static $obj; //保存对象的静态属性
private function __construct(){} //私有化构造函数
private function __clone(){} //禁止克隆
public static function getInstance(){
if(!(self::$obj instanceof self)){
self::$obj = new self;
}
return self::$obj;
}
}
?>
19.【冒泡排序】
function bubbleSort(&$arr){ //注意这里&
$temp=0;
for($i=0;$i<count($arr)-1;$i++){
for($j=0;$j<count($arr)-1-$i;$j++){
if($arr[$j]>$arr[$j+1]){
$temp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$temp;
}
}
}
}
20.【CURL 获取远程网页数据】
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://www.baidu.com");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0); //第三个参数是1表示不输出,0允许输出
$data = curl_exec($curl);
curl_close($curl);
21.【删除非空目录】
<?php
header("Content-type: text/html; charset=utf-8");
$dirname="phpMyAdmin";
deldir($dirname);
functiondeldir($dirname){
if(file_exists($dirname)) {
$dir=opendir($dirname);
while($filename=readdir($dir)){
if($filename!="."&& $filename!=".."){
$file=$dirname."/".$filename;
if(is_dir($file)){
deldir($file);//使用递归删除子目录
}else{
echo'删除文件<b>'.$file.'</b>成功<br>';
unlink($file);
}
}
}
closedir($dir);
echo'删除目录<b>'.$dirname.'</b>成功<br>';
rmdir($dirname);
}
}
?>
22.【PHP操作MySQL】
$conn=mysql_connect($db_host,$db_user,$db_pwd) or die("连接服务器失败");
mysql_select_db($db_name,$conn) or die("选择数据库失败");
$result=mysql_query("select * from employee") or die("查询失败");
while($row = mysql_fetch_array($result)){
$res[] = $row;
}
print_r($res);
mysql_free_result($result);// 释放结果集内存
mysql_close($conn);
23.【PHP操作mysqli】
$mysqli=new mysqli($db_host,$db_user,$db_pwd,$db_name) ;
$result=$mysqli->query("select * from employee");
while($row =$result->fetch_array()){
$res[] = $row;
}
print_r($res);
$result->free();
$mysqli->close();
ps aux | grep mysql 检测MySQL服务是否在运行
【目录处理命令】mkdir,cd,pwd,rmdir,rm -rf,cp,mv,ls。
【文件处理命令】touch,cat,more,less,head -n,tail -n,ln -s。
【权限管理命令】chmod -R 777 myname,chown用户,chgrp用户组。
【文件搜索命令】find /etc -name *init*,find /etc -size +204800,find /home -user renxing, 查找出来执行删除操作: find /etc -name -exec rm {} \;which cp;whereis ls;whatis ls。
【用户管理命令】useradd 用户名,passwd 用户名,who,w,uptime。
【解压】tar -zc(x)vf abcd.tar.gz abcd,unzip abcd.zip。
【关机】shutdown -h(r) now 立即关机(重启);logout。
【vim】aio/AIO,:set nu,gg到第一行,G到最后一行,nG到第n行,:n到第n行,$ 移至行尾,0移至行首。yy复制,dd剪切。:w保存,:wq保存退出,:q!退出。
【定时任务】crontab -e|l|r.
【多命令顺序执行】分号→顺序执行,&&→逻辑与,||→逻辑或。
【管道符】 命令1 | 命令2 (命令1的正确输出作为命令2的操作对象)
【位置参数变量】[$n] ,[$*] ,[$@],[$#]。
【接收键盘输入】read [选项] [变量名]
【declare声明变量类型】declare [+/-][选项] 变量名
【数值运算】“$((运算式))”或“$[运算式]” → $[$aa+$bb]
【字符截取命令】
① cut [选项] 文件名,一般和管道符 grep 一起使用。cut命令不能识别空格作为分隔符的字符串,awk命令可以。
② awk命令:awk 'BEGIN{print "start" }END{print "over"} {print $2 "\t" $6}' student.txt #给内容前后都追加
③ printf '输出类型输出格式' 输出内容
【printf 和 echo 和 cat】
① 用cat 可以查看一个文本的内容:cat stu.txt
② 要使用printf查看文本内容:printf ‘%s’ $(cat student.txt)
③ 调整格式输出: printf '%s\t %s\t %s\t %s\t %s\t %s\t \n' $(cat student.txt)
④ 学习printf 的原因在于:awk命令中不支持cat 和 echo。
◆ 在awk命令的输出中支持print和printf命令
① print:会在每个输出之后自动加入一个换行符(Linux默认没有print命令,但是awk中有)
② printf:是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符。
【sed命令】sed [选项-n/-e/-i] [动作] 文件名 ([动作]a \:追加。c \:行替换。i \:插入。d:删除指定的行。p:打印输出指定的行。s:字串替换)
案例①:df -h | sed -n ‘2p’ #获取磁盘信息df -h 的第二行数据
案例②:sed ‘2,4d’ student.txt #删除第二行到第四行的数据,但不修改文件本身
案例③:sed ‘2a hello’ student.txt #在第二行后追加hello
案例④:sed ‘2i hello’ student.txt #在第二行前插入数据
案例⑤:sed ‘2c person’ student.txt #替换第二行的数据
【字符串替换】sed ‘s/旧字串/新字串/g’ 文件名 (允许多个条件同时执行,使用 -e ,条件之间使用分号。)
案例①:sed ‘3s/74/99/g’ student.txt #在第三行中,把74换成99
案例②:sed -i ‘3s/74/99/g’ student.txt #sed操作的数据直接写入文件,但是没有输出
案例③:sed -e ‘s/Liming//g ; s/Gao//g’ student.txt #同时把“Liming”和“Gao”替换为空
【排序命令】: sort [选项] 文件名,【统计命令】:wc [选项] 文件名
【条件判断】-d是否为目录,-e文件是否存在,-f是否为普通文件。
【if语句】if [ 条件判断式 ];then 程序 fi
【for1】for 变量 in 值1 值2 值3⋯ do 程序 done,在批量处理文件中非常实用!
【for2】for (( 初始值;循环控制条件;变量变化 )) do 程序 done
【while】while [ 条件判断式 ] do 程序 done
【MySQL ALTER操作字段】
添加字段:ALTER TABLE tbname ADD username varchar(5) NOT NULL DEFAULT '' COMMENT 'beizhu';
修改字段的信息:alter table tbname MODIFY username varchar(20) not null default '' comment '备注' [after name | first] ;
替换字段为新值:alter table tbname CHANGE username userinfo int(11) NOT NULL DEFAULT 0 COMMENT '备注';
删除字段:ALTER TABLE tbname DROP COLUMN userinfo; [或者 DROP field userinfo]
【MySQL ALTER操作索引】
添加主键索引:ALTER TABLE tbname ADD PRIMARY KEY s1(column)
添加唯一索引:ALTER TABLE tbname ADD UNIQUE s2(column)
添加普通索引:ALTER TABLE tbname ADD [INDEX|KEY] idx_name (column1,column2,column3)
添加全文索引:ALTER TABLE tbname ADD FULLTEXT s3(column)
删除索引:ALTER TABLE tbname DROP index s1;
【MySQL执行一次update更改多条数据】
UPDATE tbName SET name = CASE myid WHEN 2 THEN 'Hello' WHEN 3 THEN 'world' WHEN 8 THEN 'Jerry' END WHERE myid IN (2,3,8) .
【MySQL优化的基本方法】
① 用啥查啥,不要select *;
② 尽量避免在列上运算,这样会导致索引失效;
③ 使用批量插入语句;
④ limit基数较大时使用between:order by id limit 1000,10 优化为:where id between 1000 and 1010 order by id
⑤ 不要使用rand函数获取多条随机记录
⑥ 避免使用NULL
⑦ 不要使用count(id),而用count(*)
⑧ 使用order by null 禁用排序
【使用explain】返回的信息:select_type[查询的类型],table,type[表的连接类型],possible_keys[可能使用的索引],key[实际使用的索引],key_len[索引字段的长度],ref,rows[扫描的行数],Extra[执行情况的描述和说明].
【存储引擎的选择】
① MyISAM:读取大约是写入的100倍以上,update较少,并发不高,不需要事务,数据量小,硬件资源有限。(定时清理MyISAM:optimize table 表名)
② InnoDB:读取和写入差不多,频繁更新大字段,表数据量超过1000万,并发高,安全性和可用性要求高。
【MySQL的瓶颈(千万级别数据量,性能会显著降低)】
① 增加MySQL配置中buffer和cache的数值,提高硬件配置
② 使用第三方引擎或者衍生版本
③ 迁移到其他数据库,如PostgreSQL、Oracle
④ 对数据库分区、分表。按日期和取模余数分表较常见,例如按照uid%10的计算方式。
⑤ 使用NoSQL等辅助解决方案,如Memcache、Redis
⑥ 使用数据库连接池技术
【Redis实战】
MySQL的user表:|userid:9|username:lisi|password:222|email:lisi@163.com|
转换为Redis存储:
set user:userid:9:username lisi
set user:userid:9:password 111111
set user:userid:9:email lisi@163.com
◆ 查询方法
① 查询有哪些字段:keys user:userid:9* ,结果如下:
② 查询某个字段的值:get user:userid:9:username ===> lisi
◆ 注意:冗余字段。
按照username查询,需要生成一条按照username列为主的key-value:set user:username:lisi:uid 9
这样就可以根据username:lisi:uid ,查出userid=9。 再查user:9:password/email ...
【增删改查分页完整操作】
使用hash类型存储数据。hmset:批量添加数据,例如:$redis->hmset(‘user:1’,array(‘name’=>“renxing”,‘age’=>“28”)); hgetall:获取所有数据;del:删除数据。
$redis->incr("userid"); //设定一个自增的数值,类似于主键
$redis->hmset("user:".$uid,array $add_data); //批量添加
$incr_id = $redis->get("uid"); //获取当前自增的数值
for($i=1;$i<=$incr_id;$i++){
$data[] = $redis->hgetall("user:".$i); //使用hgetall获取数据
}
$res = $redis->del("user:".$uid); //删除数据
[分页操作思路分析] 将所有的uid存在链表结构list中,用rpush uid 1 存储,用lrange uid 0 -1 获取全部数据。在删除数据的时候,用lrem删除对应的id号。PHP中用lsize可以获取list的总数。假设每页显示3条,那么,第1页:lrange uid 0 2,第2页:lrange uid 3 5,第3页:lrange uid 6 8。
【基本信息】
Redis 使用select 1可以切换到1号数据库
rdb的工作原理:每隔N分钟或N次写操作后,从内存dump数据形成rdb文件,压缩,放在备份目录。优势在于:恢复速度很快!rdb的缺陷:在2个保存点之间断电,将会丢失1-N分钟的数据。出于对持久化的更精细要求,redis增添了aof方式 append only file,把最终的结果逆化为新的变量,只存储最终的结果,忽略中间变化的过程,叫做:aof重写。bgrewriteaof 可以直接马上重写。使用aof后性能稍微会下降。如果不小心运行了flushall, 立即 shutdown nosave ,关闭服务器。然后手工编辑aof文件, 去掉文件中的 “flushall ”相关行, 然后开启服务器,就可以导入回原来数据。如果flushall之后,系统恰好bgrewriteaof了,那么aof就清空了,数据丢失.
【rdb和aof的一些注意事项】
① 在dump rdb过程中,aof如果停止同步,会不会丢失? (不会,所有的操作缓存在内存的队列里, rdb执行dump完成后,统一操作.)
② aof重写是指什么? (aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里.解决 aof日志过大的问题.)
③ rdb和aof,两种是否可以同时用? (可以,而且推荐这么做)
④ 如果rdb文件和aof文件都存在,优先用谁来恢复数据? (优先aof)
⑤ 恢复时rdb和aof哪个恢复的快 (rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行)
【info:显示服务器全部信息】
① Memory(内存)
② Persistence (持久化的信息)
③ Status中的fork耗时:latest_fork_usec:936
④ Replication (主从复制的信息)
【sentinel运维监控】./bin/redis-server ./sentinel.conf --sentinel 启动sentinel
1.用PHP打印出前一天的时间格式是2006-5-10 22:21:21。 echo date(‘Y-m-d H:i:s’, strtotime(‘-1 days’)); 2.不使用第三个变量交换两个变量的值。$a = "php";$b = "java";$a = explode('-',$a.'-'.$b); $b =$a[0];$a =$a[1]; 3. 简述如何得到当前执行脚本路径,包括所得到参数。答:$script_name = basename(__file__); print_r($script_name); 4. error_reporting(2047)什么作用?答:PHP 显示所有错误 E_ALL. 5. PHP中heredoc是一种特殊的字符串,它的结束标志必须?答:结束标识符所在的行不能包含任何其它字符除。 10.表单中 get与post提交方法的区别:get是发送请求HTTP协议通过url参数传递进行接收。而post是实体数据,可以通过表单提交大量信息. 11.数组的查找方法:(1) 顺序查找——从头到尾逐个查找。(2)二分查找——使查找的范围不断缩小一半,所以查找效率较高。 12.数据的排序方法:(1)冒泡排序 (2)选择排序 (3)插入排序 12. 如何修改SESSION的生存时间:setcookie() and session_set_cookie_params($lifeTime) 14. 用PHP写出显示客户端IP与服务器IP的代码: $_SERVER['SERVER_ADDR']服务器IP,$_SERVER['REMOTE_ADDR']客户端IP,$_SERVER['REMOTE_HOST']当前用户主机名,$_SERVER['PHP_SELF']当前脚本的名称(不包括路径和查询字符串),$_SERVER['HTTP_REFERER']链接到当前页面的前一页面的 URL 地址。 18.HTTP 状态中302、403、 500代码含义: 302:临时转移成功,请求的内容已转移到新位置;403:禁止访问;500:服务器内部错误。 18.在HTTP 1.0中,状态码 401 的含义是(未授权);如果返回“找不到文件”的提示,则可用 header 函数,其语句为:header("HTTP/1.0 404 Not Found"); 20. isset() 和 empty() 区别:isset()判断是否存在,存在就为真,不管是否为假。empty()判断是否为空,为空时为真值,不存在也为真值。 24. 引用和普通变量的区别:普通变量是开辟了一块新的存储空间,引用是直接指向其他的存储空间。 25. 请说明php中传值与传引用的区别:按值传递时,php必须复制值,特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。 31. php://input和$_POST有什么区别:$_POST 与 php://input可以取到值,$HTTP_RAW_POST_DATA 为空。$_POST 以关联数组方式组织提交的数据,并对此进行编码处理,如urldecode,甚至编码转换。 php://input 可通过输入流以文件读取方式取得未经处理的POST原始数据,php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input 不能用于 enctype="multipart/form-data"。 37.如何通过javascript判断一个窗口是否已经被屏蔽:答:获取open()的返回值,如果是null,就是屏蔽了。 1.假设a.html和b.html在同一个文件夹下面,用javascript实现当打开a.html五秒钟后,自动跳转到b.html:setTimeout( "go2b()",5000 ); 2.以Apache模块的方式安装PHP,在文件http.conf中首先要用语句(LoadModule php5_module "c:/php/php5apache2.dll")动态装载PHP模块,然后再用语句(AddType application/x-httpd-php .php)使得Apache把所有扩展名为php的文件都作为PHP脚本处理。 3.一个函数的参数不能是对变量的引用,除非在php.ini中把(allow_call_time_pass_reference boolean)设为on 1.MYSQL取得当前时间的函数是:now();格式化日期的函数是:date()。 2.数据库中的事务是什么:事务就是一系列的操作,这些操作完成一项任务。只要这些操作里有一个操作没有成功,事务就操作失败,发生回滚事件。即撤消前面的操作,这样可以保证数据的一致性。而且可以把操作暂时放在缓存里,等所有操作都成功有提交数据库,这样保证费时的操作都是有效操作。 5. MyISAM 和 InnoDB 的基本区别:MyISAM不支持事务,而InnoDB类型支持。MyISAM强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。 7.对于大流量的网站,您采用什么样的方法来解决访问量问题?①PHP生成静态文件 ②mamcached缓存技术 ③升级硬件 ④优化数据库访问 ⑤禁止外部的盗链 ⑥控制大文件下载 ⑦负载均衡。 8.优化sql语句执行效率的方法:①SELECT子句中避免使用‘*’ ②用Where子句替换HAVING子句 ③避免在索引列上使用计算 ④提高GROUP BY 语句的效率,将不需要的记录在GROUP BY 之前过滤掉 ⑤尽量把字段设置NOT NULL⑥使用连接(JOIN)来代替子查询 ⑦使用外键,优化锁定表 ⑧索引字段上尽量减少函数操作。 9.apche 和 nginx 的优缺:nginx轻量级,比apache占用更少的内存及资源,抗并发,nginx处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能。apache 相对于nginx 的优点:rewrite比nginx 的rewrite 强大,少bug,稳定。(需要性能用nginx,求稳定就apache)。 10.要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取。 11.重写list_010_1.html到list.php?city=010&page=1需要在Apache配置中增加如下RewriteRule_________。 答:RewriteRule /list-([0-9]+)-([0-9]+)\.html$ /list.php?fid=$1&page=$2。分析:([0-9]+) 表示1个或多个数字, rewirterule 语句分前面部分和后面部分,意思是把前面部分重写成后面的语句,每个括号内的内容为一个单元,第一个括号在后面就用$1 代替,第二个括号用$2代替,依次类推。 12.Redis和memcache的区别有哪些:memecache 把数据存在内存之中,断电后会挂掉,数据不能超过内存大小。redis有部份存在硬盘上,这样能保证数据的持久性。redis在数据支持上要比memecache多;memcache性能要高于redis。 13.关于网站静态文件访问提高性能的方法:减少生成cookie,将静态文件(如图片、css、js 等)放在不同域下;将JS代码中不必要的空格去掉。 14.举例说明在开发过程中用什么方法来加快页面的加载速度:页面压缩技术(压缩js),使用存储过程,把CSS样式放在头部、把js代码放在尾部,页面缓存,使用Gzip压缩文档,图片使用height和width属性一个目录地址,然后就直接加载默认文档index.html或index.php就行了。这样服务器就不用花时间来分析这个地址,也起到了一定加速的作用。 15.php中session的运行机制:session是在服务器端保持用户会话数据的一种方法,它以文件的形式存储在服务器端,session将客户端和服务器端建立一一联系,每个客户端都得有一个唯一标识(也就是session_id),服务器通过这个session_id来区分不同的客户端,session_id默认建立一个名叫”PHPSESSID”的cookie(可以通过php.ini修改session.name值指定)存储在客户端,我们也可以让session_id以地址栏来进行传输(修改php.ini中session.use_trans_sid等参数来改变session_id的传输方式),客户端将session_id传输给服务器端,服务器以传输过来的session_id来找到相对应的文件,读取的时候对文件内容进行反序列化就得到session的值,保存的时候先序列化再写入。 16. [Mongodb优点] ①弱一致性(最终一致),更能保证用户的访问速度 ②文档结构的存储方式能更便捷的获取数据 ③支持大容量的存储 ⑤第三方支持丰富 ⑥性能优越。 [Mongodb缺点]不支持事务,占用空间大,没有成熟的维护工具。 17.禁用COOKIE后SESSION还能用吗:PHP中通过相关的配置,可以让Session不依赖Cookie而存在。这是因为Session储存于服务器端(默认以文件方式存储Session),根据客户端提供的Session ID来得到用户的文件,取得变量的值,Session ID可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器 读取Session的目录。session是通过cookie来工作的,session和cookie之间是通过$_COOKIE['PHPSESSID']来联系的,通过$_COOKIE['PHPSESSID']可以知道session的id,从而获取到其他的信息。 1:列举linux系统常用信号及使用场景:信号的名称是在头文件signal.h中定义的,信号都以SIG开头,常用的信号如下:SIGALRM、SIGHUP、SIGINT、SIGKILL、SIGPIPE、SIGTERM、SIGUSR1.SIGUSR2。 2:说说linux下的find命令和grep命令的区别:grep是将一段数据经过分析后,取出我们所想要的,和cut类似。find用于搜寻档案,但是速度慢,占硬盘,通常都是先使用 whereis 或者是 locate检查,如果找不到才用find。 3:linux下如何看到当前机器运行情况(内存使用,cpu使用等)?top命令或者free命令,包含了缓存。如果要查看应用程序真正的内存使用情况,应该是used-cached-buffers。 4:请解释下列10个shell命令的用途(top,ps,mv,find,df,cat,chmod,chgrp,grep,wc):top:对系统处理器的状态实时监视;ps:哪些进程正在运行和运行的状态;mv移动文件;find:搜索文件;df:磁盘信息;cat:查看文件内容;chmod:设置权限;Chgrp:设置所属组;wc:统计文件中的字节数、字数、行数。 7:linux下,tail,grep,awk命令如何使用? 8:linux下,如何分析日志文件?(工具) 10:在linux服务器负载高的时候,你会通过哪些命令来查找原因?必须搞清楚的问题有:故障的表现是什么?无响应?报错?故障是什么时候发现的?故障是否可重现?有没有出现的规律(比如每小时出现一次)....(有谁在? w、last;之前发生了什么? history;现在在运行的进程是啥:pstree –a、ps aux。) 11:怎连接一台服务器(ssh命令,ssh root@192.168.1.1)?怎么拉下来一个文件和上传文件:ssh,ftp,secureCRT. 12:linux 大文件的分割和查询:分割:split 命令,例子:split -b 100m filename ;查询:find / -size +20000k -exec ls -lh {} \; 13:请书写Linux/Unix命令,将文件/etc/my.cnf复制到/tmp目录下: cp /etc/my.cnf/ /tmp 14:查看linux负载的命令(CPU:uptime,内存:vmstat free,硬盘:iostat),查看某个进程的命令(ps aux|grep 进程名),linux常用软件安装方式有哪几种(yum,apt)。 15:linux和windows环境开发需要注意哪些问题:windows用来做前段开发图形界面之类的比较好,linux是搭建服务器这方面比较牛。 18: Linux/unix命令,查看所有含有关键词"php"的进程:ps -aux|grep php 19:创建“/home/dir1”的目录:mkdir -p /home/dir1 20:解压缩archive.tar.gz : tar -zxvf archive.tar.gz 28:$# 是传给脚本的参数个数;$0 是脚本本身的名字;$1 是传递给该shell脚本的第一个参数;$2 是传递给该shell脚本的第二个参数;$@ 是传给脚本的所有参数的列表;$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个;$$ 是脚本运行的当前进程ID号; $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误。 29:统计日志相关记录数 awk:awk [-v 变量名=变量值] [-Fre] [--] '模式 { 语句 }' 变量名=变量值 文件名 30、域名解析发起TCP的3次握手:建立TCP连接后发起http请求->服务器端响应http请求,浏览器得到html代码->浏览器解析html代码,并请求html代码中的资源->浏览器对页面进行渲染呈现给用户 31、watch -n 1 :是每隔一秒查看后面跟着的命令结果;& 后台运行这个命令 1.框架中什么是单一入口和多入口?单一入口是什么优缺点?答案:单一入口通常是指一个项目或者应用具有一个统一(但并不一定是唯一)的入口文件,也就是说项目的所有功能操作都是通过这个入口文件进行的,并且往往入口文件是第一步被执行的。多入口即通过访问不同的 php 文件运行对应的功能。优点:单一入口应用程序的所有http请求都是通过 index.php 接收并转发到功能代码去的,所以我们在 index.php 里面就能完成许多实际工作。 缺点:任何事情都有两面性,单一入口应用程序也不例外。由于所有 http 请求都是针对 index.php,所以应用程序的 url 看起来确实不那么美观。特别是对搜索引擎来说很不友好。 2.列举你所使用过的mvc框架,简述它们的优缺点;[ThinkPHP]优点:开发速度快,利于拓展,源代码公开;缺点:不灵活,耦合太深,很多组件没法替换。[Yii]优点:可配置,可重用,可扩展组件;缺点:文档实例较少,英文太多。[CI]优点:配置简单,全部的配置使用PHP脚本来配置,执行效率高,文档详细;缺点:缺乏扩展能力,只能够满足小型应用。 3.用框架(mvc)做一个项目时,没有手册提供模板标签的使用方法,怎么办:查看源代码。 4.thinkphp的数据模型中的create方法,大概都做了那些事情:create():创建数据对象、数据自动验证、数据自动完成、令牌验证、字段类型检查。 5.如果模板是用smarty模板,怎样用section语句来显示一个名为$data的数组,若用foreahc语句又要怎样显示呢:{section name=sn loop=$data}{$news[sn].id}{/section} 、{foreach from=$data item=foo}{$foo}{/foreach} 12、什么是命名空间,如何声明和使用:命名空间是为了把一些类和类的实例更好地管理而定义的把这些类和实体集合起来的一个团体,它是_Namespace system class的一个实例,或者是_Namespace类的一个派生类,_Namespace类只有一个属性:Name。通过这个属性用户可以把某个命名空间和其他的命名空间分开来,命名空间的Name不能包括头缀和后缀的下划线。由关键字 namespace后边接着命名空间名字,之后接一对花括弧括住的一块声明和定义; 1.php的面向对象的主要关键字:final使类不被继承,方法不被覆盖;parent可以调用父类成员中的成员变量,成员方法和常量;self,可以调用当前类中的静态成员和常量;const 在类中定义常量;static静态属性和静态方法,不需要被实例化就能直接使用;clone对象的克隆。 2.接口起什么作用,抽象类起什么作用:接口是对外开放的,调用接口然后重写其中的方法,如果你不要使用接口里面的方法,那么接口就没有意义了,这样也是为了整体代码的控制性。 3.单例模式:保证一个类中,有且只有一个实例存在并提供一个访问点供全局访问,该实例可以被所有的程序来访问。使用场景:①当要用一个类时,又要用该类中的一个实例;②new 来创建实例时会给程序造成资源的浪费,而且实例越多也不好控制。③不同的线程调用时,可能会引起不同步的现象。 4.写出你常用的php魔术方法:__construct(),构造函数;__destruct(),析构函数;__get(),获得一个类的成员变量时调用;__set(),设置一个类的成员变量时调用;__callStatic(),用静态方式中调用一个不可访问方法时调用;__call(),当调用类实例中不存在的函数时自动执行;__isset(),判断类中私有属性或方法是否存在时自动调用;__unset(),清除类中私有变量时自动调用。