1.什么是引用变量?在PHP中,用什么符号定义引用变量?
在PHP中引用意味着用不同的名字访问同一个变量内容。使用&符号。
<?php
// 定义一个变量
$a = range(0, 1000);
var_dump(memory_get_usage());
// 定义变量b,将a变量的值赋值给b
// COW Copy On Write
$b = $a;
var_dump(memory_get_usage());
// 对a进行修改
$a = range(0, 1000);
var_dump(memory_get_usage());
<?php
// zval变量容器(需要安装xdebug扩展)
$a = range(0, 3);
xdebug_debug_zval('a');
// 定义变量b,把a的值赋值给b
$b = $a;
xdebug_debug_zval('a');
// 修改a
$a = range(0, 3);
xdebug_debug_zval('a');
2.PHP中字符串可以使用那三种定义方法以及各自的区别是什么?
定义方式:单引号,双引号,heredoc和newdoc.
单引号:不能解析变量,不能解析转义字符,只能解义单引号和反斜线本身,变量和变量,变量和字符串,字符串和字符串之间可以用.连接
双引号:可以解析变量,变量可以使用特殊字符和{}包含,可以解义所有的转义字符,可以使用.连接
单引号效率高
heredoc类似于双引号,newdoc类似于单引号,两者都是用来处理大文本
八大数据类型:标量(浮点,整型,字符串,布尔),复合(数组,对象),特殊(null,资源)
布尔中与false七种:0,0.0,’’,‘0’,false,array(),NULL
超全局数组:$GLOBALS,$_GET,$_POST,$_REQUEST,$_SESSION,$_COOKIE,$_SERVER,$_FILES,$_ENV
$_SERVER[’…’]在下面⬇
// HTTP_HOST 主机名
// HTTP_USER_AGENT 获取终端设备, 浏览器版本
//
// SERVER_SOFTWARE 获取服务器环境
// SERVER_NAME 服务器名
// SERVER_ADDR 服务器地址 (IP)
// REMOTE_ADDR 客户端IP地址
//
// SCRIPT_FILENAME 脚本地址(盘符)
// SCRIPT_NAME 脚本地址(网址)
//
// REQUEST_URI 传输地址(带参数)
// REQUEST_METHOD 传输方式
// QUERY_STRING 传输参数
//
// HTTP_REFERER 获取上一级的来源地址
null:直接赋值为NULL,未定义变量,unset销毁的变量
常量:const,define(不能定义类常量),不能修改,删除。
预定义常量
_FILE_文件路径,文件名,
_LINE_行号,
_DIR_,
_FUNCTION_函数体名称,
_CLASS_类名,
_TRAIT_,
_METHOD_类名和方法名,
_NAMESPACE_
3.foo()和@foo()之间的区别?
PHP错误控制符@
运算符优先级:递增递减>!>算术运算符>大小比较>相等比较>引用>位运算符>逻辑与>逻辑或>三目>赋值>and>xor>or
4.请列出三种PHP数组循环操作的语法,并注明各种循环的区别
for,foreach(可以重置指针reset),while、list()、each()(不可以重置指针)
if(…){…}elseif(…){…}else(…){…};
(整型/浮点/字符串用switch)switch…case…如果外面有一层for循环,跳出用continue2.(会生成一个跳转表,效率比for循环高)
5.读程序写答案
<?php
/**
* 写出如下程序的输出结果:
* <?php
*
* $count = 5;
* function get_count()
* {
* static $count;
* return $count++;
* }
* echo $count;
* ++$count;
*
* echo get_count();
* echo get_count();
*
* ?>
*
*/
$count = 5;
function get_count()
{
static $count;
return $count++;
}
echo $count;
++$count;
echo get_count();
echo get_count();
5、NULL、1 (NULL不输出)结果为51
静态变量:static
1.仅初始化一次
2.初始化时需要赋值
3.每次执行函数该值会保留
4.static 修饰的变量是局部的,仅在函数内部有效
5.可以记录函数的调用次数,从而可以在某些条件下终止递归
函数的返回值:如果省略return,返回NULL
include运行错误会发出警告(E_WARNING),不会终止程序
require会发出严重错误(E_COMPIRE_ERROR),会终止程序
系统内置函数
1.时间日期函数
date(),strtotime(),mktime(),time(),microtime(),date_default_timezone_set()
2.IP处理处理函数
ip2long(),long2ip()
3.打印处理
print(),printf(),print_r(),echo(),sprintf(),var_dump(),var_export()
4.序列化函数和反序列化函数
serialize(),unserialize()
5.字符串处理函数
implode(),explode(),join(),strrev(),trim(),strstr(),number_format()...
6.数组处理函数
array_merge(),array_rand()...
正则表达式
正则表达式的作用:分割、查找、匹配、替换字符串
分隔符:正斜线(/)、hash符号(#)和取反符号(~)
通用原子:\d\D(0-9)\w\W(数字字母下划线)\s\S(空白符)
元字符:. * ? $ + {n} {n,} {n,m} [] () [^] | [-]
模式修正符:i m e s U x A D u
后向引用: (...) \1
贪婪模式:?,U,取消贪婪模式
<!--正则表达式PCRE函数:preg_match(),preg_match_all(),preg_replace(),preg_split()
6.不断在文件 hello.txt 头部写入一行 “Hello World” 字符串, 要求代码完整
<?php
// 打开文件
//
// 将文件的内容读取出来,在开头加入Hello World
//
// 将拼接好的字符串写回到文件当中
//
// Hello 7891234567890
//
$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);
知识点梳理↓
fopen()打开函数
fwrite(),fputs()写入函数
fread(),fgets(),fgetc()读取函数
fclose()关闭函数
不需要fopen()打开的函数
file_get_contents()
file_put_contents()
其他读取函数
file(),readfile()
访问远程文件
开启allow_url_fopen,HTTP协议链接只能使用只读,ftp协议可以使用只读或者只写
目录操作函数
名称相关:basename(),dirname(),pathinfo()
目录读取:opendir(),readdir(),close(),rewinddir()
目录删除:rmdir()
目录创建:mkdir()
其它函数
文件大小:filesize()
目录大小:disk_free_space(),disk_total_space()
文件拷贝:copy()
文件删除:unlink()
文件类型:filetype()
重命名文件:rename()
文件截取:ftruncate()
文件属性:file_exists(),is_readable(),is_writable(),is_executable(),filectime(),fileatime(),filemtime()
文件锁:flock()
文件指针:ftell(),fseek(),rewind()
例题:通过PHP函数的方式对目录进行遍历,写出程序
<?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);
7.尽可能多的写出 Linux 命令
Linux常用命令
系统安全:sudo,su,chmod,setfacl
进程管理:w,top,ps,kill,pkill,sptree,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,chowm,chgrp
压缩解压:bzip2 bunzip2,gzip gunzip,zip unzip,tar
文件传输:ftp,scp
定时任务
1. crontab -e
*****命令(分时日月周)
2. at 2:00 tomorrow
at>/home/Jason/do_job
at>Ctrl+D
vim编辑器操作
shell基础
8.请写出mysql数据类型表达的意义(int(0),char(16),varchar(16),datetime(),text)
整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT
属性:UNSIGNED
实数类型:FLOAT,DOUBLE,DECIMAL
字符串类型:VARCHAR,CHAR,TEXT,BLOB
枚举:ENUM
日期和时间:TIMESTAMP,DATETIME
列属性:auto_increment,default,not null, zerofill
MySQL基础操作
链接:mysql -u -p -h -P(端口)
InnoDB表引擎
行级锁,事务,崩溃后安全恢复
9.简单描述MySQL中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响?
复合索引:key(a,b,c)
注意事项,前缀原则
MySQL的关联查询语句
六种查询语句
CROSS JOIN,INNER JOIN, LEFT JOIN RIGHT JOIN,UNION与UNION ALL,FULL JOIN
10.请简述项目中如何优化SQL语句执行效率的方法,从哪些方面,SQL语句性能如何分析?
分析SQL查询慢的方法
记录慢查询日志
分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和精力,可以使用pt-query-digest工具进行分析
使用show profile
set profiling = 1;开启,服务器上执行的所有语句会检测消耗的时间,存到临时表中
show profiles
show profile for query 临时表ID
使用show status(使用次数,查询次数)
使用show processlist(记录线程)
使用explain(分析单条SQL语句),,别名:desc
优化:
1.limit
2.避免返回全部列
3.不用*号
4.常用数据做缓存
4.用explain分析是否扫描额外的数据
5.优化长难的查询语句
6.优化特定类型的查询语句
11.简述MySQL分表操作和分区的工作原理,分别说说分区和分表的使用场景和各自优缺点
MySQL的高可扩展和高可用考察点↓
分区表的原理
对用户而言,分区表是一个独立的逻辑表,但是底层MySQL将其分成了多个物理子表,这对用户来说是透明的,每一个分区表都会使用一个独立的表文件.
分库分表的原理
通过一些HASH算法或者工具实现将一张数据表垂直或者水平的进行物理切分
MySQL的复制原理及负载均衡
主从复制解决的问题:
1.数据分布
2.负载均衡
3.高可用和故障切换
4.升级测试
12.SQL语句应该考虑哪些安全问题?
SQL查询的安全方案
1.使用预处理语句防止SQL注入
2.写入数据库的数据要进行特殊字符的转义
3.查询错误信息不要反回给用户,将错误记录到日志
MySQL的其他安全设置
1.定期做数据备份
2.不给查询用户root权限,合理分配权限
3.关闭远程访问数据库权限
4.修改root口令
5.删除多余的用户
6.改变root用户的名称
7.限制一般用户浏览其他库
8.限制用户对数据文件的访问权限
为什么PDO比MySQLi更安全?↓
PDO支持预处理,MySQLi比PDO稍快
13.编写一个在线留言本,实现用户的在线留言功能,留言信息存储到数据库,要求设计数据表内容以及使用PHP编码完成
6-1 程序功能设计考察点(+无限分类)
PHP框架的差异和优缺点
yaf框架:yaf使用PHP扩展的形式写的一个PHP框架,也就是以C语言为底层编写的,性能上要比PHP代码写的框架要快一个数量级.
优点:执行效率高,轻量级框架,可扩展性强
缺点:高版本兼容性差,底层代码可读性差,需要安装扩展,功能单一,开发需要编写大量的插件
yii2框架:是一款非常优秀的通用web后端框架,结构简单优雅,实用功能丰富,扩展性强,性能高是它最突出的优点
缺点:学习成本高,相比yaf,量级较重
时间复杂度T(n) = O(f(n))
常数阶O(1),线性阶O(n),平方阶O(n^2)
对数阶O(log2n)
空间复杂度S(n) = O(f(n))
冒泡排序的元素交换,空间复杂度O(1)
排序算法
冒泡排序,直接插入排序,希尔排序,选择排序,快速排序,堆排序,归并排序
二分查找/顺序查找
请简单描述下数据结构的特征(stack,heap,list,doubly-linked-list,queue,array(vector))
Array数组,
LinkedList链表,
Stack栈,
Heap堆,
list线性表,
doubly-linked-list双向链表,
queue队列,
set集合,
map字典,
graph图
PHP如何解决网站大流量与高并发的问题
QPS:每秒钟请求或查询的数量,在互联网领域,指每秒响应请求数(指HTTP请求);
吞吐量:单位时间内处理的请求数量(通常由QPS与并发数决定)
PV:综合浏览量
UV:独立访客
日网站带宽 = PV/统计时间(换算秒)*平均页面大小(单位KB)*8
(总PV数*80%)/(6小时秒数*20%) = 峰值每秒请求数(QPS)
80%的请求集中在20%时间内
防盗链的概念
防止别人通过一些技术手段绕过本站
的资源,让绕开本站资源显示的页面链接失效.
通过HTTP_REFERER或者签名来做
减少HTTP请求的方式
1.使用图片地图
2.css精灵
3.合并多个脚本
4.图片base64编码的方式
浏览器缓存和数据压缩
HTTP缓存机制
缓存分类:
200 from cache:直接从本地获取缓存
304 not modified:协商缓存
200 ok:没有用到缓存,最慢
相关Header:
1.Pragma:该字段设为no-cache时,告知浏览器禁用本地缓存
2.Expires:启用本地缓存的字段,thu,31 Dec 2037 22:55:55 GMT的格林威治时间
3.Cache-Control:no-store,no-cache,max-age=delta-seconds
优先级:1>3>2
Nginx配置缓存策略
expries , etag , add_header
前端代码和资源的压缩
js,css,图片,HTTP都可以压缩
Nginx下的gzip
cdn加速
内容分发网络,更快,更稳定
实现:
bat等都有提供cdn加速
可用lvs做4层负载均衡
squid做反向代理,Nginx也可以