某汽车电子设备有限公司面试题

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 信息。

全部评论(0)
必填
必填,不公开
我信任你,不会填写广告链接
收起