1、FILE表示什么意思?(5分)
文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,FILE 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。
2、如何获取客户端的IP地址?(5分)
$_SERVER[‘REMOTE_ADDR’]
3、写出使用header函数跳转页面的语句(5分)
Header(‘location:index.php’);
4、$str是一段html文本,使用正则表达式去除其中的所有js脚本(5分)
$pattern = ‘/\.+<\/script>/’; Preg_replace($pattern,’’,$str);
5、写出将一个数组里的空值去掉的语句(5分)
$arr = array(‘’,1,2,3,’’,19);
第一种方法:
$array1 = array(' ',1,'',2,3); print_r(array_filter($array1, "del")); function del($var)
{ return(trim($var));
}
第二种方法:
$arr=array("",1,2,3,""); $ptn="/\S+/i"; print_r(preg_grep($ptn,$arr));
6、写出获取当前时间戳的函数,及打印前一天的时间的方法(格式:年-月-日 时:分:秒) (5分)
Time(); Date(“Y-m-d H:i:s”,Strtotime(“-1 day”));
7、写出php进行编码转换的函数(5分)
Iconv(‘utf-8’,’gb2312’,$str);
8、$str = “1,3,5,7,9,10,20”,使用什么函数可以把字符串str转化为包含各个数字的数组?(5分)
$arr = explode(“,”,$str);
9、serialize() /unserialize()函数的作用(5分)
serialize()和unserialize()在php手册上的解释是:
serialize — 产生一个可存储的值的表示,返回值为字符串,此字符串包含了表示 value 的字节流,不丢失其类型和结构,可以存储于任何地方。
unserialize — 从已存储的表示中创建 PHP 的值
具体用法:
$arr = array(“测试1″,”测试2″,”测试3″);//数组 $sarr = serialize($arr);//产生一个可存储的值(用于存储)
//用任意方法(例如:你要是吧$sarr存在一个文本文件中你就可以用file_get_contents取得)得到存储的值保存在$newarr中;
$unsarr=unserialize($newarr);//从已存储的表示中创建 PHP 的值
10、写出一个函数,参数为年份和月份,输出结果为指定月的天数(5分)
Function day_count($year,$month){ Echo date(“t”,strtotime($year.”-”.$month.”-1”)); }
11、一个文件的路径为/wwwroot/include/page.class.php,写出获得该文件扩展名的方法(5分)
$arr = pathinfo(“/wwwroot/include/page.class.php”);
$str = substr($arr[‘basename’],strrpos($arr[‘basename’],’.’));
12、你使用过哪种PHP的模板引擎?(5分)
Smarty,thinkphp自带的模板引擎
13、请简单写一个类,实例化这个类,并写出调用该类的属性和方法的语句(5分)
Class myclass{
Public $aaa;
Public $bbb;
Public function myfun(){
Echo “this is my function”;
}
$myclass = new myclass();
$myclass->$aaa;
$myclass->myfun();
14、本地mysql数据库db_test里已建有表friend,数据库的连接用户为root,密码为123
friend表字段为:id,name,age,gender,phone,email
请使用php连接mysql,选择出friend表里age > 20的所有记录打印结果,并统计出查询出的结果总数。(5分)
20”;
$result = mysql_query($sql);
$count = mysql_num_rows($result);
While($row = mysql_fetch_assoc($result)){
Echo $row[‘id’];
….
}
15、以下有两个表
user表 字段id (int),name (varchar)
score表 字段uid (int),subject (varchar) ,score (int)
score表的uid字段与user表的id字段关联
要求写出以下的sql语句
1)在user表里新插入一条记录,在score表里插入与新加入的记录关联的两条记录(5分)
2)获取score表里uid为2的用户score最高的5条记录(5分)
3)使用联合查询获取name为“张三”的用户的总分数(5分)
4)删除name为“李四”的用户,包括分数记录(5分)
5)清空score表(5分)
6)删除user表(5分)
1). mysql_query(“insert into user(name) values(‘test’)”);
$id = mysql_insert_id();
Mysql_query(“insert into score(uid,subjext,score) values(“.$id.”,’english’,’99’)”);
2).$sql = select uid,sunjext,score from score where uid=2 order by score desc limit 0,5;
3).select s.score from score s RIGHT JOIN user u ON u.id=s.uid where u.name=’张三;
4).delete from score where uid in(select id from user where name=’李四’);
Delete from user where name=’李四’;
5).delete from score;
6).drop table user;
1:get,post 的区别
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式
GET请求在URL中传送的参数是有长度限制的,而POST没有
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息
GET比POST传输数据量更小
2.require,include 区别
include在引入不存文件时产生一个警告且脚本还会继续执行,
require则会导致一个致命性错误且脚本停止执行。
i++和++i命令的区别有
i++先做别的事,再自己加1
++i先自己加1,再做别的事情
++i比i++效率要高
两数组直接相加,array_merge 与直接相加的区别
https://www.cnblogs.com/Cecil_1995/p/10909367.html
负载均衡的五种算法
https://blog.csdn.net/apple9005/article/details/79961391
轮询(默认)
weight(轮询权值)
ip_hash
fair(第三方)
url_hash(第三方)
InnoDB和MyISAM的区别
MyISAM不支持事务,而InnoDB支持
MyISAM支持外键,而InnoDB不支持
MyISAM:支持(FULLTEXT类型的)全文索引
InnoDB:不支持(FULLTEXT类型的)全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
MyISAM用一个变量保存了整个表的行数,InnoDB不保存表的具体行数
MyISAM支持表级锁,InnoDB支持表、行(默认)级锁
InnoDB表必须有唯一索引(如主键)
MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM)
两个数组相加
echo、print_r、print、var_dump
- echo、print是php语句,var_dump和print_r是函数
- echo 输出一个或多个字符串,中间以逗号隔开,没有返回值是语言结构而不是真正的函数,因此不能作为表达式的一部分使用
- print也是php的一个关键字,有返回值 只能打印出简单类型变量的值(如int,string),如果字符串显示成功则返回true,否则返回false
- print_r 可以打印出复杂类型变量的值(如数组、对象)以列表的形式显示,并以array、object开头,但print_r输出布尔值和NULL的结果没有意义,因为都是打印”\n”,因此var_dump()函数更适合调试
- var_dump() 判断一个变量的类型和长度,并输出变量的数值
php中字符串处理函数
trim 移除空白字符或特定字符 ltrim rtrim
expload 数组转化成字符串
substr 字符串截取
substr_resplace 子字符串替换
strlen 字符串长度
strtolower
strtoupper
md5
implode
strpos在指定字符串中查找目标字符串第一次出现的位置
array_diff
array2 = array(“b” => “green”, “yellow”, “red”);
array1, $array2); //Array ( [1] => blue )
返回array1中有,array2中没有的集合
有两个数组[1,2,5,11,32,15,77]和[99,32,15,5,1,77]两个数组,写段程序找出它们共同都拥有的数
面向对象三大特征
封装、
继承、
多态:同一类型的对象在执行同一个方法时,可能表现出多种行为特征。
魔术方法 [系统特定情境调用,如初始化construct]
__construct(),
__destruct(),
__call(),
__callStatic(),
__get(),
__set(),
__isset(),
__unset(),
__sleep(),
__wakeup(),
__serialize(),
__unserialize(),
__toString(),
__invoke(),
__set_state(),
__clone() 和
__debugInfo() 等方法在 PHP 中被称为”魔术方法”(Magic methods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。
所有的魔术方法 必须 声明为 public
mysql数据库索引有哪些?什么情况下不适合建立索引?
主键索引
普通索引
唯一索引
全文索引
数据重复率高
写操作多
问:一条SQL语句在MySQL中如何执行的?
答:
客户端请求 —->
连接器(验证用户身份,给予权限) —->
查询缓存(存在缓存则直接返回,不存在则执行后续操作) —->
分析器(对SQL进行词法分析和语法分析操作) —->
优化器(主要对执行的sql优化选择最优的执行方案方法) —->
执行器(执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口) —->
去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果)
问:PHP-FPM与Nginx的通信机制?
答:两种方式 1 tcp (ip:端口) 2、unix domain socket
数组排序
sort() 函数用于对数组单元从低到高进行排序。
rsort() 函数用于对数组单元从高到低进行排序。
asort() 函数用于对数组单元从低到高进行排序并保持索引关系。
arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。
ksort() 函数用于对数组单元按照键名从低到高进行排序。
krsort() 函数用于对数组单元按照键名从高到低进行排序。
4.常见的排序算法
冒泡排序
思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
选择排序
思路分析:在要排序的一组数中,选出最小的一个数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止
插入排序
思路分析:在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
代码实现:
4.快速排序
思路分析:选择一个基准元素,通常选择第一个元素或者最后一个元素。通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
代码实现:
memcache 和 Redis 的区别
数据结构:memcache仅支持简单的key-value形式,Redis支持的数据更多(string字符串,set集合,list列表,hash散列,zset有序集合);
多线程:memcache支持多线程,Redis支持单线程
持久化:Redis支持持久化,memcache不支持持久化
分布式:Redis做主从结构,memcache服务器需要通过hash一致化来支撑主从结构
什么是 Redis 穿透和雪崩 缓存击穿
缓存穿透:就是访问redis中一个不存在的key的时候,会直接穿过缓存,去数据库中进行查询.
缓存雪崩:就是每秒有5000个请求过来时候,redis缓存库崩了,然后这些请求瞬间落在了mysql数据库上,直接导致数据库死机.
缓存击穿:简单地说就是缓存过期大量线程访问数据库
说说对 SQL 语句优化有哪些方法?
不用*来代替所有列名,尽量采用与访问表相关的实际列名;
尽量减少表的查询次数。
对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描
Mysql 中有哪几种锁
MyISAM支持表锁,InnoDB支持表锁和行锁,默认为行锁
表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低
-
行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高
如何处理负载、高并发
- 动静分类
- 添加cdn,同时可以把图片等保存的cos对象储存中
- 使用负载均衡
- 合理添加缓存,最好是以内存为基础的缓存如redis
- 添加redis分布式锁
- 前端页面合理设计,避免高速点击的状况出现
- 添加队列来处理高并发
- 使用数据库连接池
- 对数据库及程序优化,分库分表
为什么要使用分布式锁
分布式系统要访问共享资源,为了避免并发访问资源带来错误,我们为共享资源添加一把锁,让各个访问互斥,保证并发访问的安全性
单线程的redis如何实现阻塞队列
整个阻塞执行过程相当于是分散开的,每次请求结束后都判断之前的阻塞列表是否满足执行条件,类似我们用轮询来实现长连接的功能。所以看似阻塞的命令对其他命令的执行时不会有影响的,它们依然是单线程的。
消息中间件
基于队列与消息传递,降低系统耦合,提高系统响应速度,突破系统性能瓶颈。削锋,解耦
PHP网络通信是如何实现的
基于socket实现,可以用到现在的swoole,wokerman等
MySQL分库分表策略 (根据id取模)
1要确定需要将数据平均分配到多少张表中,也就是:表容量
2有100张表进行存储,则我们在进行存储数据的时候,首先对用户ID进行取模操作,根据 user_id%100 获取对应的表进行存储查询操作
3例如,user_id = 101 那么,我们在获取值的时候的操作,可以通过下边的sql语句:
其中,order_1是根据 101%100 计算所得,表示分表之后的第一章order表。
事务的其特性有哪些?mysql是否支持嵌套事务?(默认不支持)
所谓事务就是针对数据库的一组操作,它可以由一条或者多条SQL语句组成,同一个事务的操作具备同步的特点,如果其中有一条语句不能执行的话,那么所有的语句都不会执行
(1)原子性: 原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。
(2)一致性:一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
(3)隔离性:隔离性是指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被企图进行修改的事务看到 。
(4)持久性:持久性是指在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。 即使出现了任何事故比如断电等,事务一旦提交,则持久化保存在数据库中
$this和self、parent这三个关键词分别代表什么?在哪些场合下使用?
$this:当前对象
self: 当前类
parent: 当前类的父类
$this在当前类中使用,使用->调用属性和方法。
self也在当前类中使用,不过需要使用::调用。
静态属性,不能在类里使用$this访问,应该使用self后跟范围解析操作符(::),后面是带着美元符号的变量名。
PHP的性能优化方法总结
- 多用PHP自身能力解决问题
- 多使用PHP内置的变量、常量、函数
- 少用PHP魔术方法
- 利用unset()及时释放不使用的内存
- 做PHP擅长的事情
- 尽量静态化
- 尽量的少进行文件操作,虽然PHP的文件操作效率也不低的
- 其他自行挖掘
安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?
- 防远程提交
- 防止SQL注入,对特殊代码进行过滤
- 防止注册灌水,使用验证码
- 数据加密处理等等
TCP长连接与短连接的区别,各自的优点与缺点,以及其使用场景
https://blog.csdn.net/weixin_41563161/article/details/105529382
长连接的操作步骤是:建立连接->数据传输…(保持连接)…数据传输->关闭连接。
短连接的步骤是:建立连接->数据传输->关闭连接…建立连接->数据传输->关闭连接。
-
长链接做聊天室类似场景,短链接做网站场景
36. 遍历两个一位数组最后的结果
运算符题 //+= 与-=优先级一致,靠右原则
2. TCP/IP协议支持哪些协议? //面试的时候是多选题,没选全······
计算函数
localhost与127.0.01的区别
- localhot(local)是不经网卡传输!这点很重要,它不受网络防火墙和网卡相关的的限制。
- 127.0.0.1是通过网卡传输,依赖网卡,并受到网络防火墙和网卡相关的限制。
- 一般设置程序时本地服务用localhost是最好的,localhost不会解析成ip,也不会占用网卡、网络资源
Select Count (*)和Select Count(1)以及Select Count(column)区别
- 一般情况下,Select Count (*)和Select Count(1)两者的返回结果是一样的
- 假如表沒有主键(PK), 那么count(1)比count()快, 如果有主键PK的話,那count(主键)最快, 如果你的表只有一个字段的话那count()就是最快的
- count(*) 跟 count(1) 的结果一样,都包括对NULL的统计,而count(column) 是不包括NULL的统计
- count(column) 是表示结果集中有多少个column字段不为空的记录
列关于PHP中大小写说法正确的是
- 内置的结构以及关键字、用户定义的类和函数是不区分大小写
- 变量名严格区分大小写
- 常量名可以通过define()进行设置是否对大小写敏感,详细内容见下图:
- 魔术常量是不区分大小写的
git cvs svn
CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统
Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针
mysql索引不会命中的情况
- 如果条件中有 or ,即使其中有条件带索引也不会命中(这也是为什么尽量少用or的原因)
注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引如果出现OR的一个条件没有索引时,建议使用 union ,拼接多个查询语句 - like查询是以%开头,如果是int型索引不会命中,字符型的命中’test%’百分号只有在右边才可以命中
- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
- 没有查询条件,或者查询条件没有建立索引
- 查询条件中,在索引列上使用函数(+, - ,*,/), 这种情况下需建立函数索引
- 采用 not in, not exist
- B-tree 索引 is null 不会走, is not null 会走
- 联合索引遵循最左原则,不满足的不会命中
- 链表时,如果关联字段的的编码不同,也不会走索引。如一个表时 utf8,另外一个表是utf8mb4
varchar char
- Varchar 对每个英文(ASCII)字符都占用2个字节,对一个汉字也只占用两个字节
- char 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节
$_REQUESt
默认情况下包含了 _POST 和 $_COOKIE 的数组
psr规范
此处的“类”泛指所有的class类、接口、traits可复用代码块以及其他类似结构。
一个完整的类名需要具有以下结构
<命名空间>(<子命名空间>)*<类名>
1.完整的类名必须要有一个顶级命名空间,被称为“Vendor namespace”
2.完成的类名可以有一个或多个子命名空间
3.完整的类名必须有一个最终的类名
4.完整的类名中任意一部分中的下划线都是没有特殊意义的
5.完整的类名可以由任意大小写字母组成
6.所有类名都必须是大小写敏感的
当根据完整的类名载入相应的文件……
1.完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为“命名空间前缀”,其必须与至少一个“文件基目录”相对应。
2.紧接命名空间前缀后的子命名空间必须与相对应的“文件基目录”相匹配,其中的命名空间分隔符作为目录分割符
3.末尾的类名必须与对应的.php为后缀的文件同名
4.自动加载器(autoloader)的实现一定不能抛出异常,一定不能触发任一级别的错误信息以及不应该有返回值。
Redis支持五种数据类型:
- string(字符串),
- hash(哈希),
- list(列表),
- set(集合)及
- zset(sorted set:有序集合)。
以上就是最全最详细的PHP面试题(带有答案)的详细内容