PHP 笔试 + 面试题
PHP 笔试 + 面试题本章主要介绍常见的 PHP 笔试 + 面试题,包括:
[*]基础及程序题
[*]数据库技术题
[*]综合技术题
[*]项目及设计题
[*] 基础及程序题
写一个排序算法,可以是冒泡排序或者是快速排序,假设待排序对象是一维数组(不能使用系统已有函数)(C/C++、PHP、Java)
[*]假设以下的排序都是从小到大排序
[*]C++ 实现冒泡排序
#include <iostream>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 > arr) { int temp = arr; arr = arr; arr = 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 << " ";// 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 => 1 => 2 => 3 => 4 => 5 => 6 => 7 => 8 => 9 )}bubbleSort([5, 1, 7, 2, 9, 3, 6, 8, 0, 4 ], 10);// 数组大小
[*]C++ 实现快速排序
#include<iostream>void quickSort(int arr[], int i, int j) { if (i < j) { int l = i, r = j; int pivot = arr;// 选择一个基准值 while (i < j) { while (i<j && arr >= pivot) { j--;// 如果后面的数比基准值大,就往前找 } arr = arr; while (i<j && arr <= pivot) { i++;// 如果前面的数比基准值小,就往后找 } arr = arr; } arr = pivot;// 或者 arr = 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 << " ";// 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 => 1 => 2 => 3 => 4 => 5 => 6 => 7 => 8 => 9 ) 实现一个字符串截取的函数,类似于substr,必须能够截取中文这种多字节编码。假设每个中文也是一个字符,普通的数字、符号、字母也是一个字符。(提示:GB编码的中文字符高位范围是 0x81-0xFE )<?php/*** 截取字符串子串 (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"?> 写一个遍历指定目录下所有子目录和子文件的函数(提示:可以使用递归的方法)<?phpfunction 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 . "<br>"; // 输出目录名字 dir_all("$path/$tmp");// 把当前目录名接到 $path 上,递归调用 } else { echo $tmp ."<br>";// 如果是一个文件,直接输出 } } }dir_all("C:\Users\bingo\Desktop\ms");// 输出 ms 文件夹下的所有文件名、子目录名以及子目录下的文件名?> 写出匹配邮箱地址和URL的两个正则表达式。类似下面的:
[*]邮箱地址:user_name.first@example.com.cn
[*]URL地址:http://www.example.com.cn/user_profile.php?uid=100 ** 提示:使用标准的正则表达式,就是 PHP 中 preg_*类的正则处理函数能够解析的正则**
<?php// 匹配邮箱if (preg_match("/^+@(*\.)+{2,}$/i", "user_name.first@example.com.cn")) {// 匹配模式 i 表示不区分大小写 echo "Matching!";// 输出 "Matching!"}else { echo "No Matching!";}// 匹配 URLif (preg_match("/^(http|https):\/\/(*\.)+{2,}(:\d+)?\/+/i", "http://www.example.com.cn/user_profile.php?uid=100")) {// 匹配模式 i 表示不区分大小写 echo "Matching!";// 输出 "Matching!"}else { echo "No Matching!";}?>
[*] 数据库技术题
写出三种以上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 等等。
说出你所知道的三种以上开源数据库的名称(提示:想想目前国外流行的开源数据库)
[*] 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 等等。
MySQL数据库中的字段类型varchar和char的主要区别是什么?那种字段的查找效率要高,为什么? varchar是变长,节省存储空间,char是固定长度。查找效率要char型快,因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型多了一个步骤,所以效率低一些。 说出MySQL 4.0和MySQL 4.1版本的最主要的两个区别。如果你使用过MySQL 5,请说说MySQL 5跟MySQL 4的主要区别。(后半题选作) MySQL 4.1 主要是比MySQL 4.0多了 子查询 和 字符编码的支持 两个特点。 MySQL5增加的功能比MySQL4要更多,包括 存储过程、视图、事务 等等。 MySQL数据库基本的三个优化法则是什么,除了增加硬件和带宽?(提示:从服务配置、应用、开发角度考虑)
[*]系统服务优化,把 MySQL 的 key_buffer、cache_buffer、query_cache等增加容量;
[*]给所有经常查询的字段增加适当的索引;
[*]优化 SQL 语句,减少 distinct、group、join 等语句的操作。
[*] 综合技术题
请使用JavaScript写出三种产生一个Image 标签的方法(提示:从方法、对象、HTML角度考虑)
[*]方法角度:var img = document.createElement("img");
[*]对象角度:var img = new Image();
[*]HTML角度:img.innerHTML = '<img src = "xxx.jpg" />';
请使用CSS样式,描述两种方法在当前列中只显示一个div对象
[*]display: none;// 对象隐藏后,隐藏部分不占据空间大小
[*]visibility:hidden; // 对象隐藏后,隐藏部分还占据着空间大小
[*]$("#id").hide(); // JQuery 方法,隐藏部分还占据着空间大小
请描述出两点以上XHTML和HTML最显著的区别 网页编码的发展: HTML => XHTML => XML
[*]XHTML 必须强制指定文档类型DOCTYPE,HTML比较随意;
[*]XHTML 区分大小写,要求标签必须小写,HTML比较随意;
[*]XHTML 的标签要闭合,HTML比较随意;
[*]XHMTL 的属性值必须在引号之中,HTML比较随意;
[*]XHMTL 不支持属性最小化,如 checked = "checked",在HTML中可以简写成 checked,但 XHTML不允许简写。
写出五种以上你使用过的 PHP 的扩展的名称(提示:常用的PHP扩展) MySQL、PDO 、GD、socket、MB_Sring、Iconv、Curl、SHM、libxml 等等。 了解MVC模式吗?请写出三种以上目前PHP流行的MVC框架名称(不区分大小写)
[*] MVC模式(Model-View-Controller):软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
[*] 模型Model:管理数据库相关的数据和业务逻辑。模型提供了连接和操作数据库的抽象层。
[*] 视图View : 负责界面显示,如 HMTL/XML/JSON 显示。
[*] 控制器Controller:接收用户的请求,并调用相应的模型处理。
https://ask.qcloudimg.com/http-save/yehe-1733635/putwkzjdhi.png?imageView2/2/w/1620 MVC 结构图.png
[*] PHP流行的MVC框架名称:ThinkPHP、Zend Framework、CakePHP、php.MVC、FleaPHP、Symfony、Plite、PHP on Trax、Smutty 等等。
写出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 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 [计算表达式]
使用过Vim编辑器吗?如果使用过,如何在vim里切分多个可视化窗口,包括横排和纵排。(本题选作) vi 进入命令模式后,输入 :sp 或 :vsp 即可横排和竖排切分可视化窗口。 横:split(sp);纵:vsplit(vsp) 说说Linux下的find命令和grep命令的区别(本题选作) find:可以按照文件名、文件类型、文件大小、文件修改/访问时间查找; grep:按照文件内容查找(正则表达式)。 请描述出七层网络模型的名称,由下到上(可以使用中文描述) OSI参考模型:https://ask.qcloudimg.com/http-save/yehe-1733635/n1skn5o1o5.png?imageView2/2/w/1620 OSI 七层参考模型.png
说说下面这些这些协议的全称和中文解释(提示:都是工作在应用层)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) 域名系统(服务)协议
使用过Memcache缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?(本题选作)
[*]Memcache 是把所有的数据保存在内存当中,采用hash表的方式,每条数据由key和value组成,每个key是独一无二的,当要访问某个值的时候先按照键找到值,然后返回结果。
[*]Memcahce采用LRU(Least Recently Used)算法来逐渐把过期数据清除掉。
请大致的说说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,从而获取到IT论坛的信息。
[*] 区别:Cookie机制采用的是在客户端(浏览器)保持状态的方案,而Session 机制采用的是在服务器端保持状态的方案。
[*] 可参考文章: PHP中Session和Cookie的探究
说说你所了解的搜索引擎包含那些技术?(本题选作) 爬虫(采集)、切词(分词)、索引(存储)、查询以及IT论坛相关技术等。
[*] 项目及设计题
一个Web开发团队开发中,大致说说你所了解的所有成员的分工合作情况 分为美工、前端开发和后台开发人员,美工负责界面效果设计、前端开发负责用户交互和设计,后台开发人员负责服务端的开发。 说说你做过的最得意的项目或者个人开发作品(可以是个人作品,也可以是合作项目) 这个,你猜... 假设给你5台服务器,请大致的描述一下,如何使用你所熟悉的开源软件,搭建一个日PV 300万左右的中型网站 PV(page view):页面浏览量,或点击量,表示一个访问者在24小时内浏览了你网站的几个页面。这里需要强调:同一个人浏览网站同一个页面,不重复计算 PV 量,点100次也算1次。 构思(仅供参考):3台Web服务器,两台MySQL数据库服务器,采用Master/Slave同步的方式减轻数据库负载,Web服务器可以结合Memcahe缓存来减少负载,同时三台Web服务器内容一致,可以采用DNS轮询的方式来进行负载平衡 。以上就是本章的全部内容,欢迎指出错误和补充!摘自:https://cloud.tencent.com/developer/article/1108370
页:
[1]