PHP面试总结

PHP面试总结

  • 什么事面向对象?主要特征是什么?

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

  • SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?

http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。

SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。

禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的。

数据库相关

  • MyISAM 和 InnoDB 的基本区别?

1)在增、删、改和查方面,myisam 要优于 innodb 表引擎,当数据量特别大时,他们的速度相差不大
2)innodb 支持 myisam 所不具备的事务支持、存储过程,行级锁定等等

  • MySQL数据库,一天一万条以上的增量,怎么优化?


有个短信发送的日志表,每天增量也很大,处理的方法是按月进行分表,因为是日志表,主要操作是insert操作,所以每月初自动生成新的数据表,数据插入到对应月份的那张数据表。[比如表明前缀是cdb_smslog 后面加200910 及时cdb_smslog_200910]

  • 数据库中的事务是什么?

事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。
如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。

  • mysql数据库优化:

1.选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置not null
2.使用连接(JOIN)来代替子查询(原因)
3.使用联合(UNION)来代替手动创建的临时表
4.优化查询语句(在建立好索引字段上尽量减少函数的操作)
5.建立索引(普通索引,唯一索引,主键索引)
6.锁定表,优化事物处理

  • 水平分表和垂直分表

每个表的字段相同,按月创建表,按取模创建表
垂直分表:将常用的字段放入一个表中

PHP相关

  • isset和empty的区别:

1.isset用来判断变量是否定义、存在,如果定义了返回true,否则返回false
2.如果定义一个变量,但是变量为null,返回的是false,也就是未定义(测试:)
3.empty,用来检测变量是否为空
以下是被认为是空的:
""空字符串
0,0.0,‘0’ 作为整数的0
null
false
array()
$val 一个声明了,但是没有值得变量

  • 什么是面向对象?主要特征是什么?
  1. 面向对象是程序的一种设计方式,它利于提高程序的重用性,是程序结构更加清晰。
  2. 主要特征:封装、继承、多态
  • SESSION 与 COOKIE 的区别是什么,请从协议,产生的原因与作用说明?
  1. http 无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户
  2. SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。
  3. 禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的。
  • HTTP 状态中 302、403、 500 代码含义?

一二三四五原则: 一. 消息系列 二 成功系列 三. 重定向系列 四. 请求错误系列 五. 服务器端错误系列
302 重定向
403 服务器拒绝访问
500 服务器内部错误
401 未被授权

  • 请写出数据类型(int char varchar datetime text)的意思;请问 varchar 和 char有什么区别?

Int 整数
char 定长字符
Varchar 变长字符
Datetime 日期时间型
Text 文本型

  • Varchar 与char的区别:

char是固定长度的字符类型,分配多少空间,就占用多长空间。
Varchar是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间。由于varchar类型是可变的,所以在数据长度改变的时,服务器要进行额外的操作,所以效率比char类型低。

  • 创建索引:

      alert table tablename add index (`字段名`)
    
  • Apache与Nginx的优缺点比较

1、nginx相对于apache的优点:
轻量级,比apache 占用更少的内存及资源。高度模块化的设计,编写模块相对简单;抗并发,nginx 处理请求是异步非阻塞,多个连接(万级别)可以对应一个进程,而apache 则是阻塞型的,是同步多进程模型,一个连接对应一个进程,在高并发下nginx 能保持低资源低消耗高性能
nginx处理静态文件好,Nginx 静态处理性能比 Apache 高 3倍以上
2、apache 相对于nginx 的优点: 
apache 的rewrite 比nginx 的rewrite 强大 ,模块非常多,基本想到的都可以找到 ,比较稳定,少bug ,nginx 的bug 相对较多
3、原因:这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的 Squid、Memcached都采用的是epoll网络I/O模型。 处理大量的连接的读写,Apache所采用的select网络I/O模型非常低效。

  • 不使用cookie向客户端发送一个cookie.

session_start()开启时,生成一个常量 SID,当COOKIE开启时,这个常量为空,当COOKIE关闭时,这个常量中存储了PHPSESSID的值。
通过在URL后加一个SID参数来传递SESSIONID的值,从而使客户端页面可以使用SESSION里面的值。 当客户端开启COOKIE和服务器端开启SESSION时。 浏览器第一次请求,服务器会向浏览器端发送一个COOKIE里面存储SESSIONID. 当浏览器第二次请求时,会把已存在

  • 如何在页面之间传递变量(至少两种方式)

GET,POST,COOKIE,SESSION,隐藏表单

  • 写出匹配URL的正则表达式(复习)

‘/(https?|ftps?)😕/(www).([./]+).(com|cn|org)(/[\w-./?%&=]*)?/i’

  • 冒泡排序

  • 快速排序

  • 用PHP写出显示客户端IP与服务器IP的代码

$_SERVER[‘SERVER_ADDR’]服务器IP
$_SERVER[‘REMOTE_ADDR’]客户端IP

  • echo,print和print_r有什么区别?

echo是一个语言结构,没有返回值,输出一个或多个字符串
print是一个函数,返回int类型的值,(只能打印int string)
print_r()是一个函数,返回bool类型的值,按结构输出变量的值。可以打印数组对象等

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

确认服务器硬件是否足够支持当前的流量,
数据库读写分离,优化数据表,
程序功能规则,禁止外部的盗链,控制大文件的下载,使用不同主机分流主要流量

  • include和require的区别:

require是无条件包含,也就是一个流程里如果加入require无论条件成立与否都会先执行require
include有返回值,而require没有,require的速度比include快
包含文件不存在或者语法错误的时候,require是致命的,include不是

  • 表单中 get与post提交方法的区别?

get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息.
get 不安全,post 安全性比get高
get 传递参数大小有限制,post 没有大小限制

  • 谈谈对mvc的认识

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

  • 请说明php中传值与传引用的区别。什么时候传值什么时候传引用?

按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,PHP必须复制值。特别是对大型的字符串和对象来说,这将会是一个代价很大的操作
按引用传递则不需要复制值,对于性能提高很有好处

  • thinkPHP和larvae的区别:

渲染方式不同,laravel渲染方式:return view(). tp渲染方式:$this->display()
数据库配置不同:laravel 引入了env环境文件,只需配置好就可以就可以使用,使用git、svn时 .env也不会随着文件一起提交到服务器
laravel提供了大量的闭包
加密方式不同,Laravel内置Hash加密单向加密算法,提高了安全性。
Laravel在数据库建表中有自己独立内置结构,不需要借助原生态SQL语句。
Laravel是一个重路由的框架,所有功能都是由路由发起的,哪怕没有控制器方法,只要写了路由就能够访问;TP需要有控制器才能正常访问。Laravel每一个网址必须写一个路由,完全不考虑服务器性能,加载需要耗费很多资源。
Laravel具有强大的社区化扩展(可有composer扩张展自动加载),中间件,Blade模板引擎
TP比Laravel容易上手,我觉得更适合初学者
TP的文档比Laravel的文档更丰富
TP的性能要优于Laravel,虽内置大量方法,引入第三方库和方法,会使得性能遇到瓶颈。

  • 中文字符串截取无乱码
        function GBsubstr($string, $start, $length){
            if(strlen($string)>$length){
                $str = null;
                $len=$start+$length;
                for ($i=$start;$i<$len;$i++){
                    if(ord(mb_substr($string,$i,1))>0xa0) {
                        $str .= mb_substr($string, $i, 2);
                        $i++;
                    }else{
                        $str.=mb_substr($string,$i,1);
                    }
                }
                return $str.'...';
            }else{
                return $string;
            }
        }
        GBsubstr('我是中国的一个骄傲',2,4);
  • 写个函数来解决多线程同时读写一个文件的问题

        <?php
            $fp = fopen("/tmp/lock.txt","w+");
            if(flock($fp, LOCK_EX)){// 进行排它型锁定
                fwrite($fp,"Write something here\n");
                flock($fp, LOCK_UN);// 释放锁定
            }else{
                echo "Couldn't lock the file !";
            }
            fclose($fp);
        ?>
  • 数组和对象的区别

array是数组,而object是对象,两者有很大的区别,最主要的区别我觉得对象一般要定义行为,其目的是为了封装,而数组主要定义数据结构

  • 静态方法和静态变量的作用

static
1. 静态变量
静态成员只保留一个变量值,而这个变量值对所有的实例都是有效,也就是说,所有的实例共享这个成员。
2. 静态方法
静态方法可以直接使用class::… 来调用,而非静态方法需要满足一定限制条件才能使用class::… 的方法调用,如之前所述

  • 接口

interface 接口
接口 继承 implements

  • 类的继承

extends

  • 用最少的代码写一个求3值最大值的函数

m a x = m a x ( max = max( max=max(a ,$b $c);
$max = a > a> a>b?( a > a> a>c? a : a: a:c)😦 b > b> b>c? b : b: b:c);

  • 正则表达式

邮箱正则表达式 /1+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$/

  • 建立 socket 需要哪些步骤

创建 socket
绑定 socket 到指定地址和端口
开始监听连接
读取客户端输入
关闭 socket

        netListen, err := net.Listen("tcp", ":"+port)
        if err != nil {
            logs.Error(err)
        }
        defer netListen.Close()
        
        for {
            conn, err := netListen.Accept()
            if err != nil {
                continue
            }
    
            logs.Info(conn.RemoteAddr().String(), "["+port+"]tcp connect sucess(hex)")
            go utils.HandleData86Stick(conn, port)
        }
  • PHP数组转字符串

implode()

  • 数组相关函数

array_combine()通过合并两个数组合并成一个新数组
range() 根据范围创建数组
compact() 函数创建一个包含变量名和它们的值的数组(以数组名)
array_merge() 把两个或多个数组合并成一个数组
array_slice() 在数组中根据条件取出一段值
array_diff() 返回两个数组的差集数组
array_intersect() 计算数组的交集
array_search() 在数组中搜索给定的值
array_splice() 移除数组的一部分且替代它
array_key_exists() 判断某个数组中是否存在指定的key
shuffle() 把数组中的元素按随机顺序重新排列
array_flip() 交换数组中的键和值
array_reverse() 将原数组中的元素顺序翻转,创建新的数组并返回
array_unique() 移除数组中重复的值

  • 字符串转数组

explode()

  • 字符串相关函数

strtolower()
strtoupper()
ucfirst()
ucwords()
ltrim()
rtrim()
trim()

        strpos() 查找字符串
        stripos
        
        str_pad()字符串填充,不加参数是空格填充
        
        str_repeat("-", 10);重复一个字符串

        strrev 字符串的反转

        unserialize()
        
        substr_replace()
        
        str_replace() 字符串替换
        str_ireplace
        
        str_shuffle
        
        is_numeric()
  • php读取文件内容的几种方法和函数?

打开文件,然后读取。Fopen() fread()
打开读取一次完成 file_get_contents()

  • php中rbac五张表的关系
        用户表、角色表、权限表(客户列表,添加客户),
        还有他们之间互相关联的表:用户与角色表、角色与功能表    
         
        CREATE TABLE `user` (
          `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
          `name` varchar(20) NOT NULL DEFAULT '' COMMENT '姓名',
          `email` varchar(30) NOT NULL DEFAULT '' COMMENT '邮箱',
          `is_admin` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是超级管理员 1表示是 0 表示不是',
          `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 1:有效 0:无效',
          `updated_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最后一次更新时间',
          `created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入时间',
          PRIMARY KEY (`id`),
          KEY `idx_email` (`email`)
        ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='用户表'; 
        
        CREATE TABLE `role` (
          `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
          `name` varchar(50) NOT NULL DEFAULT '' COMMENT '角色名称',
          `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 1:有效 0:无效',
          `updated_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最后一次更新时间',
          `created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入时间',
          PRIMARY KEY (`id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色表';
        
        CREATE TABLE `user_role` (
          `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
          `uid` int(11) NOT NULL DEFAULT '0' COMMENT '用户id',
          `role_id` int(11) NOT NULL DEFAULT '0' COMMENT '角色ID',
          `created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入时间',
          PRIMARY KEY (`id`),
          KEY `idx_uid` (`uid`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户角色表';
  • self与static区别

self:取决于定义前方法所在的类
static:取决于调用当前方法所在的类,更利于实现多态性

  • Memcache和Redis区别

      1.	Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。
      2.	Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存。
      3.	他们的扩展都需要做集群;实现方式:master-slave、Hash。
      4.	在100k以上的数据中,Memcached性能要高于Redis。
      5.	如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。当然,这和你的应用场景和数据特性有关。
      6.	如果你对数据持久化和数据同步有所要求,那么推荐你选择Redis,因为这两个特性Memcached都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择Redis也是明智的。
      7.	Redis和Memcache在写入性能上面差别不大,读取性能上面尤其是批量读取性能上面Memcache更强
      8.  memcache服务器只支持字符串,如果存复合类型的数据,需要通过php的扩展序列化
      9.  Redis支持字符串,除此之外还支持新的数据类型:链表、哈希等结构的数据
      10. Redis支持部分数据的持久化存储
    
      总结一:
      1.数据类型
      
      Redis数据类型丰富,支持set list等类型
      memcache支持简单数据类型,需要客户端自己处理复杂对象
      
      2.持久性
      
      redis支持数据落地持久化存储
      
      memcache不支持数据持久存储
      
      3.分布式存储
      
      redis支持master-slave复制模式
      
      memcache可以使用一致性hash做分布式
      
      value大小不同
      
      memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用
      
      4.数据一致性不同
      
      redis使用的是单线程模型,保证了数据按顺序提交。
      
      memcache需要使用cas保证数据一致性。CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作
      
      5.cpu利用
      
      redis单线程模型只能使用一个cpu,可以开启多个redis进程
      
      总结二:
      
      1.Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。
      
      2.Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
      
      3.Redis支持数据的备份,即master-slave模式的数据备份。
      
      4.Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
      
      我个人认为最本质的不同是Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存
      
      总结三:
      
      redis和memecache的不同在于:
      
      1、存储方式:
      
      memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小
      
      redis有部份存在硬盘上,这样能保证数据的持久性。
      
      2、数据支持类型:
      
      redis在数据支持上要比memecache多的多。
      
      3、使用底层模型不同:
      
      新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
      
      4、运行环境不同:
      
      redis目前官方只支持Linux 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统 环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上
      
      memcache只能当做缓存,cache
      
      redis的内容是可以落地的,就是说跟MongoDB有些类似,然后redis也可以作为缓存,并且可以设置master-slave
    

Linux相关知识点

  • Linux下建立压缩包,解压缩包的命令

      Tar.gz:
      打包: tar czf file.tar.gz file.txt
      解压: tar xzf file.tar.gz
      
      Bz2:
      打包: bzip2 [-k] 文件
      解压: bunzip2 [-k] 文件
      
      Gzip(只对文件,不保留原文件)
      打包: gzip file1.txt
      解压: gunzip file1.txt.gz
      
      Zip: -r 对目录
      打包: zip file1.zip file1.txt
      解压: unzip file1.zip
    

  1. a-zA-Z0-9_- ↩︎

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光帅气男孩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值