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也可以