PHP 核心技术面试题

Posted 探寻全球奇闻

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP 核心技术面试题相关的知识,希望对你有一定的参考价值。

1. 写出一个能创建多级目录的 php 函数(新浪网技术部)

2. 写出 smarty 模板的特点(新浪网技术部)

速度快,编译型,缓存技术,插件机制,强大的表现逻辑

3. 打开 php.ini 中的 safe mode,会影响哪些函数?至少说出 6 个。(新浪)

1) 用户输入输出函数(fopen() file() require(),只能用于调用这些函数有相同脚本的拥有者)

2) 创建新文件(限制用户只在该用户拥有目录下创建文件)

3) 用户调用 popen() systen() exec()等脚本,只有脚本处在 safe_mode_exec_dir 配置指令指定的目录中才可能

4) 加强 HTTP 认证,认证脚本拥有者的 UID 的划入认证领域范围内,此外启用安全模式下,不会设置 PHP_AUTH

5) mysql 服务器所用的用户名必须与调用mysql_connect()的文件的拥有者用户名相同

6) 受影响的函数变量以及配置命令达到 40 个

4. 抓取远程图片到本地,你会用什么函数?(51.com 笔试题)

file_get_contents 或者 curl

5. PHP 的垃圾收集机制是怎样的(腾讯)

PHP 可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(referencecounting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个 reference 连接到对象,计数器加 1。当reference 离开生存空间或被设为 NULL,计数器减 1。当某个对象的引用计数器为零时,PHP 知道你将不再需要使用这个对象,释放其所占的内存空间。

6. 请写一段 PHP 代码,确保多个进程同时写入同一个文件成功(腾讯)

核心思路:加锁

PHP 核心技术面试题

7. 写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。(新浪)

PHP 核心技术面试题

8. mysql_fetch_row() 和 mysql fetch array() 有什么分别?

mysql_fetch_row() 把数据库的一列储存在一个以零为基数的数组中,第一栏在数组的索引0,第二栏在索引 1,如此类推。

mysql_fetch_assoc() 把数据库的一列储存在一个关联数组中,数组的索引就是字段名称,例如我的数据库查询送回“first_name”、“last_name”、“email”三个字段,数组的索引便是“first_name”、“last_name”和“email”。mysql_fetch_array() 可以同时送回 mysql_fetch_row() 和mysql_fetch_assoc() 的值。

9. 谈谈对 mvc 的认识

由模型(model),视图(view),控制器(controller)完成的应用程序,由模型发出要实现的 功能到控制器,控制器接收组织功能传递给视图。

10. 写出一个正则表达式,过虑网页上的所有 JS/VBS 脚本(即把 script 标记及其内容都去掉):

$script="以下内容不显示:";

echo preg_replace("//si", "替换内容", $script);

11. Given a line of text $string, how would you write a regular expression to strip all the html tagsfrom it?(Yahoo)

方案一,使用PHP 内建函数 strip_tags() 除去 HTML

标签方案二,自定义函数,如下:

PHP 核心技术面试题

12. 请写一个函数验证电子邮件的格式是否正确(要求使用正则)(新浪)

preg_match('/^[w-.]+@[w-]+(.w+)+$/', $email);

13. 请写出并说明如何在命令行下运行 PHP 脚本(写出两种方式)同时向 PHP 脚本传递参数?(腾讯)

首先进入 php 安装目录

php -f d:/wamp/www/1.php其中-f 参数指定要执行的php 文件

php -r phpinfo();其中-r 表示直接执行 php 代码,无需写开始结束标记

14. 一个函数的参数不能是对变量的引用,除非在 php.ini 中把 __设为 on。

allow_call_time_pass_reference

是否启用在函数调用时强制参数被按照引用传递

15. 编写函数取得上一月的最后一天

PHP 核心技术面试题

16. 写出两种对变量加密的函数?

md5($str); sha1($str);

17. 如何把 2009-9-2 10:30:25 变成 unix 时间戳?

18. 对于大流量的网站, 您采用什么样的方法来解决访问量问题?

1) 确认服务器硬件能否支持当前的流量

对于普通的 pc server 来说,它能够独立支持每天10 万个独立 ip 访问,如果访问量过大, 最好更好性能更高的专用服务器。

2) 优化数据库的访问

服务器的负载过大,一个重要的原因就是 CPU和内存负载过高,而读写数据在这块占据较多的资源。可以从页面静态化、memcache 缓存和 mysql优化几个方面着手。

3) 禁止外部盗链

占用较大的流量,防盗链,使用 reference 来判断一下。如果是图片的话,使用添加水印即可很好的防止。

4) 控制大文件的下载

最好把文件下载的容量控制为相对较小的一个值,如果有大文件下载,最好使用专用的 服务器。

5) 使用多台主机实现分流,集群

6) 使用流量分析软件进行分析统计 谷歌 和百度

19. 列举 web 开发中的安全性问题

sql 注入攻击。

数据库操作安全,UPDATE、 DELETE、INSERT 的操作没有限制用户操作权限,这将是一件很危险的事情。

没有验证用户 http 请求的方式 POST 或者 GET,GET 请求被合法通过。

没有验证表单来源的唯一性,不能识别是合法的表单提交还是黑客伪造的表单提交。

XSS 攻击。

20. 使用过 Memcache 缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?

Memcahce 是把所有的数据保存在内存当中,采用 hash表的方式,每条数据由 key 和

value 组成,每个 key 是独一无二的,当要访问某个值的时候先按照找到值,然后返回结果。

Memcahce 采用 LRU 算法来逐渐把过期数据清除掉。

数据结构和算法

1请使用冒泡排序法对以下一组数据进行排序 10 2 36 14 10 25 23 85 99 45。

2. 写出你所知道的排序方法 (亿邮)

冒泡排序,快速排序,插入排序,选择排序,

3. 我们希望开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储 在一个整形数组里。 (鑫众人云)

没有固定答案,简单洗牌算法参考

$card_num=54; //牌数

function wash_card($card_num){

$cards=$tmp=array(); for($i=0;$i

$tmp[$i]=$i;

}

for($i=0;$i

$index=rand(0,$card_num-$i-1);

$cards[$i]=$tmp[$index]; unset($tmp[$index]);

$tmp=array_values($tmp);

}

return $cards;

}

测试:print_r(wash_card($card_num));

PHP 网络编程

1. 禁用 COOKIE 后 SEESION 还能用吗?

可以,Cookie 和 session 都是用来实现会话机制的,由于http 协议是无状态的,所以要想跟踪一个用户在同一个网站之间不同页面的 状态,需要有这么一个机制----会话机制。

Cookie:将会话信息的保存到浏览器端。

Session:将会话信息保存到服务器端。

session 默认情况下是基于 cookie 的,对于 session 来说,每生成一个 sessionid,都会将其发送到浏览器端,让后将其保存到 cookie 当中。如果禁用了 cookie,则基于cookie 的 session 不好使了,我们可以使用 get,传递SID, 或者直接开启透明的 SID(此时需要关闭基于cookie 的 session 配置项)。

相关题目:session 与 cookie 的区别?

Cookie 保存在客户端,而 session 则保存服务器端。从安全性的角度来讲,session 的安全性要高。

从保存内容的类型的角度来讲,cookie 只保存字符串(及能够自动转换成字符串),而

session 则可以保存所有的数据类型。从保存内容的大小的角度来讲,cookie 保存的内容是有限制的,比较小,而 session 基本上没有这个限制。从性能的角度来讲,用 session 的话,对服务器的压力会更大一些。

2. 如何修改 SESSION 的生存时间?

要注意这里的生存时间指的是什么? 由于 session 默认是基于 cookie 的,也就是说使用session 会话技术,首先是将 session 数据保存到服务器端,其次会将 sessionID 保存到浏览器端, 保存在服务器端的 session 文件生命周期由 php.ini 中的 session.gc_maxlifetime 、gc_probability 和 gc_divisor 来决定,而保存在客户端的 sessionID 由客户端 cookie 来决定, 默认其生存周期直到浏览器关闭,它由 php.ini 中的设置 session.cookie_lifetime 来控制,二者共同来决定 session 的生存时间,二者中的其中任意一个失效了,就有可能造成 session 失效,要根据自己的需求来决定是要从哪方面来修改其生存时间。

参考 1:将 php.ini 中的 session.gc_maxlifetime 设置为 9999 重启 apache

参考 2:

$savePath = "./session_save_dir/";

$lifeTime = 小 时 * 秒 ; session_save_path($savePath); session_set_cookie_params($lifeTime); session_start();

参 考 3: session_start();

$lifeTime = 24 * 3600; // 保存一天

setcookie(session_name(), session_id(), time() + $lifeTime, "/");

3. COOKIE、SESSION 的联系和区别,多台 web 服务器如何共享 SESSION?

COOKIE 和 SEESIO 都是用于会话机制,COOKIE 保存在客户端,而SESSION 则保存在服务器端。在默认情况下,SESSION 机制是基于 COOKIE 的,每生成一个SESSIONID, 都会将其发送到浏览器端,让后将其保存到COOKIE 当中,在下次请求的时候,由浏览器携带这个COOKIE。要想多台 web 服务器共享 SESSION,可以利用 MySQL 数据库存储并共享 Session 数据

4. HTTP/1.0 中,状态码 200 301 304 403 404 500 的含义 (小米)

200 OK 服务器成功处理了请求

301 Moved Permanently(重定向)请求的 URL 已移走

304 Not Modified(未修改)客户的缓存资源是最新的, 要客户端使用缓存

403 Forbidden(禁止)请求被服务器拒绝了404 Not Found 未找到资源

Internal Server Error(内部服务器错误)服务器遇到一个错误,使其无法为请求提供服务

5. 简述 Tcp 协议的三次握手过程。 (亿邮)

TCP 是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

第一次握手:建立连接时,客户端发送 syn包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认;

第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;

第三次握手:客户端收到服务器的 SYN+ACK包,向服务器发送确认包 ACK(ack=k+1), 此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。

6. 你会用哪个函数设置当前内容的 Content-Type? (卓望)

header 函数

Linux 部分

1. 请解释下列 10 个 shell 命令的用途(新浪网技术部)

top、ps、mv、find、df、cat、chmod、chgrp、grep、wc

top:该命令提供了实时对系统处理器状态的监控,它能够实时显示系统中各个进程的 资源占用情况。该命令可以按照对 CPU、内存使用和执行时间对系统任务进程进行排序显示,同时还可以通过交互式命令进行设定显示。

ps:显示系统进程在瞬间的运行动态。

mv:文件/目录改名或变更存储位置。

find:在指定的路径下查找指定文件。

df:检查磁盘空间占用情况。

cat:将文件的内容打印到标准输。chmod:改变文件的权限。

chgrp:改变文件所属组。

grep:过滤文本,根据指定的字符串,对文件的每一行进行搜索,如找到,则输出该行 内容。

wc:统计指定文件中的字节数、字数、行数,并将统计结果显示输出。

相关题目:写出 15 个以上你所知道的常用的 Linux 命令和它的功能。

ls:列目录cp:复制rm:删除

cat:将文件的内容打印到标准输出

mkdir: 建立目录

dd:切换目录

ps:查看进程

top:查看机器使用情况

df:检查磁盘空间占用情况 find:在指定路径下查找指定文件

grep:过滤文本

cd:改变当前工作目录

mount:挂载/卸载指定的文件系统

ifconfig:配置网络或显示当前网络接口状态

telnet::远程登录

2. vi 编辑器中,选中、复制、粘贴、删除的命令各是什么(酷讯)

选中:v(以字符为单位),V(以行为单位)复制:y,如 yy,nyy,y1G,yG,y0,y$

粘贴:p(粘贴在光标之后),P(粘贴在光标之前)删除:d,如 dd,ndd,d1G,dG,d$,d0

3. 获取文件行数 (酷讯)

wc -l filename

4. 输入文件的最后 5 行到另一个文件中 (酷讯)

tail -n 5 file1 >> file2

5. 查找文件中包含 hello 的行 (酷讯)

grep hello filename

6. 查找当前目录下所有目录名为 CVS 的子目录的命令 (酷讯)

find ./CVS -maxdepth 1 -type d -print

7. Linux 上的 crond 服务可对服务器设置计划任务,请问如果我需设置每 2 分钟执行一次

/tmp/test.sh 的脚本应如何设置计划任务,请写出操作方法。

首先用 root 用户的权限登录。

切换到/etc/init.d/目录下,使用命令:crond start 启动crond 服务

切换到/etc/目录下,使用命令: crontab –e

编辑如下:*/2 * * * * /tmp/test.sh

8. Linux 下终止一个进程用什么命令?打包压缩和解包用什么命令?软连接和硬链接有什么区别?建立软连接的命令是? (卓望)

终止进程的命令:kill

打包压缩和解包命令:tar

建立软连接的命令:ln -s 源文件 目标链接名

硬链接是通过文件系统的 inode 来产生新文件名,而不是新文件,它只是在某个目录新建一条文件名链接到某inode 号码的管理记录而已,而软链接是创建一个独立的文件,该文件会让数据的读取指向它链接的那个文件的文件名,类似于 windows 中的快捷方式。

以上是关于PHP 核心技术面试题的主要内容,如果未能解决你的问题,请参考以下文章

一份PHP核心技术面试题,跳槽必备!

php面试题之一——PHP核心技术(高级部分)

PHP 核心技术面试题

免费领取:24个Java核心常用技术栈解析,2000道常见大厂面试题合集

大数据技术核心框架最强知识体系总结||(2021版)(含面试题)

字节跳动高频111道核心前端面试题解析