PHP面试提问

今天去面试PHP技术开发这个职位,开始去了呢以为和以前一样会做笔试题这样的鬼东西。结果去了是直接技术面试,感觉这样挺好。废话不多说了,说说面试提到过的问题吧。虽然都是基础的,但是大家可以注意一下。
【顺序没关系,是我自己按记忆来记述的】

  • 对session怎么理解?session的工作原理?session工作时,为什么会开启session_start?session怎么自动存入数据库
  • 对于版本控制工具git,有没有使用过?它的一些基本命令是什么?在团队合作中是否用过它?项目中线上分支和本地分支
  • 是否了解面向对象?面向对象的三大特性是什么?具体介绍
  • 对于mysql数据库,你所用过的存储引擎有哪些?它们的区别是什么?知道什么是锁吗?怎么理解mysql的表级锁和行级锁
  • 对于PHP和Apache或者PHP和Nginx,你知道Apache和Nginx是什么吗?它们与PHP的关系是什么?它们是怎么工作的

这是我的一些不成熟的回答
1.session是一种会话控制,经常被我们用到登录控制,session经常和cookie一起用到,首先我们应该知道HTTP协议是无状态的,每个页面之间很难保持同步【登录】,这个时候就用到session了,session在使用时,如果我们不修改配置文件,每次使用都要用到session_start();这个函数开启session;然后会生成一个唯一的session_id;这个session_id;一般是储存在cookie中的,【来标注是这次会话的唯一ID】。当这次会话没结束时,再次访问的时候,就会去找这个session_id;看它有没有过期(是否存在),可以读取,就继续使用这个session_id;没有就会去重行生成一个session_id;这时如果关闭浏览器,那么这个session_id就会不存在了。

//开启session
session_start();
//设置session值
$_SESSION['key'] = 'value';
//访问session
echo $_SESSION['key'];
//访问session_id
echo $_COOKIE['PHPSESSID'];

下面是php.ini文件中session的配置

[Session]
//默认session以文件形式保存
session.save_handler = files
//设置session的保存位置
session.save_path = "d:/wamp/tmp"
//表示会在浏览器里创建值为PHPSESSID的session_id
session.use_cookies = 1
//配置session_id在cookie里面的名字
session.name = PHPSESSID
//是否默认开启session,默认不开起
session.auto_start = 0
//在客户端生成PHPSESSID这个cookie的过期时间,默认是0,也就是关闭浏览器就过期,下次访问,会再次生成一个session_id。所以,如果想关闭浏览器会话后,希望session信息能够保持的时间长一点,可以把这个值设置大一点,单位是秒。
session.cookie_lifetime = 0
//定义用来序列化/反序列化的处理器名字。默认使用php
session.serialize_handler = php
//
session.gc_divisor = 1000
//
session.gc_probability = 1
//
session.gc_maxlifetime = 1440
/*
session.gc_divisor 与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。session.gc_divisor 默认为 100。
*/

其实也有函数来操作这些

//销毁某一个session变量
unset($_SESSION['key']);
//销毁全部session变量
session_unset();//不用传参数
//销毁session文件
session_destory();
//设置session_id的存取时间
setcookie(session_name(),'',time()-3600,'/');

上面说到session在配置文件里默认是以文件的形式保存【file】,它还可以保存在数据库【redis,mamached】
配置文件改

session.save_handler = redis
session.save_path = "http://127.0.0.1:6379"

2.版本控制工具git

//拉取代码
git pull
//查看哪些代码有改变
git status
//提交改变的代码到仓库
git add .
//提交注释
git commit '使用git第一次提交';
//提交代码
git push
//查看本地有哪些分支
git branch
//查看远程分支
git branch -r
//查看本地加远程所有分支
git branch -a
//新建本地分支并与远程分支建立映射关系
git checkout -b admin origin/admin
//新建本地分支
git branch admin
git checkout -b admin_dev
//建立本地分支与远程分支的映射关系
git branch -u origin/admin
git branch --set-upstream-to origin/admin_dev
//撤销本地分支与远程分支的关系
git branch --unset-upstream
//切换分支
git checkout admin_dev

3.面向对象
【在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。】
三大特性
【封装】
把客观的事务封装为抽象类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信(不让它操作的)是隐藏的,不可访问的只暴露特定的属性和方法供外部访问;类的内部有三种属性【私有地private】【受保护的protected】【公开的 public】;封装也就是把我们不想泄露或者说不想让外部访问的方法设置不同的属性
【继承】
PHP是单继承,也就是子类可以继承父类,子类可以拥有父类当中所有的公开的以及受保护的属性和方法;子类同样可以再自己拥有自己的方法和属性,对父类是没有影响的
【多态】
所谓多态呢,我的理解就是,不同的子类继承同一个父类,然后不同的子类又可以拥有各自不同的属性和方法,互不干扰;比如父类定义了接口,子类通过【关键字implements】,然后不同的子类虽然拥有相同的方法,但是实现的功能却可以千奇百怪

class Admin
{
    public $name;

    publci static $user;

    publci statis function make()
    {
        //在静态方法中调用静态方法是没问题的,但是如果调用类的属性就是不可以的
        //错误调用$this->name;
        return self::user;
    }
}
//静态方法调用是
Admin::make();
//这样调用静态方法没有问题,但是如果静态方法内调用了类的属性,那么就会出错了,这是应为类的普通属性是通过实例化类之后,用实例化之后得到的new Admin();调用的,而静态方法没有实例化调用,这时就会出错了

4.数据库我们经常使用的存储引擎有两种【INnodb】【MyISAM】
它们的区别呢就是
innodb 是支持事务,外键的,对增删改时尽量使用它,它是行级锁
myisam是不支持事务,外键的,它查询大量的数据时比较快,它是表级锁
那么表级锁和行级锁的区别呢,什么又是锁呢
数据库的锁定机制简单来说呢,就是数据库为了保证数据的一致性,而使各种共享资源在并发访问时变的有序而设计的一种规则

  1. 表级锁定
    开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  2. 行级锁定
    开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
  3. 页级锁定
    开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
    【未完待续。。。】
    5.其实对于Apache或者nginx,我们PHP程序员都不陌生,几乎天天在用,那么如果让我们用自己的语言把它概括出来,可能很多都知道是什么,也能说出来一些,但是系统的说一下估计就难了
    Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。
    PHP与Apache搭配就可以说是绝配的【。。。】
    那么PHP是怎么与Apache搭配工作的呢。目前我所使用的PHPstudy,我可以 看Apache的配置文件【httpd.conf】
ServerRoot  "F:/phpStudy/PHPTutorial/Apache"

DocumentRoot  "F:\phpStudy\PHPTutorial\WWW"
<Directory />
    Options +Indexes +FollowSymLinks +ExecCGI
    AllowOverride All
    Order allow,deny
    Allow from all
    Require all granted
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html index.php index.htm l.php
</IfModule>


# "c:/Apache4/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "F:/phpStudy/PHPTutorial/Apache/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf
Include conf/extra/httpd-php.conf

尴尬【这里我也说不清了,我会在后续继续努力弄懂】
我的理解就是之前我们所使用的就是把PHP加载到Apache模块下面,就好比PHP的扩展一样,这里PHP就好比是Apache下面的一个扩展
再后来出现了PHP-fpm,它把两者分开了,PHP是PHP,Apache是Apache,两者中间有一个过度区来连接交互,这样出现了问题,我们很快就可以定位到具体的是谁有问题了,而不像之前那样,两者混搭,出现问题傻傻分不清

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值