【php】基础知识

1.php的垃圾回收机制

在创建一个php变量并赋值时,就会生成一个zval变量容器,例如$a = "abc";就生成了一个类型为string、值为abc的变量容器,并定义其被引用为is_ref=false,变量被使用次数refcount=1,把这个变量值赋给其他变量,它的引用次数就会增加,当它的某个引用生命周期结束,或者被unset()了,引用次数就-1,变量容器在 refcount = 0 时就被销毁。

$a = 'abc';
xdebug_debug_zval('a');//(interned, is_ref=0)string 'abc' (length=3)
$c = &$a;
$c = 'a';
xdebug_debug_zval('a');//(refcount=2, is_ref=1)string 'a' (length=1)
$b = $a;
xdebug_debug_zval('a');//(refcount=2, is_ref=1)string 'a' (length=1)
unset($c);
xdebug_debug_zval('a');//(refcount=1, is_ref=1)string 'a' (length=1)
echo $a;//a

只有&引用才会使refcount、is_ref改变的,普通的赋值不会改变$a的refcount、is_ref,&引用是把$a的内存地址复制给了$c,$c='a'后,$a也是='a'的。

为了解决循环引用内存泄露问题 , 使用同步周期回收算法,比如当数组或对象循环的引用自身 , unset掉数组的时候 , 当refcount-1后还大于0的 , 就会被当成疑似垃圾 , 会进行遍历 ,并且模拟的删除一次refcount-1如果是0就删除 ,如果不是0就恢复

2.PHP中定义常量的几种方式与区别?

使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数。另外const在编译时要比define快很多。

(1).const用于类成员变量的定义,一经定义,不可修改。define不可用于类成员变量的定义,可用于全局常量。

(2).const可在类中使用,define不能

(3).const不能在条件语句中定义常量。

(4).const采用一个普通的常量名称,define可以采用表达式作为名称。 

(5).const只能接受静态的标量,而define可以采用任何表达式。

(6).const定义的常量时大小写敏感的,而define可通过第三个参数(为true表示大小写不敏感)来指定大小写是否敏感。

3.php运行方式有哪些

cgi:需要每次通信都fork子进程来通信并销毁。

fast-cgi:持久化的cgi       

模块加载:作为apache的一个模块运行,需要与apache在同一台主机,且apache与php故障会互相影响。

cli:可以没有超时时间限制,有标准输出台。

4.函数和语句的区别

函数要被zend引擎解析为语言结构,因为多了一步所以往往没有语句快。

5.include和require的区别是什么?

require在编译时引用,当引用出错,会提示错误并且会终止程序执行
include在运行时引用,当引用出错,会提示一个错误并会继续执行下去

6.composer

composer install - 如有 composer.lock 文件,直接安装,否则从 composer.json 安装最新扩展包和依赖;
composer update - 从 composer.json 安装最新扩展包和依赖;
composer update vendor/package - 从 composer.json 或者对应包的配置,并更新到最新;
composer require new/package - 添加安装 new/package, 可以指定版本,如:composer require new/package ~2.5.

composer.json与composer.lock区别

当执行composer时,如果有composer.lock 文件,需要安装.lock中指定的版本,阻止自动获取最新版本的依赖项(这样可以保证在各个时期获取的依赖版本一致,避免更新后以前代码不可用或冲突),如果没有就从composer.json 安装最新扩展包和依赖,lock强调了对版本的锁定

二者都是json格式,composer.json指定了当前包的名称、描述、依赖、自动加载等信息,composer.json主要指定了要使用的包的版本等信息。

composer安装的文件夹路径:根目录的vender下

composer安装后的依赖如何调用:项目中include "vendor/autoload.php"

7.php的生命周期

模块初始化阶段(Module init):即调用每个拓展源码中的的PHP_MINIT_FUNCTION中的方法初始化模块,进行一些模块所需变量的申请,内存分配等。

请求初始化阶段(Request init):即接受到客户端的请求后调用每个拓展的PHP_RINIT_FUNCTION中的方法,初始化PHP脚本的执行环境。

执行该PHP脚本。

请求结束(Request Shutdown):这时候调用每个拓展的PHP_RSHUTDOWN_FUNCTION方法清理请求现场,并且ZE开始回收变量和内存

关闭模块(Module shutdown):Web服务器退出或者命令行脚本执行完毕退出会调用拓展源码中的PHP_MSHUTDOWN_FUNCTION 方法

8.for foreach区别

都用来遍历,for自定义指针可以遍历任何数据,foreach只能遍历数组或者对象,是按照其内部的指针去循环的。

9.http常用错误码及其含义

301 永久重定向

302 暂时重定向

401身份认证失败

403资源不可用,通常因为服务端文件权限问题

500 服务端故障,通常是执行代码故障,应检查php代码、php、nginx错误日志,也有可能是文件资源描述符限制进程不能打开过多文件,需要修改限制

502 504 服务端故障,通常是nginx故障,无法处理过多的用户请求,php-fpm不足等,需要查看php、nginx错误日志,适当增大并发支持或限流,也需要考虑是否被攻击服务器。

参考:

HTTP 状态码 | 菜鸟教程

501:502:503:504都是什么原因 - 云+社区 - 腾讯云

10.$a = 0123,echo $a;

输出83  因为开头的0代表八进制。与之相似,0x123 开头的0x代表16进制,输出291。

但是intval('0123')=123

intval('0x123')=0

是的,不是纯数字的字符串就是转为0,它不把0 0x做为进制标示来识别

11 define  const

define('A',123);
define('A',1234);
echo A; //123 

const A = 'dog';
const A = 'cat';
echo A;//dog

define、const都是定义常量,常量是不能被更改的,在第二次定义时还会报错Warning,但是不影响运行。

常量不用加$符号

在php中定义常量时,const和define的区别?

答:使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数。另外const在编译时要比define快很多。

1、const用于类成员变量的定义,一经定义,不可修改。Define不可以用于类成员变量的定义,可用于全局常量。

2、Const可在类中使用,define不能

3、Const不能在条件语句中定义常量

12.PHP的基本变量类型

四种标量类型:boolean (布尔型)、integer (整型)、float (浮点型, 也称作 double)、string (字符串)

两种复合类型:array (数组)、object (对象)

最后是两种特殊类型:resource(资源)、NULL(NULL)

13.秒杀简单流程

preview

14.php与nginx通信方式

 tcp socket

        IP+端口号与nginx通信,支持跨机器访问

unix socket

        Socket 在 Linux 中以文件形式存在,由于不需要建立额外的网络请求,所以效率更高,但是由于是本地文件,所以不能跨机器访问。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值