PHP面试 必背知识点-1

2019-07-05  本文已影响0人  欣博客

1.PHP引用

什么是引用变量?在PHP当中,用什么符号定义引用变量?

\color{red}{ 引用变量是用不同的名字访问同一个变量内容,使用\&符号 }
\color{red}{ 一个变量赋值个另一个变量时,不会先创建一个内存空间,而是指向,当给变量做修改时才会创建一个新的内存空间 }
\color{red}{ unset一个引用 只会取消引用,不会销毁空间 }
对象本身就是引用传递,实例化以后的类如 $a = new a(); $b = $a; $b和$a是引用的关系
变量自己只能主动引用一个变量,但是变量自己可以被其他变量引用多次

<?php
$data = ['a', 'b', 'c'];
foreach ($data as $key=>$val){   //这里每次都会执行一次赋值的操作
    $val = &$data[$key];  //  每次 $val 都会引用 一个$data[$key]  并且取消引用上一个变量
                          //变量自己不可以同时引用多个其他变量 但是变量可以被其他变量引用多次
}             
var_dump($data); //bcc

2.常量及数据类型

PHP中字符串可以使用哪三种定义方法以及各自区别是什么?

单引号,双引号,heredoc和newdoc

单引号
双引号

\color{red}{ 单引号效率高于双引号 }

<?php
$a = 123232321;
$Heredoc = <<<EoT
qweqweqweqwe{$a}qweqweqwe
EoT;

$Newdoc = <<<'Eot'
qweasd123$a123
Eot;

数据类型

PHP八种基本数据类型: 浮点型,整形,字符串,布尔值,数组,对象,null,资源类型

浮动类型

浮点类型不能运用到比较运算中,需要比较可以 用bccomp($a,$b,2)函数

布尔类型

\color{red}{ FALSE 的七种情况}
\color{red}{ 整型0、浮点0.0、布尔false、空字符串、0字符串、空数组、NULL }

超全局数组

<?php
$GLOBALS   //引用全局作用域中可用的全部变量
$_GET  // HTTP GET 变量
$_POST  //HTTP POST 变量
$_REQUEST  //HTTP Request 变量  默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组。 
$_SESSION  // Session 变量
$_COOKIE  //HTTP Cookies
$_SERVER //服务器和执行环境信息
$_FILES  //HTTP 文件上传变量
$_ENV  //环境变量
$_SERVER['SERVER_ADDR']   //服务器端IP地址
$_SERVER['REMOTE_ADDR'] //客户端IP地址
$_SERVER['SERVER_NAME'] //服务器名称
$_SERVER['REQUEST_TIME']  //请求时间
$_SERVER['QUERY_STRING']  //请求?后面参数
$_SERVER['HTTP_REFERER']  //上级请求页面
$_SERVER['HTTP_USER_AGENT']  //头信息里面的HTTP_USER_AGENT信息
$_SERVER['REQUSET_URI'] //比如请求的是index.php那么该值就是/index.php
$_SERVER['PATH_INFO']  //处理路由 /index.php/use/reg?state  use/reg就是PHTA_INFO的位置
NULL

\color{red}{ 三种情况 }
\color{red}{ 直接赋值为NULL、未定义的变量、unset销毁的变量 }

常量
定义
\color{red}{ const、define }
\color{red}{ const更快,是语言结构,define是函数 }
\color{red}{ define不能用于定义类常量,const可以 }
\color{red}{ 常量一经定义,不能被修改,不能被删除 }

预定义常量

<?php
__FILE__   //文件路径名
__LINE__  //所在行号
__DIR__  //所在目录
__FUNCTION__  //所在函数名
__CLASS__  //类名
__TRAIT__  //trait名称
__METHOD__  //传回类名称与函数名称
__NAMESPACE__  //当前命名空间名称

3.运算符

PHP的错误控制符

PHP支持一个错误运算符:@。当将其放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉

运算符优先级
递增/递减运算符
<?php
$name = null;
$a = ++$name; //++null 等于1 先执行++ 在赋值
var_dump($a); //1

$name = null;
$a = $name++; //先赋值 后++
var_dump($a); //null
var_dump($name); //1
----------------------------------------
//前面为true 所以后面就不会执行了
$a = true || $b = 3;  //$a true $b null
var_dump($a);  //true
var_dump($b);  //null

//先执行 ||  然后$b=3  $b=3为true 所以$a = true
$a = false || $b = 3;  //$a true $b null
var_dump($a);  //true
var_dump($b);  //3

//前面为false 后面就不会执行了
$b = false && $a == 1;  //$b false $a null

// || && and or
//先执行 false || true   后执行赋值操作
$a = false || true;  //$a true

//先执行赋值  后执行or
$b = false or true;  //$b false

---------------------------------
$a = 0;
$b = 0;
//按照优先级 > 大于 || 大于 =
//先执行 3>0  然后执行 ||
//因为3>0等于true 所以后面不执行
//在执行赋值操作 就是$a = true
if ($a = 3 > 0 || $b = 3 > 0)
{
    $a++;  //true
    $b++;  //1
    var_dump($a); //true
    var_dump($b);  //1
    echo $a. "\n";  //1
    echo $b. "\n";  //1
}

4.流程控制

PHP的遍历数组的三种方式及各自区别

使用\color{red}{ for}循环

使用\color{red}{ foreach }循环

使用\color{red}{ while、list()、each() }组合循环

for循环\color{red}{ 只能遍历索引数组,foreach }可以遍历索引和关联数组,联合使用\color{red}{ list(),each()和while}循环同样可以遍历索引和关联数组

\color{red}{ while、list()、each()组合不会reset()}

\color{red}{foreach遍历会对数组进行reset()}操作

PHP分支

if.....elseif

在elseif语句中只能有一个表达式为true,即在elseif语句中只能有一个语句块被执行,多个elseif从句是排斥关系.

使用elseif语句有一个基本原则,总把优先范围小的条件放在前面处理.

switch...case....

和if不同的是,switch后面的控制表达式的数据类型只能是整形、浮点类型或者字符串

continue语句作用到switch的作用类似于break

跳出switch外的循环,可以使用continue2

switch...case会生成跳转表,直接跳转到对应case,而不是一层层判断
效率:
如果条件比一个简单的比较要赋值得多或者在一个多次的循环中,那么用switch语句可能会快一些

5.自定义函数及内部函数

变量的作用域

变量的作用域也称\color{red}{ 变量的范围 },变量的范围即它定义的上下文背景(也是它的生效范围).大部分的PHP变量只有一个单独的范围.这个单独的范围跨度同样包含了include和require引入的文件.

global关键字

$GLOBALS\color{red}{其他超全局数组}

静态变量

静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不会消失.

static关键字

  1. 仅初始化一次
  2. 初始化时需要赋值
  3. 每次执行函数该值会保留
  4. static修饰的变量是局部的,仅在函数内部有效
  5. 可以记录函数的调用次数,从而可以在某些条件下终止递归
函数的参数

默认情况下,函数参数通过值传递
如果希望允许函数修改它的值,必须通过引用传递参数

函数的返回值

值通过使用可选的返回语句( return )返回
可以返回包括数组和对象的任意类型
返回语句会终止函数执行,将控制权交回函数调用处
省略return , 返回值为NULL , 不可有多个返回值

函数的引用返回

从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符&

外部文件的导入

include/require语句包含并运行指定文件
如果给出路径名按照路径来找,否则从include_path中查找
如果include_path中也没有,则从调用脚本文件所在的目录和当前工作目录下寻找
当一个文件被包含时,其中所包含的代码继承了include所在行的变量范围

加载过程中未找到文件则include结构会发出一条警告;这一点和require不同,后者会发出一个致命错误
require在出错时产生 E_COMPILE_ERROR 级别的错误
换句话说将导致脚本终止include只产生警告(E_WARNING),脚本会继续运行.

require(include)/require_one(include_once)唯一区别是PHP会检查该文件是否已经被包含过,如果是则不会再次包含.

系统内置函数
<?php
//时间日期函数
date()  //格式化一个本地时间/日期
strtotime()  //将任何字符串的日期时间描述解析为 Unix 时间戳
mktime()  //取得一个日期的 Unix 时间戳
time()  //返回当前的 Unix 时间戳
microtime()  //返回当前 Unix 时间戳和微秒数
date_default_timezone_set()  //设定用于一个脚本中所有日期时间函数的默认时区

//IP处理函数
ip2long() //将 IPV4 的字符串互联网协议转换成长整型数字
long2ip() //将长整型转化为字符串形式带点的互联网标准格式地址(IPV4)
    
//打印处理
print()  //输出字符串
printf() //输出格式化字符串
print_r() //打印关于变量的易于理解的信息。
echo //输出一个或多个字符串
sprintf() //函数把格式化的字符串写入变量中。
var_dump() //打印变量的相关信息
var_export() //输出或返回一个变量的字符串表示
//序列化及反序列化函数
serialize() //序列化
unserialize()  //反序列化函数
//字符串处理函数
implode() //将一个一维数组的值转化为字符串
explode() //使用一个字符串分割另一个字符串
join() //别名 implode()
strrev() //反转字符串
trim() //去除字符串首尾处的空白字符(或者其他字符)
ltrim() //删除字符串开头的空白字符(或其他字符)
rtrim() //删除字符串末端的空白字符(或者其他字符)
strstr() //查找字符串的首次出现
number_format() //以千位分隔符方式格式化一个数字
//数组处理函数
array_keys() //返回数组中部分的或所有的键名
array_values() //返回数组中所有的值
array_diff() //计算数组的差集
array_intersect() //计算数组的交集
array_merge() //合并一个或多个数组
array_shift() //将数组开头的单元移出数组
array_unshift() //在数组开头插入一个或多个单元
array_pop() //弹出数组最后一个单元(出栈)
array_push() //将一个或多个单元压入数组的末尾(入栈)
sort() //对数组排序
<?php
$var1 = 5;
$var2 = 10;
function foo(&$my_var){
    global $var1;
    $var1 += 2;
    $var2 = 4;
    $my_var += 3;
    return $var2;
}
$my_var = 5;
echo foo($my_var). "\n"; //4
echo $my_var. "\n"; //8
echo $var1; //7
echo $var2; //10
$bar = 'foo';
$my_var = 10;
echo $bar($my_var). "\n"; //4
正则表达式

正则表达式的作用:分割、查找、匹配、替换字符串
分隔符: 正斜线(/)、hash符号(#)以及取反符号(~)
通用原子 : \d、\D、\w、\W、\s、\S
元字符: . * ? ^ + {n} {n,} {n,m} [] () [^] | [-]
模式修正符: i m e s U x A D u

<?php
//后向引用
$str = '<b>abc</b>';
$pattern = '/<b>(.*)<\/b>';
preg_replace($pattern,'\\1',$str);
//贪婪模式
$str = '<b>abc</b><b>bcd</b>';
$pattern = '/<b>.*?<\/b>/';   //.* 是贪婪模式(默认匹配的是<b>到最后的</b>   .*?   是匹配的 <b></b> 里面的值)
preg_replace($pattern,'\\1',$str);
//正则表达式PCRE函数:
preg_match() //执行匹配正则表达式
preg_match_all() //执行一个全局正则表达式匹配
preg_replace() //执行一个正则表达式的搜索和替换
preg_split() //通过一个正则表达式分隔字符串

中文匹配:UTF-8汉字编码范围是0x4e00-0x9fa5 , 在ANSI(gb2312)环境下, 0xb0-0xf7 , 0xa1-0xfe

UTF-8要使用u模式修正符使模式字符串被当初UTF-8,在ANSI(gb2312)环境下,要使用chr将Ascii码转换为字符

正则表达式解题方法
先写出一个要匹配的字符串
自左向右的顺序使用正则表达式的原子和元字符进行拼接
最终加入模式修正符
不可死记硬背模式

文件及目录处理
fopen()函数 打开文件或者 URL
fopen() 中 mode 的可能值列表

mode 说明
'r' 只读方式打开,将文件指针指向文件头。
'r+' 读写方式打开,将文件指针指向文件头。
'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'a' 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
'a+' 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
'x' 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL O_CREAT 标记是等价的。
'x+' 创建并以读写方式打开,其他的行为和 'x' 一样。

b 打开一个二进制文件
t windows 文本的转换标记

<?php
//写入函数
fwrite()  //写入文件(可安全用于二进制文件)
fputs() // fwrite() 的别名
//读取函数
fread() //读取文件(可安全用于二进制文件)
fgets() //从文件指针中读取一行
fgetc() //从文件指针中读取字符
//关闭文件函数
fclose()
//不需要fopen()打开的函数
file_get_contents() //将整个文件读入一个字符串
file_put_contents() //将一个字符串写入文件
//其他读取函数
file() //把整个文件读入一个数组中
readfile() //输出文件
访问远程文件

开启allow_url_fopen , HTTP协议连接只能使用只读,FTP协议可以使用只读或者只写

目录操作函数

<?php
//名称相关:
basename() //返回路径中的文件名部分
dirname() //返回路径中的目录部分
pathinfo() //返回文件路径的信息
//目录读取:
opendir() //打开目录句柄
readdir() //从目录句柄中读取条目
closedir() //关闭目录句柄
rewinddir() //倒回目录句柄
//目录删除:
rmdir() //删除目录  尝试删除 dirname 所指定的目录。 该目录必须是空的,而且要有相应的权限。 失败时会产生一个 E_WARNING 级别的错误。
//目录创建:
mkdir()  //新建目录
filesize() //文件大小

//目录大小:
disk_free_space()  //返回目录中的可用空间
disk_total_space() //返回一个目录的磁盘总大小

copy() //文件拷贝
unlink() //删除文件
filetype()  //文件类型
rename()  //重命名文件或者目录
ftruncate()  //文件截取
//文件属性 :   
file_exists() //检查文件或目录是否存在
is_readable() //判断给定文件名是否可读
is_writable() //判断给定的文件名是否可写
is_executable() //判断给定文件名是否可执行
filectime() //取得文件的 inode 修改时间
fileatime() //取得文件的上次访问时间
filemtime() //取得文件修改时间    

flock() //文件锁
//文件指针 :
ftell() //返回文件指针读/写的位置
fseek() //在文件指针中定位
rewind() //倒回文件指针的位置   
<?php
/**
 *  打开文件
 *  将文件的内容读取出来,在开头加入Hello World
 *  将拼接好的字符串写回到文件当中
 */
$file = './hello.txt';
$handle = fopen($file,'r');
$content = fread($handle,filesize($file));
$content = 'Hello World'.$content;
fclose($handle);
$handle = fopen($file,'w');
fwrite($handle,$content);
fclose($handle);
<?php
/**
 * 打开目录 读取目录当中的文件
 * 如果文件类型是目录,继续打开目录
 * 读取子目录的文件
 * 如果文件类型是文件,输出文件名称
 * 关闭目录
 */

$dir = './test';
function loopDir($dir){
    $handle = opendir($dir);
    while (false!==($file = readdir($handle))) {
        if($file != '.' && $file != '..'){
            echo $file . "\n";
            if(filetype($dir.'/'.$file) == 'dir'){
                loopDir($dir.'/'.$file);
            }
        }
    }
}
loopDir($dir);
会话控制

cookie操作

<?php
//$name cookie名称  value cookie值 expire cookie有效期 
//path cookie服务器路径 domain cookie域名 secure 是否通过安全的https连接来传输cookie
setcookie($name,$value,$expire,$path,$domain,$secure)
//使用
$_COOKIE
//设置cookie
setcookie('name','val');
//删除cookie
setcookie($name,'',time()-1000);

Session

<?php
session_start();
$_SESSION['name'] = 'value';
$_SESSION;
$_SESSION = [];
session_destroy(); //摧毁一个会话中所有session
session.auto_start; //是否自动开启session
session.cookie_domain  //存储sessionid的有效域名
    
session.gc_probability = 1;  //就会有一次清除的机会
session.gc_divisor = 100;    //每访问100次
session.gc_maxlifetime  = 1440; //超1440秒清除

session.save_handler
传递SessionID的问题
session_name()和session_id();

<a href="1.php?<?php echo session_name().'='.session_id();?>">下个页面值</a>

<a href="1.php?<?php echo SID;?>">下个页面值</a>

使用SID必须开启session_start();

Session存储

session_set_save_handler()

MySQL,Memcache,Redis等

面向对象

PHP类权限控制修饰符

public、protected、private

面向对象的继承

单一继承

方法重写

面向对象的多态

抽象类的定义

接口的定义

魔术方法

<?php
__construct()//,类的构造函数
__destruct()//,类的析构函数
__call()//,在对象中调用一个不可访问方法时调用
__callStatic()//,用静态方式中调用一个不可访问方法时调用
__get()//,获得一个类的成员变量时调用
__set()//,设置一个类的成员变量时调用
__isset()//,当对不可访问属性调用isset()或empty()时调用
__unset()//,当对不可访问属性调用unset()时被调用。
__sleep()//,执行serialize()时,先会调用这个函数
__wakeup()//,执行unserialize()时,先会调用这个函数
__toString()//,类被当成字符串时的回应方法
__invoke()//,调用函数的方式调用一个对象时的回应方法
__set_state()//,调用var_export()导出类时,此静态方法会被调用。
__clone()//,当对象复制完成时调用
__autoload()//,尝试加载未定义的类
__debugInfo()//,打印所需调试信息

设计模式

常见设计模式 : 工厂模式、单例模式、注册树模式、适配器模式、观察者模式和策略模式

网络协议

HTTP协议状态码

五类响应 : 1XX(信息类,接收请求正在处理)、2XX(成功状态码,请求正常处理完毕)、3XX(重定向,需要进行附加操作已完成请求)、4XX(客户端错误,服务器无法处理请求)、5XX(服务器错误,服务器处理请求出错了)

常见状态码:

2开头 (请求成功)表示成功处理了请求的状态代码。
200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
201 (已创建) 请求成功并且服务器创建了新的资源。
202 (已接受) 服务器已接受请求,但尚未处理。
203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
206 (部分内容) 服务器成功处理了部分 GET 请求。
3开头 (请求被重定向)表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
4开头 (请求错误)这些状态代码表示请求可能出错,妨碍了服务器的处理。
400 (错误请求) 服务器不理解请求的语法。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
405 (方法禁用) 禁用请求中指定的方法。
406 (不接受) 无法使用请求的内容特性响应请求的网页。
407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408 (请求超时) 服务器等候请求时发生超时。
409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
415 (不支持的媒体类型) 请求的格式不受请求页面的支持。
416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 (未满足期望值) 服务器未满足"期望"请求标头字段的要求。

5开头(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
500 (服务器内部错误) 服务器遇到错误,无法完成请求。
501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

OSI七层模型

物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
第一层 : 物理层
建立、维护、断开物理连接
第二层 : 数据链路层
建立逻辑连接、进行硬件地址寻址、差错校验等功能
第三层:网络层
进行逻辑地址寻址,实现不同网络之间的路径选择
第四层:传输层
定义传输数据的协议端口号,以及流控和差错校验
协议有 : TCP UDP , 数据包一旦离开网卡即进入网络传输层
第五层 : 会话层
建立、管理、终止会话
第六层 : 表示层
数据的表示、安全、压缩
第七层 : 应用层
网络服务与最终用户的一个接口
协议有 : HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

HTTP协议的工作特点和工作原理
工作特点
基于B/S模式
通信开销小、简单快速、传输成本低
使用灵活、可使用超文本传输协议
节省传输时间
无状态

工作原理
客户端发送请求给服务器,创建一个TCP连接,指定端口号,默认80,连接到服务器,服务器监听浏览器请求,一旦监听到客户端请求,分析请求类型后,服务器会向客户端返回状态信息和数据内容

HTTP协议常见请求/响应头
Content-Type、Accept、Origin、Cookie、Cache-Control、User-Agent、Referrer、X-Forwarded-For、Access-Control-Allow-Origin、Last-Modified
HTTP协议的请求方法
OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*’的请求来测试服务器的功能性。
HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
GET:向特定的资源发出请求。
POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
PUT:向指定资源位置上传其最新内容。
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断。
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

HTTPS的工作原理
HTTPS是一种基于SSL/TLS的HTTP协议,所有的HTTP数据都是在SSL/TLS协议封装之上传输的
HTTPS协议在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议

常见网络协议含义及端口
FTP、Telnet(远程登陆)、SMTP(定义了简单文件传输协议)、POP3(接收邮件)、HTTP、DNS(域名解析服务端口53)

开发环境及配置

版本控制软件
集中式和分布式
集中 CVS和SVN
分布 GIT

Nginx+PHP-FPM
CGI 为了联系webserver和PHP解析器的一个协议 当中就是一个桥梁
FastCGI CGI改良版本出现的 一次处理多个请求
PHP-FPM 是 FastCGI 进程管理器

PHP常见配置项
<?php
register_globals  //注册全局变量  建议关闭
allow_url_fopen //运行远程文件打开
allow_url_include //允许远程文件包含
date.timezone //设置时区
display_errors //错误日志
error_reporting //错误级别
safe_mode //安全模式
upload_max_filesize //上传文件大小限制
max_file_uploads //上传文件个数
post_max_size //POST 数据所允许的最大大小
JavaScript和jQuery基础考点

变量的定义
变量必须以字母开头
变量能以$和_符号开头
变量名称对大小写敏感
使用 var 关键词来声明变量
可以在一条语句中声明很多变量
未使用值来声明的变量,值是undefined
如果重新声明 JavaScript 变量, 该变量的值不会丢失

var a = 1;
var a;    此时变量a还是1

数据类型
字符串、数字、布尔、数组、对象、Null、Undefined
JavaScript变量均为对象.当您声明一个变量时,就创建了一个新的对象.

创建对象
new Object()
使用对象构造器
使用JSON对象
函数
定义方法
无默认值
函数内部声明的变量(使用var)是局部变量
在函数外声明的变量是全局变量,所有脚本和函数都能访问它
运算符
+号可以用来字符串的拼接
流程控制
else if必须分开写
JavaScript内置对象
Number

var pi=3.14;
var myNum=new Number(value);
var myNum=Number(value);

String

var str=' This is String';
var str= new String(s);
var str=String(s);

方法和属性

String 对象属性

属性 描述
constructor 对创建该对象的函数的引用
length 字符串的长度
prototype 允许您向对象添加属性和方法

String 对象方法

方法 描述
anchor() 创建 HTML 锚。
big() 用大号字体显示字符串。
blink() 显示闪动字符串。
bold() 使用粗体显示字符串。
charAt() 返回在指定位置的字符。
charCodeAt() 返回在指定的位置的字符的 Unicode 编码。
concat() 连接字符串。
fixed() 以打字机文本显示字符串。
fontcolor() 使用指定的颜色来显示字符串。
fontsize() 使用指定的尺寸来显示字符串。
fromCharCode() 从字符编码创建一个字符串。
indexOf() 检索字符串。
italics() 使用斜体显示字符串。
lastIndexOf() 从后向前搜索字符串。
link() 将字符串显示为链接。
localeCompare() 用本地特定的顺序来比较两个字符串。
match() 找到一个或多个正则表达式的匹配。
replace() 替换与正则表达式匹配的子串。
search() 检索与正则表达式相匹配的值。
slice() 提取字符串的片断,并在新的字符串中返回被提取的部分。
small() 使用小字号来显示字符串。
split() 把字符串分割为字符串数组。
strike() 使用删除线来显示字符串。
sub() 把字符串显示为下标。
substr() 从起始索引号提取字符串中指定数目的字符。
substring() 提取字符串中两个指定的索引号之间的字符。
sup() 把字符串显示为上标。
toLocaleLowerCase() 把字符串转换为小写。
toLocaleUpperCase() 把字符串转换为大写。
toLowerCase() 把字符串转换为小写。
toUpperCase() 把字符串转换为大写。
toSource() 代表对象的源代码。
toString() 返回字符串。
valueOf() 返回某个字符串对象的原始值。

Boolean 布尔类型

var bol=true
var bol=new Boolean(value);
var bol=Boolean(value);

方法和属性

Boolean 对象属性

属性 描述
constructor 返回对创建此对象的 Boolean 函数的引用
prototype 使您有能力向对象添加属性和方法。

Boolean 对象方法

方法 描述
toSource() 返回该对象的源代码。
toString() 把逻辑值转换为字符串,并返回结果。
valueOf() 返回 Boolean 对象的原始值。

Array

var arr=new Array();
var arr=new Array(size);
var arr=new Array(e1,e2,e3,... en);

数组没有关联数组 下标不可以为字符串 如果想用 用json对象
方法和属性

Date
var date=new Date();
Math
var pi_value=Math.PI;
var sqrt_value=Math.sqrt(15);

RegExp 正则表达式
/pattern/attributes
new RegExp(pattern,attributes);
方法属性
Window对象
Window、Navigator、Screen、History、Location
DOM对象
Document、Element、Attr、Event
jQuery
jQuery选择器
基本选择器、层次选择器、过滤选择器、可见性过滤选择器、属性过滤选择器、子元素过滤选择器、表单对象属性过滤选择器
jQuery事件
("button").click(function(){..some code...}) jQuery效果("p").show()
jQuery DOM操作
属性、值、节点、CSS、尺寸
面试题
JavaScript中为id是test的元素设置样式为good

document.getElementById('test').calssName = 'good';

要求使用jQuery事件写在页面元素加载完成之后,动态绑定click事件到btnOK元素

$(function(){
    $(".btnOK").click(function(){

    })
})
AJAX基础内容

AJAX基础概念

Asynchronous JavaScript and XML

通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新

AJAX工作原理

XMLHttpRequest是AJAX的基础

XMLHttpRequest用于在后台与服务器交换数据

XMLHttpRequest对象请求
open(method,url,async)
send(string)
XMLHttpRequest对象响应
responseText
responseXML
onreadystatechange
readyState : 0(请求未初始化),1(服务器连接已建立),2(请求已接收),3(请求处理中),4(请求已完成,且响应已就绪)
status : 200 , 400
常用方法
$(ele).load()
$.ajax()
$.get()
$.post()
$.getJSON()
$.getScript()

Linux基础

系统安全
sudo 以系统管理组的身份执行指令
su 用于变更为其他使用者的身份
chmod 用来变更文件或目录的权限
setfacl 用来在命令行里设置ACL(访问控制列表)
进程管理
w
top
ps
kill
pkill
pstree
killall
用户管理
id
usermod
useradd
groupadd
userdel
文件系统
mount
umount
fsck
df
du
系统关机和重启
shutdown
reboot
网络应用
curl
telnet
mail
elinks
网络测试
ping
netstat
host
网络配置
hostname
ifconfig
常用工具
ssh
screen
clear
who
date
软件包管理
yum
rpm
apt-get
文件查找和比较
locate
find
文件内容查看
head
tail
less
more
文件处理
touch
unlink
rename
ln
cat
目录操作
cd
mv
rm
pwd
tree
cp
ls
文件权限属性
setfacl
chmod
chown
chgrp
压缩/解压
bzip2/bunzip2
gzip/gunzip
zip/unzip
tar
文件传输
ftp
scp

Linux系统定时任务
crontab命令
crontab -e

** at命令 一次性去执行 **
#at 2:00 tomorrow //明天2点去执行
at>home/Jason/do_job
at>Ctrl+D

shell基础

脚本执行方式
赋予权限,直接执行,例 : chmod +x test.sh ; ./test.sh
调用解释器使得脚本执行,例 : bash、csh、ash、bsh、ksh等等
使用source命令,例: source test.sh
编写基础
开头用#!指定脚本解释器,例如:#!/bin/sh
编写具体功能

MySQL数据库基础

mysql数据类型

整数类型

TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
属性 : UNSIGNED
长度 : 可以为整数类型指定宽度,例如 : INT(11) 、 对大多数应用是没有意义的,它不会限制值得合法范围,只会影响显示字符的个数. 宽度
zerofill 设置零填充 int(3) 012 int(5) 00012

小数类型

FLOAT、DOUBLE、DECIMAL
DECIMAL可存储比BIGINT还大的整数;可以用于存储精确的小数
FLOAT和DOUBLE类型支持使用标准的浮点进行近似计算

字符串类型

VARCHAR、CHAR、TEXT、BLOB
VARCHAR类型用于存储可变长度字符串,它比定长类型更节省空间
VARCHAR使用1或2个额外字节记录字符串的长度,列长度小于255字节,使用1个字节表示,否则用2个
VARCHAR长度,如果存储内容超出指定长度,会被截断

CHAR是定长的,根据定义的字符串长度分配足够的空间
CHAR会根据需要采用空格进行填充以方便比较
CHAR适合存储很短的字符串,或者所有值都接近同一个长度
CHAR长度,超度设定的长度,会被截断

对于经常变更的数据,char比varchar更好,char不容易产生碎片
对于非常短的列,char比varchar在存储空间上更有效率
只分配真正需要的空间,更长的列会消耗更多的内存

尽量避免使用BLOB/TEXT类型,查询会使用临时表,导致严重的性能开销.

枚举

有时可以使用枚举代替常用的字符串类型
把不重复的集合存储成一个预定义的集合
非常紧凑,把列表值压缩到一个或两个字节
内部存储的是整数
尽量避免使用数字作为ENUM枚举的常量,易混乱
排序是按照内部存储的整数进行排序
枚举表会使表大小大大减小

日期和时间类型

尽量使用TIMESTAMP,比DATETIME空间效率高
用整数保存时间戳的格式通常不方便处理
如果需要存储微妙,可以使用bigint存储

列属性

auto_increment 会在新记录插入表中时生成一个唯一的数字
default 约束用于向列中插入默认值
not null 不能为空
zerofill 零填充

mysql基础操作

常见操作

MySQL的连接和关闭 : mysql -u -p -h -P
-u 用户名 -p 密码 -h 指定主机 -P端口
其他 : \G 打印结果垂直显示 、\c 取消当前mysql命令、\q 退出mysql、\s 显示mysql服务器状态、\h 帮助信息、\d 改变执行符

InnoDB表引擎

支持崩溃后的安全恢复,支持行级锁,支持外键

MyISAM表引擎

5.1版本前,MyISAM是默认存储引擎
拥有全文索引,压缩,空间函数
不支持事务的行级锁,不支持崩溃后的安全恢复
表存储在两个文件,MYD和MYI

MySQL锁机制

基础概念

表锁是日常开发当中常见的问题,因此也是面试当中最常见的考察点,当多个查询同一时刻进行数据修改时,就会产生并发控制的问题
共享锁和排它锁,其实就是读锁和写锁
读锁
共享的,不堵塞,多个用户可以同时读一个资源,互不干扰
写锁
排他的,一个写锁会阻塞其他的写锁和读锁,这样可以只允许一个人进行写入,防止其他用户读取正在写入的资源
锁粒度
表锁,系统性能开销最小,会锁定整张表,MyISAM使用表锁
行锁,最大程度地支持并发处理,但是也带来了最大的锁开销,InnoDB实现行级锁
MySQL事务处理
MySQL提供事务处理的表引擎,InnoDB
4种隔离级别

MySQL创建高性能索引

索引的基础

索引类似于书籍的目录,要想找到一本书的某个特定主题,需要先查找书的目录,定位对应的页码
存储引擎使用类似的方式进行数据查询,先去索引当中找到对应的值,然后根据匹配的索引找到对应的数据行
索引对性能的影响
大大减少服务器需要扫描的数据量
帮助服务器避免排序和临时表
将随机I/O变顺序I/O
大大提高查询速度,降低写的速度,占用磁盘
索引的使用场景
对于非常小的表,大部分情况下全表扫描效率更高
中到大型表,索引非常有效
特大型的表,建立和使用索引的代价将随之增大,可以使用分区技术来解决

索引的类型
  1. 索引有很多种类型,都是实现在存储引擎层的
  2. 普通索引 : 最基本的索引,没有任何约束限制
  3. 唯一索引 : 与普通索引类似,但是具有唯一性约束
  4. 主键索引 : 特殊的唯一索引,不允许有空值
    唯一索引和主键索引的区别
    1.一个表只能有一个主键索引,可以有多个唯一索引
    2.主键索引一定是唯一索引,唯一索引不是主键索引
    3.主键可以与外键构成参照完整性约束,防止数据不一致
  5. 组合索引 : 将多个列组合在一起创建索引,可以覆盖多个列
  6. 外键索引 : 只有InnoDB类型的表才可以使用外键索引,保证数据的一致性,完整性和实现级联操作
  7. 全文索引 : MySQL自带的全文索引只能用于MyISAM,并且只能对英文进行全文检索

原则

  1. 最适合索引的列是出现在where子局中的列,或连接子句的列而不是出现在select关键字后的列
  2. 索引列的基数越大,索引的效果越好
  3. 对字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间
  4. 根据情况创建复合索引,复合索引可以提高查询效率
  5. 避免创建过多索引,索引会额外占用磁盘空间,降低写操作效率
  6. 主键尽可能选择较短的数据类型,可以有效减少索引的磁盘占用提高查询效率
MySQL索引的注意事项

注意
1.复合索引遵循前缀原则
KEY(a,b,c)
索引可以生效
where a=1 and b=2 and c=3
where a=1 and b=2
where a=1

索引不生效
where b=2 and c=3
where a=1 and c=3

2.like查询,%不能再前,可以使用全文索引
where name like "%wang%" 如果必须使用,则用全文索引引擎
3.column is null 可以使用索引 (判断是否是null)
4.如果MySQL估计使用索引比全表扫描更慢,会放弃使用索引
5.如果or前面的条件中的列有索引,后面的没有,索引都不会被用到
6.列类型是字符串,查询时一定要给值加引号,否则索引失效

MySQL的SQL语句编写

面试题

有A(id,sex,par,c1,c2),B(id,age,c1,c2)两张表,其中A.id与B.id关联,现在要求写出一条SQL语句,将B中age>50的记录的c1,c2更新到A表中统一记录中的c1,c2字段中

update A,B set A.c1 = B.c1,A.c2 = B.c2 where A.id = B.id and B.age > 50;
update A inner join B on A.id = B.id set A.c1 = B.c1,A.c2 = B.c2 where B.age > 50

关联更新

UPDATE A,B SET A.c1 = B.c1,A.c2=B.c2 WHERE A.id = B.id
UPDATE A INNER JOIN B ON A.id=B.id SET A.c1=B.c1,A.c2=B.c2 WHERE.....

MySQL的关联查询语句

六种关联查询

交叉连接(CROSS JOIN),内连接(INNER JOIN),外连接(LEFT JOIN/RIGHT JOIN),联合查询(UNION与UNION ALL),全连接(FULL JOIN)

交叉连接

SELECT * FROM A,B(,C)
SELECT * FROM A CROSS JOIN B (CROSS JOIN C)
没有任何关联条件,结果是笛卡尔积,结果集会很大,没有意义,很少使用

内连接

SELECT * FROM A,B WHERE A.id=B.id
SELECT * FROM A INNER JOIN B ON A.id = B.id
多表中同时符合某种条件数据记录的集合

内连接分为三类

等值连接 : ON A.id = B.id
不等值连接 : ON A.id > B.id
自连接 : SELECT * FROM A T1 INNER JOIN A T2 ON T1.id = T2.pid
INNER JOIN 可以缩写为JOIN

外链接

左外连接 : LEFT OUTER JOIN ,以左表为主,先查询出左表,按照ON后的关联条件匹配右表,没有匹配到的用NULL填充,可以简写成LEFT JOIN

右外连接 : RIGHT OUTER JOIN,以右表为主,先查询出右表,按照ON后的关联条件匹配左表,没有匹配到的用NULL填充,可以简写成RIGHT JOIN

联合查询

SELECT * FROM A UNION SELECT * FROM B UNION ....

就是把多个结果集集中在一起,UNION前的结果为基准,需要注意的是联合查询的列数要相等,相同的记录行会合并

如果使用UNION ALL , 不会合并重复的记录行

全连接

MySQL不支持全连接

可以使用LEFT JOIN 和 UNION 和 RIGHT JOIN 联合使用

SELECT * FROM A LEFT JOIN B ON A.id = B.id UNION

SELECT * FROM A RIGHT JOIN B ON A.id = B.id

嵌套查询

用一条SQL语句的结果作为另外一条SQL语句的条件

SELECT * FROM A WHERE id IN (SELECT id FROM B)

上一篇下一篇

猜你喜欢

热点阅读