php面试题目(持续更新)

一. 给出2个表达式的结果:(0.1+0.7)===0.8和(0.1+0.7)==0.8
答案:false , false
因为浮点数转换成2进制数字存储时会丢失精度!

二. 下面哪些结果是true?
A. empty(0) B.empty(null) C.empty($a) D.empty(false) E.empty(true)
答案:ABCD
emtpy函数是用来判断一个变量是否为空的,当一个变量并不存在时,或者它的值等同于false,那么它也会被认为不存在!

以下的东西被认为是空的:
1. “” (空字符串)
2. 0 (作为整数的0)
3. 0.0 (作为浮点数的0)
4. “0” (作为字符串的0)
5. NULL
6. FALSE
7. array() (一个空数组)
8. $var; (一个声明了,但是没有值的变量)

三. var_dump(2==true);结果是什么:
答案:true
因为在进行判断或者比较时,所有非零整数都等同于true;(自动转换)

四.HTTP的请求方式除了GET,POST,还有:
HEAD 与GET请求类似,不同在与服务器只返回HTTP头部信息,没有页面内容
PUT 上传指定URL的描述
DELETE 删除指定资源
OPTIONS 返回服务器支持的HTTP方法
CONNECT 转换为透明TCP/IP隧道的连接请求

五.HTTP 状态中302、403、 500、200、404、502代码含义?
一二三四五原则: 一. 消息系列 二. 成功系列 三. 重定向系列 四. 请求错误系列 五. 服务器端错误系列
答:302:临时转移成功,请求的内容已转移到新位置 403:禁止访问 500:服务器内部错误 401代表未授权。 200是请求成功,404是文件未找到,502是服务器内部错误。

六.HTTP的常用两种认证模式:
基本认证 Basic Access Authentication;
摘要认证 HTTP Digest Authentication;

七.thinkphp单字母函数:
A函数: 用于实例化Action 格式
B函数:用于执行某个行为
C函数: 获取和设置配置参数 支持批量定义
D函数: 用于实例化Model 格式 项目://分组/模块
F函数: 快速文件数据读取和保存 针对简单类型数据 字符串、数组
G函数: 记录和统计时间(微秒)和内存使用情况
I函数: 获取输入参数 支持过滤和默认值
L函数: 获取和设置语言定义(不区分大小写)
M函数: 用于实例化一个没有模型文件的Model
N函数: 设置和获取统计数据
R函数: 远程调用模块的操作方法 URL 参数格式 [项目://][分组/]模块/操作
S函数: 缓存管理
T函数: 获取模版文件 格式 项目://分组@主题/模块/操作
U函数: URL组装 支持不同URL模式
W函数: 渲染输出Widget

八.写出一个验证电子邮件格式的正则:
/\w+@\w+(.\w+){0,3}/

九.用一条SQL语句查询出每门课都大于80分的学生姓名
name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90
答案:select name,count(fenshu) as num,sum(funshu>80) as pass from table_name group by name having num=pass;

十.使用环境变量获取url地址:

$_SERVER['PHP_SELF'];

获取服务器端的地址

$_SERVER['HTTP_ADDR'];

获取客户端的地址:

$_SERVER['REMOTE_ADDR'];

十一.
$str=count(false)+count('abc')+count(null);
echo $str;

答:2,count(null)=0;

十二.写出常用的linux命令及其作用:

    1.cat  代表了连结(Concatenation),连接两个或者更多文本文件或者以标准输出形式打印文件的内容
    2.touch  新建文件,如果该文件已存在则更新修改时间
    3.cd     切换目录
    4.pwd    显示当前所处目录
    5.top    显示后台信息,类似于windows的任务管理器
    6.stats  显示文件信息
    7.history 查看之前所使用的命令记录
    8.rm      删除文件
    9.mv      移动文件
    10.cp     复制
    11.ps     查看进程
    12.date   显示和修改日期
    13.grep   查询匹配
    14.ls     列出目录内容
    15.lsblk  列出块设备
    16.md5sum 计算和检验MD5信息签名
    17.dd     复制和转换文件
    18.uname  Unix Name的简写;显示机器名,操作系统和内核的详细信息。
    19.sudo   授权用户执行超级用户和其他用户的命令
    20.mkdir  创建文件夹
    21.chmod  改变文件的模式位
    22.chown  改变文件用户拥有者和所在组
    23.apt   APT是一个为Debian系列系统(Ubuntu,Kubuntu等等)开发的高级包管理器,在Gnu/Linux系统上,它会为包自动地,智能地搜索,安装,升级以及解决依赖。
    24.tar    压缩和解压缩命令
    25.cal    用来显示当前月份和已经过去年份和未来的月份信息

十三.sort、rsort、asort、arsort、ksort和krsort的区别:

sort() 函数用于对数组单元从低到高进行排序。
rsort() 函数用于对数组单元从高到低进行排序。
asort() 函数用于对数组单元从低到高进行排序并保持索引关系。
arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。
ksort() 函数用于对数组单元按照键名从低到高进行排序。
krsort() 函数用于对数组单元按照键名从高到低进行排序。

十四.简单概述PHP的垃圾回收机制
PHP可以自动进行内存管理,清楚不再需要的对象。PHP使用了引用计数这种单纯的垃圾回收机制。每个对象都内含一个引用计数器,每个reference链接到对象,计数器加1,当reference离开生存空间或者被设为null,计数器减1,当某个对象的引用计数器为0时,PHP知道你将不再需要使用这个对象,释放其所占有的内存空间。

十五. 如何用php的环境变量得到一个网页地址的内容? IP地址又要怎样得到?

"http://".$_SERVER ['HTTP_HOST'].$_SERVER['PHP_SELF'] ;// 获取网页地址
 $_SERVER['REMOTE_ADDR'] //获取IP地址

十六.foo()和@foo()的区别:

@符号可以控制错误提示,简单理解为在所有有输出的函数、变量等得到值的地方前面可以加上@屏蔽错误提示;

十七.Mysql中获取当前时间和日期的函数:now();
格式化时间和日期的函数是:date_format();

十八.有一个网页地址, 比如PHP开发资源网主页: http://www.phpres.com/index.html,如何得到它的内容?

$url="http://www.phpres.com/index.html";
$str=file_get_contents($url);
var_dump($str);

十九.请问session和cookie的区别?禁用cookie后session是否还能使用?
1.http传输协议是无状态的,不能区别用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户;
2.session存储在服务器端,cookie保存在客户端;session比较安全,cookie用某些手段可以修改,不安全。session依赖于cookie进行传递。
禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器资源有消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径是有php配置文件的session.save.path指定。Session文件是公有的;

二十.语句include和require有什么区别?为了避免多次包含同一文件,可以用什么替代他们?
1.include()在执行文件时每次都要进行读取和评估
require()文件只处理一次(实际上文件内容替换了require()语句);
2.require()通常放在PHP脚本程序的最前面
include()的使用和require()一样,一般放在程序控制的处理区段中,php脚本文件读到include()语句时,才将它包含的文件读进来,这种方式,可以把程序执行的流程简单化;
3.require()包含文件失败,停止执行,给出错误(致命的)
include()常用于动态包含,通常是自动加载的文件,即使加载出错,整个程序还是继续执行;返回的只是一个警告;

为避免多次包含同一文件,可以用require_once和include_once来替代他们;

二十一、mysql的加锁条件是什么?悲观锁和乐观锁是什么?有什么作用?
悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念。

悲观锁(Pessimistic Lock)
悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。通常所说的“一锁二查三更新”即指的是使用悲观锁。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select … for update操作来实现悲观锁。当数据库执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。

这里需要注意的一点是不同的数据库对select for update的实现和支持都是有所区别的,例如oracle支持select for update no wait,表示如果拿不到锁立刻报错,而不是等待,mysql就没有no wait这个选项。另外mysql还有个问题是select for update语句执行中所有扫描过的行都会被锁上,这一点很容易造成问题。因此如果在mysql中用悲观锁务必要确定走了索引,而不是全表扫描。

乐观锁(Optimistic Lock)
乐观锁的特点先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。

乐观锁在数据库上的实现完全是逻辑的,不需要数据库提供特殊的支持。一般的做法是在需要锁的数据上增加一个版本号,或者时间戳,然后按照如下方式实现:

复制代码
1. SELECT data AS old_data, version AS old_version FROM …;
2. 根据获取的数据进行业务操作,得到new_data和new_version
3. UPDATE SET data = new_data, version = new_version WHERE version = old_version
if (updated row > 0) {
// 乐观锁获取成功,操作完成
} else {
// 乐观锁获取失败,回滚并重试
}
复制代码
乐观锁是否在事务中其实都是无所谓的,其底层机制是这样:在数据库内部update同一行的时候是不允许并发的,即数据库每次执行一条update语句时会获取被update行的写锁,直到这一行被成功更新后才释放。因此在业务操作进行前获取需要锁的数据的当前版本号,然后实际更新数据时再次对比版本号确认与之前获取的相同,并更新版本号,即可确认这之间没有发生并发的修改。如果更新失败即可认为老版本的数据已经被并发修改掉而不存在了,此时认为获取锁失败,需要回滚整个业务操作并可根据需要重试整个过程。

总结
乐观锁在不发生取锁失败的情况下开销比悲观锁小,但是一旦发生失败回滚开销则比较大,因此适合用在取锁失败概率比较小的场景,可以提升系统并发性能

乐观锁还适用于一些比较特殊的场景,例如在业务操作过程中无法和数据库保持连接等悲观锁无法适用的地方

二十二.一组温度的数字组成的数组,如何求出其中的最接近于0的温度。
答案:

<?php
    function get_near0($arr){
        // sort($arr);
        var_dump($arr);
        $count=count($arr);
        //按照绝对值大小倒序排列
        for($j=0;$j<$count;$j++){
            for($i=0;$i<$count-1;$i++){
                if(abs($arr[$i])<abs($arr[$i+1])){
                    //把绝对值最小的值放到后面
                    $a=$arr[$i];
                    $arr[$i]=$arr[$i+1];
                    $arr[$i+1]=$a;
                    // $arr=array_values($arr);

                }
                // else{
                //  unset($arr[$i]);
                // }
            }
        }
        var_dump($arr);
        $small=array_pop($arr);
        return $small;
    }
    $t=[-11,-9,-34,22,3,1,444,-23];
    echo get_near0($t);
?>

二十三.JS和php都是分别怎么实现URL页面跳转的?
答:JS:window.location.href = “http://www.baidu.com“;
PHP:<?php sleep(3); header("location:url地址");//调用了sleep()方法,效果也是3秒后执行跳转 ?>

二十四.禁用cookie后,session还能使用吗?
在PHP中,通过相关的配置,可以让Session不依赖Cookie而存在。
php.ini中,把session.use_trans_sid设成1,那么连接的后面就会自己加sessionid,就通过url来传递
session的key了,这时客户端就算禁止了cookie也可以使用session;同时必须说明的是这样是不安全也不推荐的做法;

二十五.用php写一个遍历文件夹下的所有文件的方法(文件夹下包含子文件夹)

<?php
header("content-type:text/html;charset=gbk");
    //遍历一个文件夹下的所有文件及其子文件
    function scan_mydir($dirs){
        $handles=opendir($dirs);
        $files=array();
        while(($file=readdir($handles))!==false){
            if(($file!=='.')&&($file!=='..')){
                if(is_dir($dirs.'/'.$file)){
                    $files[$file]=scan_mydir($dirs.'/'.$file);
                }else{
                    $files[]=$file;
                }
            }       

        }

        closedir($handles);
        return $files;
    }

    $myfile=scan_mydir('G:\360Downloads\Software');
    var_dump($myfile);
?>

二十六.开启php.ini中的safe_mode,会影响哪些函数和参数?
safe_mode,php安全模式,它提供一个基本安全的共享环境,在一个有多个用户账户存在的php开发的web服务器上。当安全模式打开的时候,一些函数将被完全的禁止,而另一些函数的功能将会受到限制;
如:chdir,move_uploaded_file,chgrp,parse_ini_file, chown, rmdir, copy, rename, fopen,require,mkdir, unlink等。
注意,在php5.3以上版本,safe_mode被弃用,在php5.4以上版本,则将此特性完全去除了。

二十七.数据库设计的三大范式:
1.第一范式(确保每列保持原子性)
2.第二范式(确保表中的每列都和主键相关)
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)

二十八.mysql in 排序 也可以按in里面的顺序来排序
select * from goods where id in(3,4,1,2) order by FIELD(id,3,4,1,2)

二十九.求两个日期的差数,例如求2017-04-03和2017-03-02的日期差值;

<?php
    $time=strtotime('2017-03-03')-strtotime('2017-02-01');
    $days=round($time/60/60/24);
    echo $days;
?>

三十.下面的代码片分别输出什么?

<?php
    $a='123';
    $b=&$a;
    $a='abc';
    echo $a."<br>";
    echo $b."<br>";
?>
答:'abc' ,'abc'

三十一.下面的代码会输出什么?

<?php
    function test(){
        static $count=0;
        $count++;
        echo $count."<br>";
        if($count<3){
            test();
        }else{
            return false;
        }
    }
    test();
?>

答:输出:1,2,3
解析:此题是考查static在函数体内和函数外的区别;区别就是静态变量只有第一次运行函数的时候被创建,并且在函数结束的时候不会消亡;而普通的成员在函数结束的时候就会在内存中退栈消亡。

三十二.php带的图像库中的获得图像的宽和高的函数分别是什么?

   imagesx()  ,  imagesy()

三十三.比较两个string最好用什么函数?

  strcmp()函数,区分大小写;一般不会用strcasecmp()

三十四.除了使用construct()来定义构造函数时,还可以使用_____来定义;

   A.function __destruct()   B.function 类名() C.function __tostring() D.function __call()

答:B
A是析构方法,C是支持ECHO 输出对象时调用的方法 D.是调用类中不存在的方法时被调用

三十五.写出你所知道的魔术方法

   __construct() 构造方法,当创建完对象时被调用
   __destruct()  析构方法,当对象被释放或者销毁时调用
   __autoload()  类文件自动加载方法
   __call()      当所调用的成员方法不存在(或者没有权限)该类时调用,用于对错误后做一些操作或者提示信息
   __clone()     该函数在对象克隆时自动调用,其作用是对克隆的副本做一些初始化操作
   __get()       当所对象所调用的成员属性未声明或者级别为private或者protected等时,我们可以在这个函数里进行自己的一些操作
   __set() 当所对未声明或者级别为private或者protected等进行赋值时调用此函数,我们可以在这个函数里进行自己的一些操作
   __isset() 当对一个未声明或者访问级别受限的成员属性调用isset函数时调用此函数,共用户做一些操作
   __unset() 当对一个未声明或者访问级别受限的成员属性调用unset函数时调用此函数,共用户做一些操作
   __toString()函数 该函数在将对象引用作为字符串操作时自动调用,返回一个字符串
   __sleep()函数 该函数是在序列化时自动调用的,序列化这里可以理解成将信息写如文件中更长久保存
   __wakeup()函数 该魔术方法在反序列化的时候自动调用,为反序列化生成的对象做一些初始化操作
   __set__state() 当调用var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。本方法的唯一参数是一个数组,其中包含按array(’property’ => value, …)格式排列的类属性。
   __invoke      当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用
   __callStatic  它的工作方式类似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用,

三十六.不使用第三个变量交换2个变量的值;

第一种方法:算术运算
      简单来说,就是通过普通的+和-运算来实现。代码如下:
      int a,b;
      a=10;b=12;
      a=b-a; //a=2;b=12
      b=b-a; //a=2;b=10
      a=b+a; //a=12;b=10

第二种方法:异或运算
    理解为:一个数对另一个数连续异或2次得到的还是第一个数
    比如:a^b^b=a,同理借助异或可以完成转换;b=a^b^b;a=b^a^a

三十七.linux下监控网络端口的命令是:netstat

三十八.linux环境下监控日志的变化命令: tail -f

猜你喜欢

转载自blog.csdn.net/living_ren/article/details/79406259