常见的php面试题

1.HTTP协议中几个状态码的含义200,301,302,400,401,404,500,503

200——请求成功,返回响应头和数据体。

301——重定向,永久性转移

302——重定向,暂时性转移

400——客户端请求代码出错,不能被服务器端理解

401——客户端请求未经授权

404——客户端请求失败,找不到服务器端资源

500——服务器内部错误

503——服务器当前不能处理客户端请求,一段时间后可能恢复正常

 

2.include、requireinclude_oncerequire_once的区别

include和require的主要区别在于应对错误的处理方式不同。

require引入文件出错时(譬如:文件不存在),程序中断执行,并报出一个致命错误。

include引入文件出错时,程序继续执行,并报出一个警告错误。

include_once在于判断文件是否已被引入,若已被引入,则程序不会再次引入。

require_once和include_once也具有类似的上述作用。

 

3.HEREDOC介绍

用于字符串的输出。以<<<END开始,则以END;结尾。开始标记和结束标记必须相同。字符串中的变量可以被正常解析,而函数不可以。形如:

$a = <<<END

abc $c 1234

END;

于其类似的还有NOWDOC,简单来说,

heredoc是动态的,nowdoc是静态的。

heredoc类似多行的双引号,nowdoc类似多行的单引号。

nowdocheredoc为提高效率而产生的高效率的静态版本。

 

4.error_reporting等调试函数的使用。

error_reporting用于设置报告级别。

error_reporting(0) //报告所有错误报告

error_reporting(E_ALL) //报告所有错误报告

error_reporting(E_ALL ^E_NOTICE) //报告除NOTICE之外的错误

ini_set(error_reportingE_ALL);)有同样的设置效果。

 

5.safe_mode打开后哪些地方受限

safe_mode是唯一的PHP_INI_SYSTEM属性。必须通过php.inihttpd.conf来设置。启动safe_mode,只需修改php.ini safe_mode = On 或修改httpd.conf,定义目录:Options FollowSymLinks php_admin_value safe_mode 1

启动safe_mode后,会对许多PHP函数进行限制,系统相关的文件打开,命令执行等函数。

所有操作文件的函数,将只能操作与脚本UID相同的文件。

 

6.写代码解决多进程/线程同时读写一个文件的问题。

PHP支持多进程而不支持多线程。对于文件操作,可以通过flock函数给文件加锁的方式来解决。写文件前先把文件锁上,写完后在解锁。读也一样。这样就避免多线程同时读写文件造成的冲突。

//写文件
function file_write($filename, $string)
{
$fp = fopen($filename, “a”); //以追加的方式打开文件
if (flock($fp, LOCK_EX)) { //加写锁
fwrite($fp, $string); 
flock($fp, LOCK_UN); //解锁
}
fclose($fp);
}


//读文件
function file_read($filename, $length)
{
$fp = fopen($filename, “r+”); //以可读写的方式打开文件
if(flock($fp, LOCK_SH)) { //加读锁
$result = fread($fp, $length); //读取文件
flock($fp, LOCK_UN); //解锁
}
fclose($fp);
return $result;
}


 

7.写一段上传文件的代码。

<!doctype html>
<html>
    <head>
        <meta charset="utf-8" />
    </head>
    <body>
        <h2>多文件上传</h2>
        <form enctype="multipart/form-data" action="./a.php" method="POST">
            <input type="hidden" name="MAX_FILE_SIZE" value="30000"/>
            <input type="file" name="image[]" />
            <input type="file" name="image[]" />
            <input type="submit" value="上传" />
        </form>
    </body>
</html>


const SEND_OK = 0;
foreach ($_FILES['image']['error'] as $k=>$v) {
    if ($v == SEND_OK) {
        if (is_uploaded_file($_FILES['image']['tmp_name'][$k])) {
            $uploadfile = "D:/xampp/htdocs/test/".basename($_FILES['image']['name'][$k]);
            if (move_uploaded_file($_FILES['image']['tmp_name'][$k], $uploadfile)) {
                echo "上传成功";
            } else {
                echo "上传失败";
            }
        }
    }
}


8.mysql存储引擎MyISAMInnodb的区别。

MyISAM:表级锁,不支持事物,无外键,服务器崩溃后无法安全恢复。适用于:非事务类应用,譬如:数据仓库。只读类应用:报表,日志。

InnoDB:行级锁,支持事务,支持外键。适用于支持事务的应用。

 

9.使用mod_rewrite,在服务器上没有/archivers/567.html这个物理文件时,重定向到index.php?id=567 ,请先打开mod_rewrite

 

10.一些编译php时的configure 参数

--profix=/usr/local/myphp 安装位置

--with-apxs2=/usr/local/myapache/bin/apxs Apache的扩展工具,apache通过这个工具进行扩展

 

11.PHP传入参数的两种方式

一种普通传参方式fun($a, $b, $c),一种使用...不定参数传参fun(...$a);

 

12.(mysql)请写出数据类型(int char varchar datetime text)的意思请问varcharchar有什么区别;

int 整型

char 定长字符型

datetime 日期类型(年月日时分秒)

text 文本类型

 

varchar:不定长类型,存储时会开辟一个字节的存储空间用于记录存储长度,易产生碎片。适合于存储最大长度比平均长度大很多,列的更新很少;使用了像UTF-8这样复杂字符集,且每个字符都使用不同字节数;

char:定长类型,适合存储长度很短的字符串或者平均长度基本一致的字符串,对于经常变更的字符串,使用char也更合适。

 

13.写出一些php魔术方法。

__construct()实例化类时自动调用

__destruct()对象被销毁前自动调用

__toString()将对象作为字符串输出时调用

__call()调用不存在的方法时调用

__callStatic()调用不存在的静态方法时调用

__clone()克隆对象时调用

__get()调用一个未定义的属性时调用

__set()设置一个未定义的属性时调用

__autoload()使用未定义的类时调用

__sleep()串行化的时候调用

__wakeup()反串行化的时候调用

 

14.MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?

  1. 设计良好的数据库结构,允许适当的数据冗余,减少join查询。

  2. 选择合适的存储引擎和表字段数据类型,为表添加适当的索引。

  3. 对SQL语句进行优化,譬如:select * from xxx改为select 字段a,字段b from xxxSQL语句根据type指标进行适当调整。

  4. mysql主从分离。主数据库负责写,从数据库负责读。

  5. 按规律分表,减少单表的数据量,比如:按月份进行分表。

 

15.大流量网站,采用什么方式解决访问量超载问题。

  1. 使用CDN加速。将静态资源缓存在离用户最近的地方。CDN可以缓存一些js,css,html静态文件。

  2. 前端性能优化,合并css,js,图片文件;启动压缩,减少数据传输量;开启浏览器缓存;减少cookie传输。

  3. 使用Nginx做前端服务器及反向代理服务器,做上游服务器的负载均衡。同时也可以缓存一些前端资源。

  4. 数据库采用主从分离,使用集群。主服务器负责写,从服务器负责读,降低数据库压力。

  5. 在应用层和数据层增加一层缓存层,使用redis、memcached做缓存,分担数据库压力。

 

16.对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题。

 当一个网站发展为知名网站的时候(如新浪,腾讯,网易,雅虎),网站的访问量通常都会非常大,如果使用虚拟主机的话,网站就会因为访问量过大而引起 服务器性能问题,这是很多人的烦恼,有人使用取消RSS等错误的方法来解决问题,显然是下错药,那么对于大流量的网站,需要采用什么样的方法来解决访问量 问题? 解决方法参考如下:


 首先,确认服务器硬件是否足够支持当前的流量。

 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大,那么必须首先配置一台更高性能的专用服务器才能解决问题,否则怎么优化都不可能彻底解决性能问题。


 其次,优化数据库访问。

 服务器的负载过大,一个重要的原因是CPU负荷过大,降低服务器CPU的负荷,才能够有效打破瓶颈。而使用静态页面可以使得CPU的负荷最小化。前台实现完全的静态化当然最好,可以完全不用访问数据库,不过对于频繁更新的网站,静态化往往不能满足某些功能。

 缓存技术就是另一个解决方案,就是将动态数据存储到缓存文件中,动态网页直接调用这些文件,而不必再访问数据库,WordPress和Z-Blog都大量使用这种缓存技术。

 如果确实无法避免对数据库的访问,那么可以尝试优化数据库的查询SQL.避免使用Select * from这样的语句,每次查询只返回自己需要的结果,避免短时间内的大量SQL查询。


 第三,禁止外部的盗链。

 外部网站的图片或者文件盗链往往会带来大量的负载压力,因此应该严格限制外部对于自身的图片或者文件盗链,好在目前可以简单地通过refer来控制盗 链,Apache自己就可以通过配置来禁止盗链,IIS也有一些第三方的ISAPI可以实现同样的功能。当然,伪造refer也可以通过代码来实现盗链, 不过目前蓄意伪造refer盗链的还不多,可以先不去考虑,或者使用非技术手段来解决,比如在图片上增加水印。


 第四,控制大文件的下载。

 大文件的下载会占用很大的流量,并且对于非SCSI硬盘来说,大量文件下载会消耗CPU,使得网站响应能力下降。因此,尽量不要提供超过2M的大文件下载, 如果需要提供,建议将大文件放在另外一台服务器上。目前有不少免费的Web 2.0网站提供图片分享和文件分享功能,因此可以尽量将图片和文件上传到这些分享网站。


 第五,使用不同主机分流主要流量

 将文件放在不同的主机上,提供不同的镜像供用户下载。比如如果觉得RSS文件占用流量大,那么使用FeedBurner或者FeedSky等服务将RSS输出放在其他主机上,这样别人访问的流量压力就大多集中在FeedBurner的主机上,RSS就不占用太多资源了。


 第六,使用流量分析统计软件

 在网站上安装一个流量分析统计软件,可以即时知道哪些地方耗费了大量流量,哪些页面需要再进行优化,因此,解决流量问题还需要进行精确的统计分析才可以。 推荐使用的流量分析统计软件是Google Analytics(Google分析)。这个软件非常的不错哦!


17.写出一种排序算法(原理),并说出优化它的方法

<?php 
//选择排序,一种不稳定的排序方式
$a = [2,8,5,5,6,3,1];
for ($i=0; $i<count($a)-1; $i++){
    for ($j=$i+1; $j<count($a); $j++){
        if ($a[$i]<$a[$j]) {
            $t = $a[$i];
            $a[$i] = $a[$j];
            $a[$j] = $t;
        }
    }
}
var_dump($a);


//选择排序进行了过多的比较交换,可以采用记录键的方式减少交换次数。
//优化后的选择排序
$t = count($a);
for ($i=0; $i<$t-1; $i++) {
    $min = $i;
    for ($j=$i+1; $j<$t; $j++) {
        if ($a[$min]<$a[$j]) {
            $min = $j;
        }
    }
    if ($min != $i) {
        $swap = $a[$min];
        $a[$min] = $a[$i];
        $a[$i] = $swap;
    }
}
var_dump($a);


18.测试php性能和mysql数据库性能的工具,和找出瓶颈的方法。

php性能测试:xdebug+wincachegrind 单元测试:PHPUnit+NetBeans

mysql压力测试:mysqlslap

 

19.请介绍Session的原理,大型网站中Session方面应注意什么?

针对HTTP协议不能使用服务器端保存客户端状态信息的问题,提出了session的概念。用来保存客户端状态信息。

session通过PHPSESSIDcookie和服务器端进行联系。session通过SESSIONID判断用户,即服务器端的session文件文件名。

sessionID在客户端和服务器端通过通过HTTP Request 和 HTTP Response传来传去。若未设置session生命周期,则sessionid存储在内存。关闭浏览器会自动销毁。若浏览器未禁止cookie,那么cookie可用于存储sessionIDSession生存期。通过设置session_set_cookie_params()函数设置Session生存期。Session过期后,PHP对其进行回收。

 

对于访问量大的网站,需要将session入库,即将session存储到数据库,内存表,APC中。

对于大流量网站,Session入库效率不高,且占据数据库资源。可使用MemcachedRedis等数据存储方案实现大数据、高并发的session存储。

 

20.linux下查看当前系统负载信息的一些方法。

uptime top



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值