作者:PHP学习网来源:https://www.viphper.com/?p=1236本文版权归作者所有,欢迎转载,但必须保留此声明未经作者同意,并在文章页面显着位置给出原文链接,否则保留追究法律责任的权利。公司出过一些PHP自测题,题和答案都记录在这里,方便记忆。1.什么是魔法函数,什么时候调用?__construct(),类构造函数__destruct(),类析构函数__call(),调用对象中不可访问的方法时调用__callStatic(),静态调用不可访问方法时调用__get(),获取对象时调用__set()类的成员变量,设置类的成员变量时调用__isset(),调用不可访问的属性时调用isset__unset()在属性为empty()或empty()时调用,unset()在不可访问的属性上调用。__sleep(),当执行serialize()时,会先调用__wakeup()这个函数,当执行unserialize()时,会先调用__toString()这个函数,当类被当成是时的响应方法__invoke()一个字符串,调用函数的方法调用对象的响应方法__set_state(),调用var_export()导出类时,会调用这个静态方法。__clone(),复制对象时调用2.isset和空函数有什么区别?PHP的isset()函数一般用于检测变量是否被格式化:boolisset(mixedvar[,mixedvar[,...]])功能:检查变量是否被设置返回值:如果变量不存在,返回假;如果变量存在且值为NULL,也返回FALSE;如果变量存在且其值不为NULL,则返回TURE仅当每个单项满足前面的要求时才返回TRUE,否则结果为FALSE版本:PHP3、PHP4、PHP5更多说明:使用unset()后释放变量,它将不再是isset()。PHP函数isset()只能用于变量,传递任何其他参数都会导致解析错误。要检查是否已设置常量,请使用defined()函数。PHP的empty()函数判断值是否为空格式:boolempty(mixedvar)功能:检查一个变量是否为空返回值:如果变量不存在,返回TRUE如果变量存在且值为"",0,"0",NULL,,FALSE,array(),var$var;和没有任何属性的对象,如果变量存在且值不是"",0,"0",NULL,,FALSE,array(),var$var;则返回TURE;andobjectswithoutanyattributes,returnFALSEversion:PHP3,PHP4,PHP5更多说明:empty()的返回值=!(boolean)var,但不会因为变量未定义而产生警告信息。有关详细信息,请参阅转换为布尔值。empty()只能用于变量,传递任何其他参数将导致Paser错误并终止操作。要检查是否已设置常量,请使用defined()函数。3.什么是PHP的和定义的变量,它们是什么?超全局变量——超全局变量是在所有作用域中始终可用的内置变量$GLOBALS——引用全局作用域中可用的所有变量$_SERVER——服务器和执行环境信息$_GET——HTTPGET变量$_POST——HTTPPOST变量$_FILES—HTTP文件上传变量$_REQUEST—HTTP请求变量$_SESSION—会话变量$_ENV—环境变量$_COOKIE—HTTPCookies$php_errormsg—先前的错误消息$HTTP_RAW_POST_DATA—原始POST数据$http_response_header—HTTP响应头$argc—参数数量传递给脚本PHP中的许多预定义变量都是“超全局变量”,这意味着它们在脚本的整个范围内都可用。无需执行global$variable即可访问它们;在一个函数或方法中。这些超全局变量是:$GLOBALS$_SERVER$_GET$_POST$_FILES$_COOKIE$_SESSION$_REQUEST$_ENV4。简述PHP的垃圾回收机制php5.3之前使用的垃圾回收机制是纯粹的“引用计数”,即为每个内存对象分配一个计数器。当内存对象被变量引用时,计数器+1;当变量引用被移除时,计数器为-1;销毁,垃圾收集完成。“引用计数”存在一个问题,即当两个或多个对象相互引用形成环时,内存对象的计数器不会减为0;这时候这组内存对象就没用了,而且不能回收。这会导致内存泄漏;从php5.3开始,使用了一种新的垃圾回收机制,基于引用计数,实现了复杂的算法来检测内存对象中是否存在引用环,从而避免内存泄漏。PHP变量存在于名为“zval”的变量容器中。“zval”变量容器包括变量的类型和值,还包括两个额外的字节信息,即“is_ref”表示变量是否为引用,“refcount”表示指向这个zval变量容器的变量个数.5.列举PHPopcache通信缓存查询缓存的性能优化方法和技巧6.MySQL存储引擎中innodb和myisam的区别MySQL。两种表类型各有优缺点,具体取决于具体应用。基本区别是:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型表强调性能,执行速度比InnoDB类型快,但不提供事务支持,而InnoDB提供事务支持和外部键等高级数据库功能。下面是一些细节和具体实现上的区别:◆1.InnoDB不支持FULLTEXT类型的索引。◆2.InnoDB并没有保存表中具体的行数,也就是说在执行selectcount()fromtable时,InnoDB需要扫描整个表来计算有多少行,而MyISAM只是简单的读出行数保存的行就是这样。注意当count()语句包含where条件时,两张表的操作是一样的。◆3.对于AUTO_INCREMENT类型的字段,InnoDB必须只包含该字段的索引,而在MyISAM表中,可以与其他字段建立联合索引。◆4.当DELETEFROMtable时,InnoDB不会重新创建表,而是逐行删除。◆5.LOADTABLEFROMMASTER操作不适用于InnoDB。解决方法是先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于额外使用的InnoDB特性(比如外键)的表不适用。另外,InnoDB表的行锁不是绝对的。如果MySQL在执行SQL语句时不能确定要扫描的范围,InnoDB表也会锁住整张表。例如updatetablesetnum=1wherenamelike“%aaa%”两种类型的主要区别在于Innodb支持事务处理、外键和行级锁,而MyISAM不支持。因此,MyISAM通常被认为只适合在小型项目中使用。作为一个使用MySQL的用户,我更喜欢Innodb和MyISAM,但是从我目前的运维数据库平台来看满足要求:99.9%的稳定性、方便的扩展性和高可用性,MyISAM绝对是我的首选。原因如下:1、首先,我现在平台上托管的项目,大部分都是读多写少的项目,MyISAM的读性能比Innodb强很多。2、MyISAM的索引和数据分离,索引被压缩,所以内存占用也相应提高了很多。可以加载更多索引,而Innodb与索引和数据紧密绑定。如果没有压缩,Innodb比MyISAM大得多。3、从平台的角度来看,经常会发生应用开发者每隔一两个月不小心更新一个写的scope错误的表,导致表无法使用的情况。这时候MyISAM的优越性就体现出来了。把当天拷贝的压缩包里的表对应的文件拿出来,放到一个数据库目录下,然后dump成sql再导回主库,填入对应的binlog。如果是Innodb,恐怕不可能有这么快的速度。别跟我说Innodb是用exportxxx.sql机制定时备份的,因为我这个平台最小的数据库实例数据量基本都是几十G。4、从我接触过的应用逻辑来看,selectcount(*)和orderby是最频繁的操作,可以占SQL语句总数的60%以上,而这个操作Innodb实际上会锁表,很多人认为Innodb是行级锁,也就是只有主键对它有效的地方,非主键会锁住整张表。5.另外,很多应用部门经常需要我定期给他们提供某些表的数据。MyISAM非常方便。只需将frm发送给他们即可。启动就可以了,但是Innodb需要导出xxx.sql,因为受字典数据文件的影响,对方无法使用。6.如果与MyISAM进行插入写操作相比,Innodb仍然无法达到MyISAM的写性能。如果是基于索引的更新操作,虽然MyISAM可能比不上Innodb,但是这样的高并发写入,从库能赶上吗?上面也是一个问题,还是通过多实例分库分表架构来解决比较好。7、如果使用MyISAM,合并引擎可以大大加快应用部门的开发速度。他们只需要对merge表做一些selectcount(*)操作,非常适合某类行数总计上亿的大型项目(如日志、调查统计)业务表。当然,Innodb也不是完全没用。我将Innodb用于交易项目,例如模拟股票交易项目。当活跃用户超过20万时,也很容易应对。因此,我个人非常喜欢Innodb,但如果从数据库平台应用出发,我还是更喜欢MyISAM。另外,可能有人会说你的MyISAM无法抵抗太多的写操作,但是我可以通过架构来弥补。先说一下我现有的数据库平台的容量:主从数据总量在几百TB以上,每天超过十亿pv的动态页面,也有几个大项目是通过调用数据接口,不计入pv总数(包括一个大型项目,因为前期没有部署memcached,导致单库每天处理9000万条查询)。我的整体数据库服务器平均负载约为0.5-1。7、Mysql有哪些存储类型?什么是聚簇索引和非聚簇索引?1、B+树索引(O(log(n))):B+树索引可以参考MySQL索引背后的数据结构和算法原理2、哈希索引:a只能满足"=","IN"和“<=>”查询,不能使用范围查询;b其检索效率很高,索引检索可以一次定位,不像B-Tree索引需要多次IO访问,从根节点到分支节点,最后到页节点,所以查询效率Hash索引远高于B-Tree索引。只有Memory存储引擎支持哈希索引3、FULLTEXT索引(目前MyISAM和InnoDB引擎都支持)4、R-Tree索引(用于为GIS数据类型创建SPATIAL索引)从物理存储的角度1、聚簇索引(聚集索引)2、非聚集索引(non-clusteredindex)从逻辑角度1.主键索引:主键索引是一种特殊的唯一索引,不允许空值2。普通索引或单列索引3.多列索引(复合索引):复合索引是指在多个字段上创建的索引,只有在查询中使用创建索引时的第一个字段时才会使用该索引健康)状况。使用复合索引时,遵循最左边的前缀集4.唯一索引或非唯一索引5.空间索引:空间索引是为空间数据类型的字段建立的索引。MYSQL中有4种空间数据类型,分别是GEOMETRY和POINT、LINESTRING、POLYGON。MYSQL使用SPATIAL关键字进行扩展,以允许使用创建常规索引类型的语法创建空间索引。要创建空间索引的列,必须将其声明为NOTNULL。空间索引只能在存储引擎为MYISAM的表中创建。CREATETABLEtable_name[col_namedatatype]unique|fulltext|spatialindex_name[asc|desc]1、unique|fulltext|spatial为可选参数,分别代表唯一索引、全文索引、空间索引;2、index和key是同义词,作用相同。它们用于指定要创建的索引。3、col_name为需要建立索引的字段列,该列必须是Selectfrommultiplecolumnsdefinedinthedatatable;4.index_name指定索引的名称,可选参数。如果不指定,MYSQL默认使用col_name作为索引值;5.length为可选参数,表示索引的长度。只有字符串类型的字段可以指定索引长度;6、asc或desc指定升序或降序索引值存储8、Memcache和Redis的过期机制是什么?什么是一致性哈希?数据存储方式:SlabAllocation数据过期方式:LazyExpiration+LRUSlabAllocator的基本原理是将分配的内存按照预定大小划分为特定长度的块,从而彻底解决内存碎片问题。SlabAllocation的原理很简单。将分配的内存分成大小不一的块(chuk),将大小相同的块分成组(chunk的集合)Page:分配给Slab的内存空间,默认1MB。分配给Slab后,根据slab的大小划分成chunk。Chunk:用于缓存记录的内存空间。Slab类:一组特定大小的块。Memcached根据接收到的数据大小选择最适合数据大小的slab。Memcached在slab中存储了一个空闲chunk的列表,根据列表选择chunk,然后将数据缓存在其中。SlabAllocation的缺点是分配的内存不能有效使用,因为它分配了特定长度的内存。例如,如果将100字节的数据缓存到128字节的块中,则剩余的28字节将被浪费。数据过期方法LazyExpirationmemcached内部不监控记录是否过期,而是在获取记录时检查记录的时间戳来检查记录是否过期。这种技术称为懒惰(lazy)过期。因此,memcached不会将CPU时间花在过期监控上。LRUmemcached会优先使用超时记录的空间,但即便如此,追加新记录时也会出现空间不足的情况。在这种情况下,名称将使用最近最少使用(LRU)机制来分配空间。这是删除“最近最少使用”记录的机制。因此,当memcached的内存空间不足时(无法从slab类获取新的空间时),它会从最近没有被使用的记录中查找,将自己??的空间分配给新的记录。人们常说memcached命中率低。LRU策略引起的。大家可能经常会遇到为什么我的内存足够大的时候会触发LRU。因为LRU是针对SLAB的。例如:我存储的数据在100K左右。内饰会选择尺寸合适的SLAB。这个时候,他就会选择适合自己的。他会选择上图中的SLBACLASS2。如果此时SLABCLASS2满了或者小于100K。他会调用LRU机制。会清理SLABCLASS2中chunk中最近很少使用的数据,导致数据即使没有过期也被清理掉。所以在使用memcached的时候一定要注意数据大小的匹配方式和增长因子。REDIS过期时间机制1.volatile-lru:从设置过期时间的数据集中,选择最新最长未使用的数据发布2.allkeys-lru:从数据集(包括设置过期时间的数据集和没有过期时间的数据集),选择最近未使用的数据发布3.volatile-random:从设置过期时间的数据集中,随机选择一条数据发布4.allkeys-random:从数据集(包括设置过期时间和未设置过期时间)随机选择一条数据进行释放5.volatile-ttl:从设置过期时间的数据集中,选择即将过期的数据进行释放操作6.noeviction:不删除任何数据(不过redis也会根据引用计数器释放哟~),这时候如果内存不够,会直接返回错误。默认的内存策略是noeviction。Redis中的LRU算法是一种近似算法。默认情况下,Redis随机选择5个key,选择距离最近且时间最长的Key淘汰掉。在配置文件中,可以通过maxmemory-samples的值来设置redis需要校验的key的个数,但是校验的越多,耗时越长,但是结构越准确(即Redis从Objects开始内存中淘汰会长时间不用~),设置多少,具体业务权衡一般以默认为准。REDIS还有一个定时策略,定期删除过期的缓存数据,以节省内存。这种方式还是很不错的。该策略优先于LRU。目前比较一下MEMCACHED和REDIS的过期时间机制。REDIS的命中率明显高于MEMCACHED。至于哪种场景适合业务,大家一起来比比吧!目前,我将REDIS视为一种补充MEMCACHED的NOSQL产品。Consistenthashing,一种分布式节点密钥分发算法,可选;9、MySQL索引的底层数据结构是如何存储的,为什么使用索引时查询速度更快?B-Tree和B+Tree的数据结构和算法的基本索引性质特殊的存储结构,寻道成本低;MySQL索引实现MyISAM索引实现非聚集索引InnoDB索引实现聚集索引第一个主要区别是InnoDB数据文件本身是索引文件。与MyISAM索引的第二个区别是InnoDB的辅助索引数据字段存储的是对应记录的主键值,而不是地址。聚簇索引的实现使得主键查找非常高效,但是辅助索引查找需要两次检索索引:先检索辅助索引获取主键,再使用主键检索其中的记录一级指标。10、优化mysql的方法是避免复查查询,避免模糊查询,避免在数据库中操作,避免大量吞吐量,尽可能缩小搜索范围,尽可能使用索引,使用const字段尽可能在唯一或近乎唯一的索引联合搜索11.find和grep的区别find是搜索文件grep是搜索文件中的内容12.记下以下服务的用途和默认端口FTP:|21/TCP|根据FTP协议提供服务,FTP协议是专门用来传输文件的协议。SSH:|22/TCP|一种旨在为远程登录会话和其他网络服务提供安全性的协议。使用SSH协议可以有效防止远程管理过程中的信息泄露。HTTP:|80/TCP|是互联网上使用最广泛的网络协议。所有WWW文档都必须符合此标准。远程登录:|23/TCP|Telnet协议是TCP/IP协议家族的成员。它是互联网远程登录服务的标准协议和主要方法。它为用户提供了在本地计算机上完成远程主机工作的能力https:|443/TCP443/UDP|是一个面向安全的HTTP通道,简单的说就是安全版的HTTP。即在HTTP下增加SSL层,HTTPS的安全基础是SSL,所以加密的详细内容需要SSL13。给text.txt文件加上除owner以外的执行权限,最后把文件权限写成数字chmodg+x,o+xtext.txt
