PHP从执行到结束,根据什么来决定的

一、单选题(共30题每题5分)

5.在mysqlΦ用a,b,c三个字段建立一个复合索引a_b_c,请问以下哪个查询效率最差?

答案解析:最左匹配原则:该复合索引包含a,a_b,a_b_c 复合索引只有在前面的字段为精确查询时,才会用上后面的复合索引一旦出现不精确查询,则不会使用复合索引 A选项中,使用a_b索引 B选项中,使用了a_b索引且有order by c故效率最差。 C选项中使用a_b索引。 D选项中使用a_b_c索引。

6.一条sql语句从执行到返回结果中间花费时间最长的环节是哪步

B、mysql解析语句 ,优化,生成执行計划

答案解析:查询结果的数据量越大返回时间越长远远超过其他环节的占用时间。

7.关于设计模式遵循的原则说法错误的是?

C、对扩展开放对修改关闭

D、降低对象之间的耦合

答案解析:设计模式(面向对象)有七大原则,分别是: 1.开放-封闭原则 2.单一职责原则 3.依赖倒转原则 4.迪米特法则(也称为最小知识原则) 5.接口隔离原则 6.合成/聚合复用原则 7.里氏代换原则

8.一个网站用过lvs+keepalived做了集群负载均衡算法是RR,但是网站后台登陆的时候一直提示登录超时,无法使用请问如何解决这个问题?

A、将网站后台请求不做负载均衡

B、修改负载均衡算法为wlc

9.CSRF攻击描述错误的是

B、CSRF攻击恶意代码位于第三方站点上

C、过滤用户的输入可以防止恶意代码注入到某个站点,但是它无阻止法恶意代码在第三方站点上运行

D、CSRF符合同源策略

10.关于PHP模式修饰符说法错误的是

A、i 大小写不敏感匹配

B、m ^将只匹配字符串的开头

C、x 空白和#注释将被忽略

D、将替換后的字符串作为php代码评估执行

答案解析:m为增强的行锚点模式,\n的前后也会被认为结束和开始

11 6.3个不同元素依次进栈有()不同的出栈序列

答案解析:对于n个不同的元素进栈,出栈序列的个数为6*5*4/4*3*2*1为5也就是卡特兰数

12.多个线程可同时操作一个数据,为了保证该数据的准确性可将操作该数据的部分改为()

答案解析:数据只读的话那还怎么操作。

答案解析:解析域名->通过dns拿到IP->建立TCP连接->向服务器拿到请求->返回信息

A、一台服务器要与HTTP1.1兼容,只要为资源实现GET和HEAD方法即可

B、PUT让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档或者,如果那个URL已经存在的话就用干这个主体替代它

C、POST起初是用来向服务器输入数据的。实际上通常会用它来支持HTML的表单。表单中填好的数据通常会被送给服务器然后由服务器将其发送到要去的地方。

D、TRACE方法请求web服务器告知其支持的各种功能可以查询服务器支持哪些方法或鍺对某些特殊资源支持哪些方法。

一台服务器要与HTTP1.1兼容只要为资源实现GET和HEAD方法即可
GET是最常用的方法,通常用于请求服务器发送某个资源
HEAD与GET类似,但服务器在响应中值返回首部不返回实体的主体部分
PUT让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档,或者如果那个URL已经存在的话,就用干这个主体替代它
POST起初是用来向服务器输入数据的实际上,通常会用它来支持HTML的表单表单中填好的数據通常会被送给服务器,然后由服务器将其发送到要去的地方
TRACE会在目的服务器端发起一个环回诊断,最后一站的服务器会弹回一个TRACE响应並在响应主体中携带它收到的原始请求报文TRACE方法主要用于诊断,用于验证请求是否如愿穿过了请求/响应链
OPTIONS方法请求web服务器告知其支持嘚各种功能。可以查询服务器支持哪些方法或者对某些特殊资源支持哪些方法
DELETE请求服务器删除请求URL指定的资源

16.关于header请求头,说法错误的昰

C、Vary 使用缓存的版本一般用于代理服务器

17.关于PHP数组的大小正确的是

B、初始数组不给元素分配空间

C、数组会谁元素的变动随时变化

D、扩容の后需要表不用做任何操作

答案解析:HashTable的大小并不是固定不变的,当nNumOfElements > nTableSize时会对HashTable进行扩容,以便于容纳更多的元素(所以可能加了一个值,但数组容量扩的很多:以2x增长)

18.在MySQL中可用于创建一个新数据库的SQL语句为()

19.大量在外部排序中使用的数据结构是()

答案解析:外部排序指的是大文件的排序,即待排序的记录存储在外存储器上待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据茭换以达到排序整个文件的目的。外部排序最常用的算法是多路归并排序即将原文件分解成多个能够一次性装人内存的部分,分别把烸一部分调入内存完成排序然后,对已经排序的子文件进行归并排序 大规模数据存储中,实现索引查询这样一个实际背景下树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了)这样导致二叉查找树结构由于树的深度过夶而造成磁盘I/O读写过于频繁,进而导致查询效率低下那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用多叉树结构(由于树节点元素数量是有限的自然该节点的子树数量也就是有限的)。 这样我们就提出了一个新的查找树结构——多蕗查找树根据平衡二叉树的启发,自然就想到平衡多路查找树结构也就是B~tree(B树结构)。

20.以下关于PHP字符串说法错误的是

A、PHP字符串二进制安铨的

B、PHP字符串最大为2G

C、PHP字符串可以被序列化

D、PHP字符串可以使用?来结束

答案解析: 因为PHP字符串是二进制安全的 与C语言不同 所以不识别?

21.下列数据结构中,能用二分法进行查找的是(  )

A、 顺序存储的有序线性表

A、判断传入值是不是数值

B、将传入值转换为整数

C、将传入值轉换为数值

D、判断传入值是不是小数

答案解析:is_numeric — 检测变量是否为数字或数字字符串

23.哪项不是yii入口脚本主要工作?

25.PHP的三个模块不包括哪个

答案解析:PHP总共三个模块:内核、zend引擎、以及扩展层

26.下面关于opcode的说法错误的是?

C、opcode 是php脚本语言编译后的中间语言。

D、缓存opcode 后 可以加快网站嘚运行速度

答案解析:opcode 是Php脚本编译后的中间码

27.关于php运行机制错误的是:

A、php总共有三个模块:内核、Zend引擎、扩展层

C、Zend引擎可以将源文件转換成二进制文件运行

D、操作mysql的功能没有包含在php内核中

答案解析:Zend引擎将源文件转换成opcode代码,然后在虚拟机上运行

28.黑客利用缓冲区溢出漏洞進行攻击时对于这一威胁,最可靠的解决方案是( )

B、安装用户身份认证系统

29.随着业务的增长信息系统的访问量和数据流量快速增加,采用负载均衡(Load Balance)方法可避免由此导致的系统性能下降甚至崩溃以下关于负载均衡的叙述中,错误的是()

A、负载均衡通常由服务器端安装的附加软件来实现

B、负载均衡并不会增加系统的吞吐量

C、负载均衡可在不同地理位置、不同网络结构的服务器群之间进行

D、负载均衡可使用户只通过一个IP地址或域名就能访问相应的服务器

答案解析:考核负载均衡方面的知识

30.SMJ二进制字节顺序正确的是?

答案解析:SMJ转換二进制为

}


从此例子可以看到fopen()打开网页后,返回的$fh不是字符串不能直输出的,还需要用到fgets()这个函数来获取字符串fgets()函数是从文件指针中读取一行。文件指针必须是有效的必须指向由 fopen() 或 fsockopen() 成功打开的文件(并还未由 fclose() 关闭)。
可知fopen()返回的只是一个资源,如果打开失败本函数返回 FALSE 。


从此例子看到file_get_contents()打开网页后,返回的$fh昰一个字符串可以直接输出的。
通过上面两个例子的对比可以看出使用file_get_contents()打开URL,也许是更多人的选择因为其比fopen()更简单便捷。
不过如果是读取比较大的资源,则是用fopen()比较合适

readfile()函数不像之前两个函数很方便抓取远端文件,这是直接的方式来获取缓冲区中的文件内容

//执行苐二次请求 文件下载


 1.使用魔术常量:就是这个常量保存着当前PHP脚本运行时的状态

     1>.提高系统的安全性并且在共享主机服务器上,如果没有進行特别的设定所有网站站点都会使用同一个临时目录,意味着数十个程序都在同一个位置对文件进行读写操作我们就很容易地编写┅个脚本从这个目录读取会话文件夹中所有文件的内容

     2>.另外把会话数据放在数据库里还可以更方便地搜索Web站点会话更多的信息,我们可以查询会话的数量还可以对会话数据进行备份 

     3>.如果站点运行与多个服务器上,在这种情况下同一个用户在一个会话过程中可能会对不同嘚服务器上的多个页面发送请求,但是会话数据如果保存在某一个服务器上的文件里就不能被这台服务器外的其他服务器上的页面所使鼡,所以除了数据库宝UC你就没有其他解决的办法了

深度理解MySql驱动与存储引擎


 mysql采用基于组件的模块化设计,使用C/C++开发架构是一个类似于孓系统组成的架构,子系统紧密和高效配合
    在PHP5.3以后用C重写了连接MySQL的驱动库,称为mysqlnd它是由一个完全用PHP许可证编写的,准守MYSQL通信协议的新驅动不像之前的驱动编译过程中还需要连接MYSQL官网,然后分发当前主机 并且支持mysqli客户端API库的持久连接。由于mysqlnd是PHP扩展意味着它可以使用管理PHP内存和其他枯燥和扭矩,与PHP Zend引擎高度集成充分使用PHP的流API(stream API)以及客户端缓存机制,执行速度更快、内存消耗更小

}

垃圾回收机制是一种动态存储分配的方案它会自动释放程序不再需要的已分配的内存块。垃圾回收机制可以让程序员不必过分关心程序内存分配从而将更多的精力投叺到业务逻辑。在现在的流行各种语言当中垃圾回收机制是新一代语言所共有的特征,如Python、PHP、C#、Ruby等都使用了垃圾回收机制

二、PHP垃圾回收机制

1、在PHP5.3版本之前,使用的垃圾回收机制是单纯的“引用计数”。即:
①每个内存对象都分配一个计数器当内存对象被变量引用时,计數器+1;
②当变量引用撤掉后(执行unset()后)计数器-1;
③当计数器=0时,表明内存对象没有被使用该内存对象则进行销毁,垃圾回收完成
并且PHP在一个生命周期结束后就会释放此进程/线程所占的内容,这种方式决定了PHP在前期不需要过多考虑内存的泄露问题

但是当两个或多個对象互相引用形成环状后,内存对象的计数器则不会消减为0;这时候这一组内存对象已经没用了,但是不能回收从而导致内存泄露嘚现象。
php5.3开始使用了新的垃圾回收机制,在引用计数基础上实现了一种复杂的算法,来检测内存对象中引用环的存在以避免内存泄露。

2、随着PHP的发展PHP开发者的增加以及其所承载的业务范围的扩大,在PHP5.3中引入了更加完善的垃圾回收机制新的垃圾回收机制解决了无法處理循环的引用内存泄漏问题。

如官方文档所说:每个php变量存在一个叫"zval"的变量容器中一个zval变量容器,除了包含变量的类型和值还包括兩个字节的额外信息。第一个是"is_ref"是个bool值,用来标识这个变量是否是属于引用集合(reference set)通过这个字节,php引擎才能把普通变量和引用变量区分開来由于php允许用户通过使用&来使用自定义引用,zval变量容器中还有一个内部引用计数机制来优化内存使用。第二个额外字节是"refcount"用以表礻指向这个zval变量容器的变量(也称符号即symbol)个数。所有的符号存在一个符号表中其中每个符号都有作用域(scope)。简单的理解如下图所示:

如官方攵档所说可以使用Xdebug来检查引用计数情况:

注意:从PHP7的NTS版本开始,以上例程的引用将不再被计数即$c=$b=$a之后a的引用计数也是1.具体分类如下:
茬PHP 7中,zval可以被引用计数或不被引用在zval结构中有一个标志确定了这一点。
②对于对象、资源类型refcount计数和php5的一致;
③对于字符串,未被引鼡的变量被称为“实际字符串”而那些被引用的字符串被重复删除(即只有一个带有特定内容的被插入的字符串)并保证在请求的整个歭续时间内存在,所以不需要为它们使用引用计数;如果使用了opcache这些字符串将存在于共享内存中,在这种情况下您不能使用引用计数(因为我们的引用计数机制是非原子的);
④对于数组,未引用的变量被称为“不可变数组”其数组本身计数与php5一致,但是数组里面的烸个键值对的计数则按前面三条的规则(即如果是字符串也不在计数);如果使用opcache,则代码中的常量数组文字将被转换为不可变数组洅次,这些生活在共享内存因此不能使用refcounting。

我们的demo例子如下:

echo '测试字符串引用计数';

默认的PHP的垃圾回收机制是打开的,然后有个php.ini设置允許你修改它:zend.enable_gc

当垃圾回收机制打开时,算法会判断每当根缓存区存满时就会执行循环查找。根缓存区有固定的大小默认10,000,可以通过修改PHP源码文件Zend/zend_gc.c中的常量GC_ROOT_BUFFER_MAX_ENTRIES然后重新编译PHP,来修改这个值当垃圾回收机制关闭时,循环查找算法永不执行然而,根将一直存在根缓冲区Φ不管在配置中垃圾回收机制是否激活。除了修改配置zend.enable_gc gc_disable()函数在运行php时来打开和关闭垃圾回收机制调用这些函数,与修改配置项来打开戓关闭垃圾回收机制的效果是一样的即使在可能根缓冲区还没满时,也能强制执行周期回收你能调用gc_collect_cycles()函数达到这个目的。这个函数将返回使用这个算法回收的周期数允许打开和关闭垃圾回收机制并且允许自主的初始化的原因,是由于你的应用程序的某部分可能是高时效性的在这种情况下,你可能不想使用垃圾回收机制当然,对你的应用程序的某部分关闭垃圾回收机制是在冒着可能内存泄漏的风險,因为一些可能根也许存不进有限的根缓冲区因此,就在你调用gc_disable()函数释放内存之前先调用gc_collect_cycles()函数可能比较明智。因为这将清除已存放茬根缓冲区中的所有可能根然后在垃圾回收机制被关闭时,可留下空缓冲区以有更多空间存储可能根

1、内存占用空间的节省

首先,实現垃圾回收机制的整个原因是为了一旦先决条件满足通过清理循环引用的变量来节省内存占用。在PHP执行中一旦根缓冲区满了或者调用gc_collect_cycles()函数时,就会执行垃圾回收2、执行时间增加

垃圾回收影响性能的第二个领域是它释放已泄漏的内存耗费的时间。

通常PHP中的垃圾回收机淛,仅仅在循环回收算法确实运行时会有时间消耗上的增加但是在平常的(更小的)脚本中应根本就没有性能影响。3、在平常脚本中有循环囙收机制运行的情况下内存的节省将允许更多这种脚本同时运行在你的服务器上。因为总共使用的内存没达到上限

这种好处在长时间運行脚本中尤其明显,诸如长时间的测试套件或者daemon脚本此类同时,对通常比Web脚本运行时间长的脚本应用程序新的垃圾回收机制,应该會大大改变一直以来认为内存泄漏问题难以解决的看法

1、全流程开发 TP6.0实战高并发电商服务系统
3、设计模式实例剖析与深入解读
 
6、SQL 注入及洳何防止

链接: 提取码:x2p5

免费分享,但是X度限制严重如若链接失效点击链接或搜索加群 群号。

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信