优信php笔试题_PHP 笔试 + 面试题

本章主要介绍常见的 PHP 笔试 + 面试题,包括:

基础及程序题

数据库技术题

综合技术题

项目及设计题

基础及程序题

[1] 写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一维数组(不能使用系统已有函数)(C/C++、PHP、Java)

假设以下的排序都是从小到大排序

C++ 实现冒泡排序

#include

void bubbleSort(int arr[], int n) // n 为数组大小

{

for (int i = 0; i < n - 1; i++) { // n-1 趟排序

for (int j = i + 1; j < n; j++) {

if (arr[i] > arr[j]) {

int temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

}

}

}

}

int main()

{

int arr[10] = { 5, 1, 7, 2, 9, 3, 6, 8, 0, 4 };

bubbleSort(arr, 10); // 数组大小

for (int i = 0; i < 10; i++) {

std::cout << arr[i] << " "; // 0 1 2 3 4 5 6 7 8 9

}

}

PHP 实现冒泡排序

function bubbleSort($arr, $n) // $n 为数组大小

{

for ($i = 0; $i < $n - 1; $i++) { // n-1 趟排序

for ($j = $i + 1; $j < $n; $j++) {

if ($arr[$i] > $arr[$j]) {

$temp = $arr[$i];

$arr[$i] = $arr[$j];

$arr[$j] = $temp;

}

}

}

print_r($arr); // Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 )

}

bubbleSort([5, 1, 7, 2, 9, 3, 6, 8, 0, 4 ], 10); // 数组大小

C++ 实现快速排序

#include

void quickSort(int arr[], int i, int j)

{

if (i < j) {

int l = i, r = j;

int pivot = arr[i]; // 选择一个基准值

while (i < j) {

while (i= pivot) {

j--; // 如果后面的数比基准值大,就往前找

}

arr[i] = arr[j];

while (i

i++; // 如果前面的数比基准值小,就往后找

}

arr[j] = arr[i];

}

arr[i] = pivot; // 或者 arr[j] = pivot;

quickSort(arr, l, i - 1); // 左边

quickSort(arr, i + 1, r); // 右边

}

}

int main()

{

int arr[10] = { 5, 1, 7, 2, 9, 3, 6, 8, 0, 4 };

quickSort(arr, 0, 9);

for (int i = 0; i < 10; i++) {

std::cout << arr[i] << " "; // 0 1 2 3 4 5 6 7 8 9

}

}

PHP 实现快速排序

function quickSort(& $arr, $i, $j) // 传引用调用

{

if ($i < $j) {

$l = $i;

$r = $j;

$pivot = $arr[$i];

while ($i < $j) {

while ($i < $j && $arr[$j] >= $pivot) {

$j--;

}

$arr[$i] = $arr[$j];

while ($i < $j && $arr[$i] <= $pivot) {

$i++;

}

$arr[$j] = $arr[$i];

}

$arr[$i] = $pivot;

quickSort($arr, $l , $i - 1);

quickSort($arr, $i + 1 , $r);

}

}

$arr = [0, 1, 8, 6, 2, 5, 4, 9, 3, 7];

quickSort($arr, 0, 9);

print_r($arr); // Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 )

[2] 实现一个字符串截取的函数,类似于substr,必须能够截取中文这种多字节编码。假设每个中文也是一个字符,普通的数字、符号、字母也是一个字符。(提示:GB编码的中文字符高位范围是 0x81-0xFE )

/**

* 截取字符串子串 (GBK)

*

* @param string $str 原始字符串

* @param int $len 需要截取字符串的长度

* @return string 返回截取到的字符串

*/

function GBSubstr($str, $len){

$count = 0;

for($i = 0; $i < strlen($str); $i++){

if($count == $len) break;

if(preg_match("/[\x81-\xfe]/", substr($str, $i, 1))) { // 如果检测到 GBK 中文编码的高位 0x81-0xFE

++$i; // 跳过低位,继续向后匹配

}

++$count; // 次数

}

// echo $i; 这时 $i 的值为 9

return substr($str, 0, $i); // $i 是加上中文后的字符串长度

}

echo GBSubstr("ab喜cdefgh",7); // 从头开始截取一个长度为 7 的字符串; 输出 "ab喜cdef"

?>

[3] 写一个遍历指定目录下所有子目录和子文件的函数(提示:可以使用递归的方法)

function dir_all($path) {

$handler = opendir($path);

while (false !== ($tmp = readdir($handler))) { // $tmp 第 1 次是 ".",第2次是 "..", 之后是文件名或目录名,和Linux中使用 ls 的效果一样

if(is_dir("$path/$tmp")) { // 如果是一个目录

if ($tmp == "." || $tmp == "..") // 不输出,也不递归调用

continue;

echo $tmp . "
"; // 输出目录名字

dir_all("$path/$tmp"); // 把当前目录名接到 $path 上,递归调用

}

else {

echo $tmp ."
"; // 如果是一个文件,直接输出

}

}

}

dir_all("C:\Users\bingo\Desktop\ms"); // 输出 ms 文件夹下的所有文件名、子目录名以及子目录下的文件名

?>

[4] 写出匹配邮箱地址和URL的两个正则表达式。类似下面的:

// 匹配邮箱

if (preg_match("/^[0-9a-z][0-9a-z\_\-\.]+@([0-9a-z][0-9a-z\-]*\.)+[a-z]{2,}$/i", "user_name.first@example.com.cn")) { // 匹配模式 i 表示不区分大小写

echo "Matching!"; // 输出 "Matching!"

}

else {

echo "No Matching!";

}

// 匹配 URL

if (preg_match("/^(http|https):\/\/([0-9a-z][0-9a-z\-]*\.)+[a-z]{2,}(:\d+)?\/[0-9a-z%\-_\/\.]+/i", "http://www.example.com.cn/user_profile.php?uid=100")) { // 匹配模式 i 表示不区分大小写

echo "Matching!"; // 输出 "Matching!"

}

else {

echo "No Matching!";

}

?>

数据库技术题

[1] 写出三种以上MySQL数据库存储引擎的名称(提示:不区分大小写)

存储引擎:研究存储数据、为存储的数据建立索引和更新、查询数据等技术的实现方法。存储引擎也可以称为表类型(即存储和操作此表的类型)。

MyISAM:缺点是无法处理事务。适合场景:

① 选择密集型的表:MyISAM 存储引擎在筛选大量数据时非常迅速。

② 插入密集型的表:MyISAM 的并发插入特性允许同时选择和插入数据,例如:MyISAM很适合管理邮件或Web服务器日志数据。

InnoDB:健壮的事务型存储引擎,5.5版本之后的默认的存储引擎。InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择:

① 更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。

② 事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。

③ 自动灾难恢复。与其它引擎不同,InnoDB能够自动从灾难中恢复。

④ 外键约束。MySQL支持外键的存储引擎只有InnoDB。

⑤ 支持自动增加列AUTO_INCREMENT属性。

一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDB是不错的选择。

Memory:优点是速度,采用的逻辑存储介质是系统内存。但当进程崩溃时,所有的Memory数据都会丢失。它要求存储在Memory数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是一种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。

一般在以下几种情况下使用Memory存储引擎:

① 目标数据较小,而且被非常频繁地访问。

② 如果数据是临时的、要求必须立即可用,那么就可以存放在内存表中。

③ 存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。

Merge:一组MyISAM表的组合,MyISAM表结构必须完全相同。

Archive:归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能。

还有 BDB(Berkeley DB)、Example、Federated、CSV、Blackhole、MaxDB 等等。

[2] 说出你所知道的三种以上开源数据库的名称(提示:想想目前国外流行的开源数据库)

MySQL :单机的关系数据库,普及了「可插拔」引擎这一概念,针对不同的业务场景选用不同的存储引擎是 MySQL tuning 的一个重要的方式。比如对于有事务需求的场景使用 InnoDB;对于并发读取的场景 MyISAM 可能比较合适。 MySQL 5.6 中引入了多线程复制和 GTID(全局事务ID),使得故障恢复和主从的运维变得比较方便。另外,5.7是 MySQL 的一个重大更新,主要是读写性能和复制性能上有了长足的进步。

** PostgreSQL**:单机的关系型数据库,对 SQL 支持非常强大,不管是内置类型、JSON 支持、GIS 类型以及对于复杂查询的支持,PL/SQL 等都比 MySQL 强大得多,而且从代码质量上来看,PostgreSQL 的代码质量是优于 MySQL 的。相对于MySQL 5.7以前的版本,PostgreSQL 的 SQL 优化器比 MySQL 强大很多,几乎所有稍微复杂的查询PostgreSQL 的表现都优于 MySQL。PostgreSQL 的不足之处在于没有 MySQL 那样强大的社区和群众基础。

NoSQL:分布式非关系型数据库,包含的范围有内存数据库,持久化数据库等。大多 NoSQL 都抛弃了关系模型,选择更简单的键值或者文档类型进行存储。数据结构和查询接口都相对简单,没有了 SQL 的包袱,实现的难度会降低很多。另外 NoSQL 的设计几乎都选择牺牲掉复杂 SQL 的支持及 ACID 事务换取弹性扩展能力,业务模型相对简单。

另外,还有SQLite、BDB(Berkeley DB)、Firebird 等等。

[3] MySQL数据库中的字段类型varchar和char的主要区别是什么?那种字段的查找效率要高,为什么?

varchar是变长,节省存储空间,char是固定长度。查找效率要char型快,因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型多了一个步骤,所以效率低一些。

[4] 说出MySQL 4.0和MySQL 4.1版本的最主要的两个区别。如果你使用过MySQL 5,请说说MySQL 5跟MySQL 4的主要区别。(后半题选作)

MySQL 4.1 主要是比MySQL 4.0多了 子查询 和 字符编码的支持 两个特点。

MySQL5增加的功能比MySQL4要更多,包括 存储过程、视图、事务 等等。

[5] MySQL数据库基本的三个优化法则是什么,除了增加硬件和带宽?(提示:从服务配置、应用、开发角度考虑)

系统服务优化,把 MySQL 的 key_buffer、cache_buffer、query_cache等增加容量;

给所有经常查询的字段增加适当的索引;

优化 SQL 语句,减少 distinct、group、join 等语句的操作。

综合技术题

[1] 请使用JavaScript写出三种产生一个Image 标签的方法(提示:从方法、对象、HTML角度考虑)

方法角度:var img = document.createElement("img");

对象角度:var img = new Image();

HTML角度:img.innerHTML = '';

[2] 请使用CSS样式,描述两种方法在当前列中只显示一个div对象

display: none; // 对象隐藏后,隐藏部分不占据空间大小

visibility:hidden; // 对象隐藏后,隐藏部分还占据着空间大小

$("#id").hide(); // JQuery 方法,隐藏部分还占据着空间大小

[3] 请描述出两点以上XHTML和HTML最显著的区别

网页编码的发展: HTML => XHTML => XML

XHTML 必须强制指定文档类型DOCTYPE,HTML比较随意;

XHTML 区分大小写,要求标签必须小写,HTML比较随意;

XHTML 的标签要闭合,HTML比较随意;

XHMTL 的属性值必须在引号之中,HTML比较随意;

XHMTL 不支持属性最小化,如 checked = "checked",在HTML中可以简写成 checked,但 XHTML不允许简写。

[4] 写出五种以上你使用过的 PHP 的扩展的名称(提示:常用的PHP扩展)

MySQL、PDO 、GD、socket、MB_Sring、Iconv、Curl、SHM、libxml

等等。

[5] 了解MVC模式吗?请写出三种以上目前PHP流行的MVC框架名称(不区分大小写)

MVC模式(Model-View-Controller):软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

模型Model :管理数据库相关的数据和业务逻辑。模型提供了连接和操作数据库的抽象层。

视图View : 负责界面显示,如 HMTL/XML/JSON 显示。

控制器Controller :接收用户的请求,并调用相应的模型处理。

MVC 结构图.png

PHP流行的MVC框架名称:ThinkPHP、Zend Framework、CakePHP、php.MVC、FleaPHP、Symfony、Plite、PHP on Trax、Smutty 等等。

[6] 写出15个以上你所知道的常用的Linux命令和它的功能

man ls [查ls的使用手册]

who [查看已登录系统的用户]

more/less 1.txt [主屏显式文件内容]

cat try.c [列出文本文件内容]

> 2.txt [重定向到文件,新建文件]

head/tail -15 ab.c [打印文件头/尾15行,不指定参数默认10行]

ps -ef [列出系统所有进程]

who | wc -l [统计系统已成功登录的用户个数]

grep/egrep [0-9] 1.txt [在文件中查找满足正则式的字符串]

ls -l [长格式的形式显示文件内容]

cp file1 file2 dir [将文件复制到目录中]

cp -r dir1 dir2 [复制目录]

mv 1.txt 2.txt [移动文件并重命名]

rm file1 file2 [删除文件]

find ver1.d ver2.d -name '*.c' -print [在目录中查找文件]

tar cvf dir . [ 压缩,将当前目录开始的整个目录树(.),备份到dir目录下]

tar xvf dir [解压,将dir目录下的数据恢复到文件系统中]

chmod a+rwx 1.txt [修改文件权限]

cd Desktop [修改路径]

echo $addr [打印一个变量]

expr 3 + 4 [计算表达式]

[7] 使用过Vim编辑器吗?如果使用过,如何在vim里切分多个可视化窗口,包括横排和纵排。(本题选作)

vi 进入命令模式后,输入 :sp 或 :vsp 即可横排和竖排切分可视化窗口。

横:split(sp);纵:vsplit(vsp)

[8] 说说Linux下的find命令和grep命令的区别(本题选作)

find:可以按照文件名、文件类型、文件大小、文件修改/访问时间查找;

grep:按照文件内容查找(正则表达式)。

[9] 请描述出七层网络模型的名称,由下到上(可以使用中文描述)

OSI参考模型:

OSI 七层参考模型.png

[10] 说说下面这些这些协议的全称和中文解释(提示:都是工作在应用层)SMTP、POP3、HTTP、FTP、DNS

SMTP (Simple Mail Transfer Protocol) 简单邮件传输协议

POP3 (Post Office Protocol 3) 邮局协议第3版

HTTP (Hypertext Transfer Protocol) 超文本传输协议

FTP (File Transfer Protocol)文件传输协议

DNS (Domain Name System and Domain Name Service protocol) 域名系统(服务)协议

[11] 使用过Memcache缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?(本题选作)

Memcache 是把所有的数据保存在内存当中,采用hash表的方式,每条数据由key和value组成,每个key是独一无二的,当要访问某个值的时候先按照键找到值,然后返回结果。

Memcahce采用LRU(Least Recently Used)算法来逐渐把过期数据清除掉。

[12] 请大致的说说Session的工作原理(提示:与Cookie有相应的关系)

Session的工作原理:

当一个 Session第一次被启用时,一个唯一的标识被存储于本地的 Cookie 中。

首先使用 session_start() 函数,PHP从 Session 仓库中加载已经存储的 Session 变量。

当执行 PHP 脚本时,通过使用 session_register() 函数注册 Session 变量。

当 PHP脚本执行结束时,未被销毁的 Session 变量会被自动保存在本地一定路径下的 Session 库中,这个路径可以通过 php.ini 文件中的 session.save_path 指定,下次浏览网页时可以加载使用。

Session和Cookie的联系以及区别:

联系:Session 在客户端也需要保存一个标识,所以就要借助Cookie;Session是通过Cookie 来工作的;Session 和Cookie 之间是通过 $_COOKIE['PHPSESSID']来联系的,通过 $_COOKIE['PHPSESSID'] 可以知道 Session的 id,从而获取到其他的信息。

区别:Cookie 机制采用的是在客户端(浏览器)保持状态的方案,而Session 机制采用的是在服务器端保持状态的方案。

[13] 说说你所了解的搜索引擎包含那些技术?(本题选作)

爬虫(采集)、切词(分词)、索引(存储)、查询以及其他相关技术等。

项目及设计题

[1] 一个Web开发团队开发中,大致说说你所了解的所有成员的分工合作情况

分为美工、前端开发和后台开发人员,美工负责界面效果设计、前端开发负责用户交互和设计,后台开发人员负责服务端的开发。

[2] 说说你做过的最得意的项目或者个人开发作品(可以是个人作品,也可以是合作项目)

这个,你猜...

[3] 假设给你5台服务器,请大致的描述一下,如何使用你所熟悉的开源软件,搭建一个日PV 300万左右的中型网站

PV(page view):页面浏览量,或点击量,表示一个访问者在24小时内浏览了你网站的几个页面。这里需要强调:同一个人浏览网站同一个页面,不重复计算 PV 量,点100次也算1次。

构思(仅供参考):3台Web服务器,两台MySQL数据库服务器,采用Master/Slave同步的方式减轻数据库负载,Web服务器可以结合Memcahe缓存来减少负载,同时三台Web服务器内容一致,可以采用DNS轮询的方式来进行负载平衡 。

以上就是本章的全部内容,欢迎指出错误和补充!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值