
个人感受:
面试官人挺nice的,中间不会、不理解问题都耐心帮讲解,非常感谢。前面是面试题基础知识点的东西,后面两个人聊了聊其他方面的。总体下来,由于前面的面试题好多自己都没有答对,也没有答到点上去,觉得一点自信心也没有,在好多基础方面都了解的不够,不深。
不足方面:
PHP面向对象【public protected private 和static abstract区别,使用方法】、几种设计模式 【单例类,工厂类,迭代器类等】,MySQL数据库【联合索引、数据字段类型int,char vachar等】,PHP Nginx和Apache配置,PHPredis服务器,HTTP协议状态码区别 ,Linux常见命令等
面试问题:
1、isset 和empty的区别:
<?php $a=0;// 0 null '' false ‘0’带引号的0 array() 都输出哈哈 if(empty($a))echo '哈哈'; //isset 只有null、没有赋值,为假 不输出11 if(isset($a))echo 11; ?> echo true;为1 echo false; 为空 echo null; 为空
2、关于 && || 的区别:
&& 与 $x && $y 如果 $x 和 $y 都为 true,则返回 true。 如果$x 为真 判断$y 如果$x为假结束。
|| 或 $x || $y 如果 $x 和 $y 至少有一个为 true,则返回 true。无论$x真或者假,$x 和$y 都会执行。
3、COOKIE和SESSION区别:
这里有个点,,明明自己看到了(从未执行过)--
setcookie 只影响下次访问页面时候的$_COOKIE的值,本次$_COOKIE的值不会因为setcookie而改变。
setcookie('name','tom'); var_dump($_COOKIE['name']); $_SESSION['name'] = 'jony'; var_dump($_SESSION['name']);
第一次的时候,会报错没有name这个变量。当刷新后,再次执行时,返回tom jony。
4、类变量name 和award的区别是什么?
考点:初始化顺序和存储位置区别:
1:静态方法和变量,不需要实例化即可使用,存放在类里
2:非静态方法和变量,存放在对象里,需要实例化才可使用。
3:静态方法和变量在整个执行的过程中最先初始化后再执行后面的代码
5、查询时出现乱码,怎么解决?
设置字符编码的方法:
1. 文件属性(另存为)
2.文件meta(设置浏览器解析的时候) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> HTML5 使用<meta charset="UTF-8">减少代码量
3. 连接数据库时编码设定 mysql_query(‘SET NAMES utf-8’);
4. PHP文件中使用header函数确定编码 header("Content-type:text/html;charset=utf-8")
6、订单表中有联合索引 orderId、userId,请问 select * from order where userId = 1 and orderId = 123; 会使用到联合索引吗?
index idx_orderId_userId(orderId,userId) 能否用到idx_orderId_userId这个索引
这里我对联合索引不明白。所以就没有答上来。
整理后:
联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。
两个或更多个列上的索引被称作复合索引。
利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。
下面这个很形象,简单易懂。
复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知 道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。
所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。
创建联合索引:
在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。
1.ALTER TABLEALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。
2.CREATE INDEXCREATE INDEX可对表增加普通索引或UNIQUE索引。
CREATE INDEX index_name ON table_name (column_list)
CREATE UNIQUE INDEX index_name ON table_name (column_list)
table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。
以上摘自:mysql联合索引。特此感谢。
7、用户表中有int型字段A1,能否用来存储11位手机号?因为int存不下11位呀机号码的本质是字符串, 虽然是纯数字组成的.
还能实现将来可能的区位查询.
是的, INT 无法存下手机号, 还要 BIGINT 才行.
8、如何查看php-fpm监听的端口号?
php7/etc/php-fpm.conf
listen = 127.0.0.1:9000
#fpm监听端口,即nginx中php处理的地址,一般默认值即可。可用格式为: 'ip:port', 'port', '/path/to/unix/socket'. 每个进程池都需要设置.
9、如何查看php-fpm服务监听端口正常?netstat 查看网络状态,监控网络。这点不是太熟悉,现在还没有懂
10、常用redis的有几种数据类型?如何写入和读取hash值?
redis 支持五种数据类型,分别是:字符串,list(链表),hash,set(集合),zset(有序集合)
写入和读取
字符串(string):$redis->set('key',value);$redis->get('key') $redis->expire('key',time) $reids->connect('ip',port,time) $redis->incr() 自增+1 $redis->decr()自减 -1 $redis->append(key,value)这个我觉得挺有用的,在先有key后面加入 value。$redis->strlen(),键值长度。
list(链表):$redis->lpush() 在表头新增数据 $redis->rpush() $redis = new Redis();
$redis->connect('127.0.0.1', 6379); $redis->lpush('name','hhahahha'); $redis->lpush('name','jjjjj');
var_dump($redis->lpop('name'));
var_dump($redis->lrange('name',0,-1));
hash:
$redis->hset('key','filed','value');$redis->hmset('key',$arr);$redis->hget('key',filed);$redis->hmget('key',$arr)返回指定哈希下指定下标filed
$key = 'oo';
$redis->hset($key, 'field1', 'val1'); //设置一个key-value键值对
$redis->hmset($key, array('field2'=>'val2', 'field3'=>'val3')); //设置多个k-v键值对
$redis->hget($key, 'field2'); //获取hash其中的一个键值
$jj = $redis->hmget($key, array('field2', 'field1')); //获取hash的多个键值
$nn = $redis->hgetall($key); //获取hash中所有的键值对
set:
$redis->sadd('key',value1,value2,'''). $redis->srem('key',value1,value2),移除指定值,$redis->smembers('key') $redis->spop($key); //移除并获取集合内随机一个元素
$redis->sadd('gg','11','qq','ww'); $nn = $redis->spop('gg'); $jj = $redis->spop('gg'); var_dump($jj); var_dump($nn);11/qq/www
zset:
$redis->zAdd('key',2,'member1',3,'memberN'); $nn = $redis->zcard('key'); // $jj = $redis->zrem('key','member1'); $jj = $redis->zrange('key',0,-1); var_dump($jj); var_dump($nn);
11、502 、403 状态码是什么意思?
3xx 表示重定向
400 Bad Request语义有误,当前请求无法被服务器理解。 403 Forbidden服务器已经理解请求,但是拒绝执行它。 404 Not Found请求失败,请求所希望得到的资源未被在服务器上发现。 502 Bad Gateway作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。网关错误nginx返回502,是收到了服务理解的相应1. nginx和php-fpm无法连接
2. nginx和php-fpm的链接被异常的断开
12、一个完整的单例类基本要素有哪些?
1、私有静态变量,私有构造函数和私有克隆函数,公共静态方法 。一公两静 三私
class SingetonBasic { private static $instance; private $config; // other vars.. private function __construct($config) { // do construct.. $this->config = $config; } private function __clone() {} public static function getInstance($config) { if (!(self::$instance instanceof self)) { //instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例: self::$instance = new self($config); } return self::$instance; } public function getConfig(){ echo $this->config; } // other functions.. } $a = SingetonBasic::getInstance('1');// $a->getConfig();//1 $b = SingetonBasic::getInstance('4'); $b->getConfig();//1 //var_dump($a === $b); $b 没有创建对象,而是直接使用了$instance保存的唯一对象
被问的也就这么多,但是感觉还有好多,简历上虽然写了,但是还是不太会。加油,每面一次,就总结下,不断进步。
最后:非常感谢面试官,那么有耐心。
文章来源: 2018 PHP滴滴-顺风车PHP研发实习生面试总结人吐槽 | 人点赞 |
发表评论