某汽车电子设备有限公司面试题
PHP中魔术方法
问: PHP中魔术方法有哪几个?请举例说明各自的用法。
答:
__set() // 赋值的变量不存时调用
__get() // 获取的变量不存时调用
__isset() // 检测一个对象的属性是否存在时被调用
__unset() // 释放一个对象的属性时被调用
__construct // 构造方法
__destruct // 析构方法
__toString() // 打印对象时调用
__aoutload() // 类不存在时调用
__call()// 方法不存在时调用
__sleep() // serialize 之前被调用
__wakeup() // unserialize 之前被调用
__clone() // 克隆对象时被调用
数组里的空值
问: 写出将一个数组里的空值去掉的语句。
答: array_filter($array);
输出指定月的天数
问: 写出一个函数,参数为年份和月份,输出结果为指定月的天数。
答:
// 方法一
cal_days_in_month(CAL_GREGORIAN, 8, 2003);
// 方法二
function getDays($date){
$days=date("t",strtotime($date));
return $days;
}
$date="2018-11";
echo getDays($date);
// 方法三
function toTime($year,$month){
$days = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
if (2 == $month && 0 === ($year % 4) && (0 !== ($year % 100) || 0 === ($year % 400))) {
$days[1] = 29;
}
return ($days[$month - 1]);
}
echo toTime(2019, 2);
接本地数据库语句
问: 请用 PHP 写出连接本地 MySQL,Redis,MongoDB 的语句
MySQL 数据库为 dbtest,user:root,Passwore:123;mongdb 数据库为:mongotest,user:actia,passwored :123;
答:
// MySQL(mysql)
$link = mysql_connect('127.0.0.1','root','123');
// MySQL(PDO)
$dbh = new PDO('mysql:dbtest;host=127.0.0.1','root','123');
// Redis
$redis = (new Redis())->connect('127.0.0.1', 6379);
// MongoDB(mongoDB)
$m = new MongoClient('mongodb://actia:123@127.0.0.1:27017/mongotest');
数据库查询
问: 以下有两个表
user 表 字段 id(int),name(varchar)
score 表 字段 uid(int),subject(varchar),score(int)
score 表的 uid 字段与 user 表的 id 字段关联
要求写出以下sql语句
答:
#1 在 user 表里新插入一条记录,在 score 表里插入与新加入的记录关联的记录
insert into `user` (name) values ('小王');
insert into `score` (uid,subject,score) value ((select id from `user` order by id desc limit 1),'英语',60);
#3 使用联合查询获取 name 为“张三”的用户的总分数。
select SUM(score) '总分' from `user` a,`score` b where a.name = '小明' and a.id = b.uid ;
#4 删除 name 为“李四”的用户,包括分数记录。
delete from `score` where uid = (select id from `user` a where a.name = '小明' limit 1);
delete from `user` where name = '小明';
#5 清空 score 表
truncate `user`;
#6 删除 user 表
drop table if exists `user`;
CGI 和 FastCGI
问: 请问 cgi 和 fastcgi 有什么不同,你在什么情况下会选择哪个?
答: 对于 CGI 来说,每一个 Web 请求 PHP 都必须重新解析 php.ini 、重新载入全部扩展,并重新初始化全部数据结构。而使用 FastCGI ,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接可以工作。
慢查询
问: 如果某段与数据库交互的程序运行较慢你将如何处理?怎么查看 SQL 运行效率?
答: 首先提高数据库的查询速度,比如增加索引,优化表的结构。二是优化程序代码,如果查询比较多,可以尽量用条件查询,减少查询语句,比如能用一条查询语句就不用两条。三就是提高服务器的速度,优化服务器,把不必要的进程关掉。在 SQL 语句前面加上 explain 就可以查看 SQL 运行效率了。
防止脚本攻击
问: 用户在网站表单提交数据的时候,为了防止脚本攻击,PHP 端接收数据的时候,应该如何处理?防止SQL 注入漏洞一般用什么函数?
答: 数字注入,对值进行强校验。字符串注入,限制字符串类型。对字符串进行转义,addslashes()
、 mysqli_set_charset()
。预编译机制。
$stmt = mysqli_prepare($db,$sql);
mysqli_stmt_bind_param($stmt,'ss',$a,$b);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt,$id,$user_name);
mysqli_stmt_fetch($stmt);
Redis消息队列机制原理
问: Redis的列表类型天生支持用作消息队列
答:
<?php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
// 入队列
$v = '123';
$redis->rpush("mylist",$v);
// 出队列
$value = $redis->lpop('mylist');
大并发解决方案
问: 对于大流量的网站,您采用什么样的方法来解决访问量问题?
答: 这个问题,请参《PHP秒杀设计》
PV 300万左右的中型网站
问: 假设给你5台服务器,请大致的描述一下,如何使用你所熟悉的开源软件,承载一个日 PV 300万左右的中型网站?
答: 问题太抽象了,不同的网站,优化的侧重点都不一样。
客户层:页面静态化,CDN+OSS
接入层:一台用作反向代理、Reids服务器。
服务层:四台用作服务器层逻辑处理。
数据层:1托4,主从服务器。
负载均衡
问: 负载均衡集群中如何现实 Session 共享
答: 使用一台 Redis 服务器,存放 session 信息。