PHP面试常见问题

php方法的重写与重载区别

重写:方法名和参数个数相同​。重写只存在于子类与父类中

重载:方法名相同,参数个数不同。重载存在于一个类中

方法的重载与覆写都属于对象的多态性

FALSE的七种情况

0,0.0,false,'','0',[],null

整型0,浮点0.0,布尔false,空字符串,0字符串,空数组,NULL

NULL的三种情况

直接赋值为NULL、未定义的变量、unset销毁的变量

PHP global和static区别

global的变量,可在任何地方获取值,而static只能在函数或类内部

数组key 只能是 integer 或者 string

<?php
$array = array(
    1    => "a",
    "1"  => "b",
    1.5  => "c",
    true => "d",
);
var_dump($array);  //[1=>"d"]
?>

key 会有如下的强制转换: 
◦ 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。  
◦ 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。  
◦ 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。  
◦ Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。

正确的PHP标记

<SCRIPT LANGUAGE="php"></SCRIPT> PHP7移除

<% %>PHP7移除

<?php

<? ?>

<?= ?>

SQL语句中count(1)count(*)count(字段)用法的区别
count(*)count(1)都不会去过滤空值
count(1),其实就是计算一共有多少符合条件的行。1并不是表示第一个字段,而是表示一个固定值。就是计算一共有多少个1.
count(*),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些。
但count(列名)就有区别了,因为count(列名)会去过滤空值。

在PHP5中,下面哪项能改变数组中每个元素

  1. for($i = 0; $i < count($array); $i++) { /* … */ }
  2. foreach($array as $key => &$val) { /* … */ }
  3. foreach($array as $key => $val) { /* … */ }
  4. while(list($key, $val) = each($array)) { /* … */

下列哪个是创建一个每周三01:00~04:00每3分钟执行执行一次的crontab指令?
/3 1-4 3 /bin/bash /home/sijiaomao/ok.sh

<?php
define("x", "5");
$x = x + 10;
echo x; //5
?>

<?php
define('FOO', 10);
$array = array(10 => FOO, "FOO" => 20);
$array[FOO] //=$array[10]=FOO=10
print $array[$array[FOO]] * $array["FOO"]; //200
?>

define函数用于定义一个常量,而常量的值在设定以后,是无法更改的

UNION和UNION ALL有什么区别?
UNION在进行表求并集后会去掉重复的元素,所以会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
而UNION ALL只是简单地将两个结果合并后就返回。因此,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据。

你用什么方法检查PHP脚本的执行效率(通常是脚本执行时间)和数据库SQL的效率(通常是数据库Query时间),并定位和分析脚本执行和数据库查询的瓶颈所在?
A、PHP脚本的执行效率
a、代码脚本里计时;
b、xdebug统计函数执行次数和具体时间进行分析,最好使用工具winCacheGrind分析;
c、在线系统用strace跟踪相关进程的具体系统调用。

B、数据库SQL的效率
a、sql的explain(mysql),启用slow query log记录慢查询;
b、通常还要看数据库设计是否合理,需求是否合理等。

PHP程序使用utf-8编码, 以下程序输出结果是什么

GBK中文占2个字节,UTF8中文占3个字节

<?php
$str = 'hello你好世界';

echo strlen($str); //17
?>

什么事面向对象?主要特征是什么?
面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。

使用json_encode编码中文返回null的解决方案

如果你的程序是采用utf-8编码,请确保文件保存为utf-8无bom格式,如果你的程序是gbk的,可以先转成utf-8编码后在使用

Nginx FPM运行机制

1)、FastCGI进程管理器php-fpm自身初始化,启动主进程php-fpm和启动start_servers个CGI 子进程。主进程php-fpm主要是管理fastcgi子进程,监听9000端口。fastcgi子进程等待来自Web Server的连接。
2)、当客户端请求到达Web Server Nginx是时,Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,即Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理。
3)FastCGI进程管理器PHP-FPM选择并连接到一个子进程CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程。
4)、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。
5)、FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。
简单来说,当需要处理php请求时,nginx的worker进程会将请求移交给php-fpm的worker进程进行处理,也就是最开头所说的nginx调用了php,其实严格得讲是nginx间接调用php。

mysql防注入函数

注意在PHP5.3之前,magic_quotes_gpc是默认开启的

1.addslashes(): 函数返回在预定义字符之前添加反斜杠的字符串。

预定义的字符有:
    单引号(')
    双引号(")
    反斜杠(\)
    NULL

 2.mysql_real_escape_string(): 函数转义 SQL 语句中使用的字符串中的特殊字符。

下列字符受影响:
  \x00
  \n
  \r
  \
  '
  "
  \x1a

xss(跨站脚本攻击)怎么防止
htmlentities() htmlspecialchars()

CSRF是什么,怎么防止

CSRF(Cross-site request forgery),中文名称:跨站请求伪造。攻击者盗用你的身份,以你的名义发送恶意请求

token验证方法

PHP 不使用第三个变量实现交换两个变量的值
list($b,$a)=array($a,$b);


安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?
①防远程提交;②防SQL注入,对特殊代码进行过滤;③防止注册机灌水,使用验证码;

数组中下标最好是什么类型的,为什么?
数组的下标最好是数字类型的,数字类型的处理速度快。


++i和i++哪一个效率高,为什么?
++i效率比i++的效率更高,因为++i少了一个返回i的过程。


在PHP中error_reporting这个函数有什么作用?
设置 PHP的报错级别并返回当前级别。

抢购、秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:
1 高并发对数据库产生的压力
2 竞争状态下如何解决库存的正确减少("超卖"问题)

在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量__$_SERVER['PHP_SELF']__中;而链接到当前页面的URL记录在预定义变量__$_SERVER['HTTP_REFERER']__中
执行程序段<?php echo 8%(-2) ?>将输出__0__。
数组函数 arsort 的作用是__对数组进行逆向排序并保持索引关系__;语句 error_reporting(2047)的作用是__报告所有错误和警告__。

http get和post的区别?

1、get用于获取数据,post用于提交数据

2、get提交参数追加在url后面,post参数可以通过http header body提交

3、get传值一般在2KB以内,post传值大小可以在php.ini中max_post_size进行设置

4、get提交可以被浏览器缓存,post不会被浏览器缓存

如何不使用submit按钮来提交表单

1)ajax提交

2)可以用超链接来提交

3)js 方法提交$('form').submit();

2.ajax 中如何执行跨域访问?同子域的情况如何处理?不同子域的情况如何处理?

①jsonp,非官方协议,简单实用

通过JavaScript的callback方式调用,jQuery封装了jsonp方式的请求。

JSONP则是通过在文档中嵌入一个<script>标记来从另一个域中返回数据。例如在页面中添加一个如下的<script>标记:

<script src="http://localhost:2701/home/somejsonp?callback=jsonpcallback"/>

该<script>标记会发送一个GET请求。在数据(数据可以RSA加密)返回到客户端后,jsonpcallback()函数将会被调用。当然,这种方法拥有一个显著的缺点,那就是只支持GET操作

function jsonpcallback(json) {
    console.log(json)
}

②服务器响应头

header("Access-Control-Allow-Origin:*");

11、Print、echo、print_r有什么区别?

① echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出echo会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用。

② print 是打印字符串

③ print_r 则是打印复合类型 如数组 对象
 

2.HTTP/1.0 中,状态码 200 301 304 403 404 500的含义

200 - 服务器成功返回网页
301(永久移动)请求的网页已永久移动到新位置。
304(未修改)自从上次请求后,请求的网页未修改过
403(禁止)服务器拒绝请求
404 - 请求的网页不存在
500 服务器内部错误
503 - 服务器超时

一:500错误

1、500 Internal Server Error 内部服务错误:顾名思义500错误一般是服务器遇到意外情况,而无法完成请求。

2、500出错的可能性:

  a、编程语言语法错误,web脚本错误

  b、并发高时,因为系统资源限制,而不能打开过多的文件

3、一般解决思路:

  a、查看nginx、php的错误日志文件,从而看出端倪

  b、如果是too many open files,修改nginx的worker_rlimit_nofile参数,使用ulimit查看系统打开文件限制,修改/etc/security/limits.conf,还是出现too many open files,那就要考虑做负载均衡,把流量分散到不同服务器上去了

  c、如果是脚本的问题,则需要修复脚本错误,优化代码

二:502、504错误 

1、502 Bad Gateway错误、504 Bad Gateway timeout 网关超时

2、502、504出现的可能性

  web服务器故障、程序进程不够

3、一般解决思路

  a、使用nginx代理,而后端服务器发生故障;或者php-cgi进程数不够用;php执行时间长,或者是php-cgi进程死掉;已经fastCGI使用情况等都会导致502、504错误。

     b、502 是指请求的php-fpm已经执行,但是由于某种原因而没有执行完毕,最终导致php-fpm进程终止。一般来说,与php-fpm.conf的设置有关,也与php的执行程序性能有关,网站的访问量大,而php-cgi的进程数偏少。针对这种情况的502错误,只需增加php-cgi的进程数。具体就是修改/usr/local/php/etc/php-fpm.conf文件,将其中的max_children值适当增加。这个数据要依据你的服务器的配置进行设置。一般一个php-cgi进程占20M内存,你可以自己计算下,适量增多。

         /usr/local/php/sbin/php-fpm reload 然后重启一下.

     c、504 表示超时,也就是客户端所发出的请求没有到达网关,请求没有到可以执行的php-fpm。与nginx.conf的配置也有关系。

501  服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。

503  服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。(服务不可用)

505  服务器不支持请求中所用的 HTTP 协议版本。(HTTP 版本不受支持

 

 session与cookie的区别?

1、Cookie只能保存字符串,Session可以存任意数据类型
2、Cookie存储在客户端浏览器中,Session存储在服务器上
3、session会在一定时间内保存在服务器上。当访问增多,影响服务器的性能。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

WebSocket  Socket  HTTP

socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议

WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端

HTTP协议是建立在TCP协议之上的一种应用。HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

Include require include_once require_once 的区别.
require 失败时会产生一个致命级别错误,并停止程序运行。
include 失败时只产生一个警告级别错误,程序继续运行。

include_once/require_once和include/require 处理错误方式一样,
唯一区别在于当所包含的文件代码已经存在时候,不在包含。

编写一个自定义函数提取这段路径的的后缀名。“Www/hello/test.php.html?a=3&b=4”

function geturltype($url) {
    $info = parse_url($url);
    return end(explode('.', $info['path']));
}
如何修改会话的生存时间
session.gc_maxlifetime = 1440

<?php echo count(strlen("http://php.net")); ?>的执行结果是?
1
分布式session共享问题怎么解决
1)session存redis,mysql.memcache,用 session_set_save_handler类
2)使用Nginx的ip_hash/sticky负载均衡策略
3)应用服务器间的session复制共享
某ID的一条记录在表中是第几条记录
SELECT COUNT(*) FROM 表 WHERE ID<=ID的值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值