php总结

x33g5p2x  于2022-03-15 转载在 其他  
字(11.2k)|赞(0)|评价(0)|浏览(373)

1.PHP魔术方法都有哪些?
__construct() 类的构造函数
__destruct() 类的析构函数
__call() 在对象中调用一个不可访问方法时调用
__callStatic() 用静态方式中调用一个不可访问方法时调用
__get() 获得一个类的成员变量时调用
__set() 设置一个类的成员变量时调用
__isset() 当对不可访问属性调用isset()或empty()时调用
__unset() 当对不可访问属性调用unset()时被调用
__sleep() 执行serialize()时,先会调用这个函数
__wakeup() 执行unserialize()时,先会调用这个函数
__toString() 类被当成字符串时的回应方法
__invoke() 调用函数的方式调用一个对象时的回应方法
__set_state() 调用var_export()导出类时,此静态方法会被调用
__clone() 当对象复制完成时调用
__autoload() 尝试加载未定义的类
__debugInfo() 打印所需调试信息
2.命名空间
避免类,常量,函数之间命名的冲突,提高代码的可读性。
3.在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?
urlencode
4.写出五种以上你使用过的PHP的扩展的名称(提示:常用的PHP扩展)
mb_sring
iconv
curl //抓取远程图片到本地
GD
XML
socket
MySQL
PDO //PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。
5.数据表引擎
MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
6.如何MySQL性能优化
选取最适用的字段属性
通过Show命令,慢查询日志,profiling分析查询确定瓶颈。
使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。
当只要一行数据时使用 LIMIT 1
为搜索字段建索引
在Join表的时候使用相当类型的例,并将其索引
尽可能的使用 NOT NULL
水平分表
垂直分表
选择正确的存储引擎
避免长连接
使用连接(JOIN)来代替子查询(Sub-Queries)
使用联合(UNION)来代替手动创建的临时表
事务
设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。
选择合适的表字段数据类型和存储引擎,适当的添加索引。
mysql库主从读写分离。
找规律分表,减少单表中的数据量提高查询速度。
添加缓存机制,比如memcached,apc等。
不经常改动的页面,生成静态页面。
链接数据库使用 PDO,或者 mysqli 预处理缓存字段
书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE
不要用 like 来查询 这样很不效率,用 Sphinx 全文检索
7.php中对数组序列化和反序列化的函数分别是
serialize 和 unserialize ;
8.empty、 isset、is_null的区别:
empty: 如果 变量 是非空或非零的值,则 empty() 返回 FALSE。换句话说,”"、0、”0″、NULL、FALSE、array()、var $var、未定义;以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。
isset: 如果 变量 存在(非NULL)则返回 TRUE,否则返回 FALSE(包括未定义)。变量值设置为:null,返回也是false;unset一个变量后,变量被取消了。注意,isset对于NULL值变量,特殊处理。
is_null: 检测传入值【值,变量,表达式】是否是null,只有一个变量定义了,且它的值是null,它才返回TRUE . 其它都返回 FALSE 【未定义变量传入后会出错!】
9.PHP写出显示客户端信息的代码
$_SERVER[‘REMOTE_ADDR’]; //获取ip地址
$_SERVER[‘PHP_SELF’]; //正在执行脚本的文件名
$_SERVER[‘REQUEST_METHOD’]; //访问页面时的请求方法
$_SERVER[‘SCRIPT_FILENAME’]; #当前执行脚本的绝对路径名。
KaTeX parse error: Expected 'EOF', got '#' at position 27: …RVER_PORT']; #̲服务器所使用的端口 10.请问…str)
explode()
数组元素组合为字符串
implode(’’,a r r ) j o i n ( " " , arr) join(" ",arr)join("",arr)
字符串截取
substr($str,1,10);
函数替换字符串中的一些字符(区分大小写)
preg_replace 函数执行一个正则表达式的搜索和替换
preg_replace(’/\s+/’, ‘’, $str);

$string = 'google 123, 456';
	$pattern = '/(\w+) (\d+), (\d+)/i';
	$replacement = 'runoob ${2},$3';
	echo preg_replace($pattern, $replacement, $string);
正则匹配
	//模式分隔符后的"i"标记这是一个大小写不敏感的搜索
	if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
		echo "查找到匹配的字符串 php。";
	} else {
		echo "未发现匹配的字符串 php。";
	}
查找 "Shanghai" 在 "I love Shanghai!" 中的第一次出现,并返回字符串的剩余部分:
	echo strstr("I love Shanghai!","Shanghai");

查找 "php" 在字符串中第一次出现的位置
	echo strpos("You love php, I love php too!","php");

查找 "php" 在字符串中最后一次出现的位置
	echo strrpos("You love php, I love php too!","php");

13.PHP的类中:protect,public,private,interface,abstract,final,static的含义
1)protect   被保护的 
2)public   公有的 
3)private  私有的 
4)interface 接口 
5)abstract 抽象类 
6)final 最后的类和方法 
7)static 静态方法和属性
14.描述一下大流量高并发量网站的解决方案
1)lvs或nginx负载均衡器 
2)squid缓存或nginx web cache缓存 
3)web服务器选型(nginx代替apache) 
4)php代码静态化(smarty或框架) 
5)sphinx 
6)memcache 
7)sql语句一定要注意索引使用 
8)主从分流 
9)分库分表或分区 
10)磁盘分布(raid0+raid1)
15.如何进行防SQL注入
1.表单尽量用post,表单判断控制走get,因为get比post速度快 
2.$_SERVER[HTTP_REFERER]判断提交者的源头 
3.开启addslashes,在’,“,\头加\ 
4.密码一定设置md5加密 
5.服务器本身的安全(web+mysql)
16.防止盗链
1.服务器上防止 
Apache和nginx做rewrite基于源来做判断阻止盗链 
2.代码防止 
$_SERVER[HTTP_REFERER] 
17.什么事面向对象?主要特征是什么?
1)面向对象是程序的一种设计方式,它利于提高程序的重用性,是程序结构更加清晰。
2)主要特征:封装、继承、多态
18.MyISAM 和 InnoDB 的基本区别?
1)在增、删、改和查方面,myisam 要优于 innodb 表引擎,当数据量特别大时,他们的速度相差不大
2)innodb 支持 myisam 所不具备的事务支持、存储过程、行级锁定等等
19.isset() 和 empty() 区别,对不同数据的判断结果
1)isset()是判断变量是否存在,是否定义
2)empty()是判断变量的值是否为空.
20.面向对象中接口和抽象类的区别及应用场景:
他们的不同点:
1,抽象类中可以有非抽象的方法而接口中只能够有抽象的方法!
2,一个类可以继承多个接口,而一个类只能继承一个抽象类!
3,接口的使用方式通过 implements 关键字进行,抽象类则是通过继承 extends 关键字进行!
interface one{
function fun1();
function fun2();
}
abstract class two implements one{
abstract function fun1();
abstract function fun2();
}
class four extents two{
function fun1(){
echo “fun1”;
}
function fun2(){
echo “fun2”;
}
}
21.用面向对象来实现 A 对象继承 B 和 C 对象:

<?php class C { function funC(){ echo “funC”; } } class B extends C { function funB(){ echo “funB”; } } class A extends B { function funA(){ echo “funA”; } } $p=new A(); $p->funC(); $p->funB(); $p->funA(); ?>

22.谈谈你对 MVC 的认识,介绍几种目前比较流行的 MVC 框架?
Mvc 优点:
1)低耦合性
2)高重用性和可使用行
3)快速的部署
4)可维护性
23.修改权限
Chmod 777 showme.sh
24.当前目录下有一个文件为 showme.sh,如何修改其所有人为 root:
Chown root showme.sh
chown root chowme.sh
chown :root chowme.sh
chown root:root chowme.sh
25.请简述 SESSION 与 COOKIE 的区别?
区别:
1,SESSION:存储在服务器端, cookie:存储在客户端
2,两者都可通过时间来设置时间长短
3,cookie 不安全,考虑安全性还是用 session
4,session 保存到服务器端,如果访问量过大,对服务器性能很影响,应使用 memcache 缓存session
5,单个 COOKIE 在客户端限制是 3K,即存放的 cookie 不能超过 3K,SESSION 没有限制
#linux 下一般放置 session 在/tmp/session-*
26.什么是数据库索引,主键索引,唯一索引的区别,索引的缺点是什么?
数据库索引就是给数据库中的每张表建立索引,便于检索提高 select 效率
主键索引是给每张表的主键设置索引
唯一索引是给每张表的唯一值字段设置索引;
索引的缺点是建立索引需要增加存储空间,空间利用率低,并且当数据发生变化时改变索引资源消耗较大。
27.服务器在运行的过程中,随着用户访问数量的增长,如何通过优化,保证性能?如果
数据库已经达到最优化,请设计出继续升级的解决方案
squid->lvs|集群->shpinx|memcache->php 静态化(缓存)->分区|主从|一主多从(读写分离)
首先可以通过
分库分表缓解一些负担,
应用缓存服务器,如 MemCache 服务器,
增加主从服务器和负载均衡服务器提高网站读取速度,
添加静态资源服务器,存放一些静态资源,如 CSS,Js,图片等,
提高检索速度可以架设内容检索服务器如 Shpinx,Xapian,
消息队列服务器,架设数据库集群,
也可以考虑 NoSQL,如谷歌的 BigTable,DB 连接池,使数据库读写分离
28.用 PHP 打印出前一天的时间格式是 2006-5-10 22:21:21
答:echo date(‘Y-n-d H:i:s’, strtotime(’-1 day’));
29.对于大流量的网站,您采用什么样的方法来解决访问量问题?
答:确认服务器硬件是否足够支持当前的流量,数据库读写分离,优化数据表,
程序功能规则,禁止外部的盗链,控制大文件的下载,使用不同主机分流主要流量
30.语句 include 和 require 的区别是什么?为避免多次包含同一文件,可用(?)语句代替它们?
答:require->require 是无条件包含也就是如果一个流程里加入 require,无论条件成立与否都会先执行 require
include->include 有返回值,而 require 没有(可能因为如此 require 的速度比 include快)
注意:包含文件不存在或者语法错误的时候 require 是致命的,include 不是
31.在 PHP 中,heredoc 是一种特殊的字符串,它的结束标志必须?(1 分)
答:heredoc 的语法是用"<<<"加上自己定义成对的标签,在标签范围內的文字视为一个字符串
例子:
$str = <<<SHOW
my name is Jiang Qihui!
SHOW;
32.创建数据表
答:CREATE TABLE ‘message’(
‘id’ int(10) NOT NULL auto_increment,
‘title’ varchar(200) default NULL,
‘content’ text,
‘category_id’ int(10) NOT NULL,
‘hits’ int(20),
PRIMARY KEY(‘id’);
  )ENGINE=InnoDB DEFAULT CHARSET=utf8;
33.PHP 的意思,它能干些什么?
超文本预处理语言,服务端脚本语言
34.对于大流量的网站,您采用什么样的方法来解决访问量问题?
确认服务器硬件是否可以负载这个访问量
对外设置防盗链
采用 jQuery 延迟加载(淘宝就使用的这个)
生成静态 HTML 页面,设置 memcache 缓存
划分区域设置不同的主机应答
使用流量分析统计软件
禁止大文件下载
优化数据库的访问,采用读写分离,可以考虑主从架构,分库分表
分布式服务器设置,负载均衡
35.写出 session 的运行机制,session 与 cookie 的区别。多台 WEB 服务器如何共享session。
session 和 cookie 的最大区别在于 session 是保存在服务端的内存里面,而 cookie 保存
于浏览器或客户端文件里面;session 是基于访问的进程,记录了一个访问的开始到结束,
当浏览器或进程关闭之后,session 也就“消失”了,而 cookie 更多地被用于标识用户,
它可以是长久的,用于用户跟踪和识别唯一用户(Unique Visitor)
多台 WEB 服务器如何共享 session 的方式?
1.保存在数据库中,这种方式的扩展性很强,可以随意增加 WEB 而不受影响
2.可以将 session 数据保存在 memcached 中,memcached 是基于内存存储数据的,性能很高,用户并发量很大的时候尤其合适,参考 PHP 实现多服务器 session 共享之memcache 共享
36.1.Include 与 require的区别,require和require_once的效率哪个高?
1)require只会解析一次,include遇到多少次就解析多少次。所以require的速度比include快
2)require出现语法错误,php终止执行并提示错误。include文件出现错误发出警告,不影响程序的执行

Require的效率比require_once的效率更高,因为require_once在包含文件时要进行判断文件是否已经被包含。

37.R E Q U E S T 、 _REQUEST、R​EQUEST、_POST、G E T 、 _GET、G​ET、_COOKIE、S E S S I O N 、 _SESSION、S​ESSION、_FILE的意思是什么?
它们都是PHP预定义变量。
$_REQUEST用来获取post或get方式提交的值
$_POST用来获取post方式提交的值
$_GET用来获取get方式提交的值
$_COOKIE用来获取cookie存储的值
$_SESSION用来获取session存储的值
$_FILE用来获取上传文件表单的值
38.分表分库
1、分库分表的方法
一般就是垂直切分和水平切分,这是一种结果集描述的切分方式,是物理空间上的切分
2、阐述:
首先是用户请求量太大,我们就堆机器搞定(这不是本文重点)
然后是单个库太大,这时我们要看是因为表多而导致数据多,还是因为单张表里面的数据多。
如果是因为表多而数据多,使用垂直切分,根据业务切分成不同的库。
如果是因为单张表的数据量太大,这时要用水平切分,即把表的数据按某种规则切分成多张表,甚至多个库上的多张表。
分库分表的顺序应该是先垂直分,后水平分。因为垂直分更简单,更符合我们处理现实世界问题的方式。
3、分表,能够解决单表数据量过大带来的查询效率下降的问题;
4、分库,面对高并发的读写访问,当数据库master服务器无法承载写操作压力时,不管如何扩展slave服务器,此时都没有意义。此时,则需要通过数据分库策略,提高数据库并发访问能力。
5、优点,分库、分表技术优化了数据存储方式,有效减小数据库服务器的负担、缩短查询响应时间。
6、数据分库、分表存储场景条件
关系型数据库
主从架构(master-slave)
单表数据量在百万、千万级别
数据库面临极高的并发访问
7、分库、分表实现策略
关键字取模,实现对数据访问进行路由
更多查看:更多查看
更多查看:更多查看
39.设计模式
设计模式:设计模式
40.数据库千万级别的数据操作和表设计
查看更多:查看更多
41.PHP面试MySQL数据库的索引
索引的特点如下:①可以提高数据库的检索速度;②降低了数据库插入、修改、删除等维护任务的速度;③可以直接或间接创建;④只能创建在表上,不能创建在视图上;⑤使用查询处理器执行SQL语句时,一个表上,一次只能使用一个索引;⑥可以在优化隐藏中使用索引。
索引的分类:
直接创建索引和间接创建索引
普通索引和唯一性索引
单个索引和复合索引
聚簇索引和非聚簇索引(聚集索引,群集索引)
索引的数据结构
b+树

查看更多:[查看更多](https://zhuanlan.zhihu.com/p/58178099)
  1. php面试题之memcache和redis的区别
    区别:
    1、存储方式不同
    memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小;redis有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化(笔者注:有快照和AOF日志两种持久化方式,在实际应用的时候,要特别注意配置文件快照参数,要不就很有可能服务器频繁满载做dump)。
    2、数据支持类型不同
    redis在数据支持上要比memecache多的多。
    3、memcache更加快速,在读取性能上比 Redis 快,缺点是仅支持字符串。
    4、Redis支持丰富的数据结构类型,字符串,散列(哈希),集合,有序集合,还支持订阅发布,地理位置等等。
    5、持久性
    redis支持数据落地持久化存储
    memcache不支持数据持久存储
    6、分布式存储
    redis支持master-slave复制模式
    memcache可以使用一致性hash做分布式

查看更多:查看更多
查看更多:查看更多
查看更多:查看更多
43.Redis常见七种使用场景(PHP实战)
查看更多:查看更多
查看更多:查看更多
44.什么是构造函数和析构函数
构造函数:而从PHP5开始,开发者可以定义一个名为__construct的方法作为构造函数。构造函数的作用就是当类被实例化的时候会被自动调用,因此构造函数主要用于做一些初始化的工作。
function __construct() {
print “Base constructor\n”;
}

析构函数:析构函数是在PHP5引入的,它的作用与调用时机和构造函数刚好相反,它在对象被销毁时自动执行。析构函数__destruct()结构形式如下:
function __destruct(){
/* 类的初始化代码*/
}
查看更多:查看更多
45.apache和nginx的区别,以及为什么现在大都选用nginx
nginx主要是是应对高并发,他读取静态页面更好,大部分的php网站到最后都会做静态化,所以nginx就成了首选。
nginx可以做反向代理,这点对于请求数量很多的网站很有用。毕竟负载均衡能解决很多问题。
nginx占用资源少,高并发下也不会占用太多资源。因为nginx是异步非阻塞,apache是阻塞模型。

查看更多:查看更多
46.常用的10个数组方法
in_array(判断数组中是否有某个元素)
implode(将数组按照一定规律分解)
json_encode(将数组转化成json)
sort(排序,有很多排序的函数这里就说一个)
array_push(将一个活多个单元压入数组的末尾)
array_merge(合并数组)
array_key_exists(检查键名是否存在于数组中)
array_unique(去除数组中重复的值,只能对一位数组起作用)
array_shift(移除数组中第一个单元)
47.常用的操作字符串的方法
substr(截取字符串)
strlen(获取字符串长度)
strpos(查找字符串首次出现的位置)
str_replace(字符串替换)
explode(将字符串按照规律转化成数组)
strtoupper(将所有字母变成大写)
strtolower
ucfirst(将字符串的首字母变成大写)
ucwords(将字符串中每个单词的首字母变成大写)
strrev(反转字符串,其实不是很常用)
substr_replace(替换字符串的子串,注意与str_replace的区别)
strip_tags(去除html和php标记,可以选择保留想要的标签)
trim(去除空格)
explode(分割成数组)
48.MySQL数据库的常用存储引擎以及它们的区别?
MyISAM:不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,支持全文索引。
InnoDB:支持事务,行锁,有崩溃恢复能力。读写速度比MyISAM慢,5.6之后支持全文索引。
存储引擎是基于表的,而不是数据库
49.PHP的基本变量类型
四种标量类型:boolean (布尔型)、integer (整型)、float (浮点型, 也称作 double)、string (字符串)
两种复合类型:array (数组)、object (对象)
最后是两种特殊类型:resource(资源)、NULL(NULL)
50.说一下单引号双引号
单引号内部的变量不会执行, 双引号会执行
单引号解析速度比双引号快。
单引号只能解析部分特殊字符,双引号可以解析所有特殊字符。
51.MySQL主从备份的原理?
mysql支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。
52.有 1~5000 一组乱序数列,请使用伪代码对该数进行排列
冒泡排序法:

<?php $arr = Array(23,34,12,56,43,98,89); for($i=1;$i 53.公鸡 3 元每只,母鸡 5 元每只,小鸡 1 元 3 只,一百元钱买一百只鸡,请用伪代码写出求公鸡,母鸡和小鸡的数目 for(y = 0 ; y=0;y=0;y<=20;KaTeX parse error: Expected '}', got 'EOF' at end of input: y++){ for(x=0;x < = ( 100 / 3 ) ; x<=(100/3);x<=(100/3);x++){ for(z = 0 ; z=0;z=0;z<=100;KaTeX parse error: Expected '}', got 'EOF' at end of input: z++){ if(x+y + y+y+z==100 && ((x ∗ 3 ) + ( x*3)+(x∗3)+(y*5)+($z/3))==100){ echo x . " : " . x.":".x.":".y.":".$z." "; } } } } 54.1,1,2,3,5,8,13,21,34.。。。 求第 30 位的数是多少,请用伪代码描述其实现方法 <?php $f1=1; f 2 = 1 ; f o r ( f2=1; for(f2=1;for(i=3;i < = 30 ; i<=30;i<=30;i++){ f 3 = f3=f3=f1+$f2; f 1 = f1=f1=f2; f 2 = f2=f2=f3; } echo KaTeX parse error: Expected 'EOF', got '&' at position 73: …st.php.html?a=3&̲b=4” Function …url){ i n f o = p a r s e u r l ( info=parse_url(info=parseu​rl(url); Return end(explode(’.’,KaTeX parse error: Expected 'EOF', got '}' at position 18: …fo['path'])); }̲ 56.快速排序, fun…array) { if (count($array) <= 1) return $array; $key = $array[0]; $left_arr = array(); r i g h t a r r = a r r a y ( ) ; f o r ( right_arr = array(); for (righta​rr=array();for(i=1; i < c o u n t ( i<count(i<count(array); KaTeX parse error: Expected '}', got 'EOF' at end of input: …{ if (array[$i] <= $key) $left_arr[] = a r r a y [ array[array[i]; else $right_arr[] = a r r a y [ array[array[i]; } l e f t a r r = q u i c k s o r t ( left_arr = quick_sort(lefta​rr=quicks​ort(left_arr); r i g h t a r r = q u i c k s o r t ( right_arr = quick_sort(righta​rr=quicks​ort(right_arr); return array_merge(l e f t a r r , a r r a y ( left_arr, array(lefta​rr,array(key), $right_arr); } 主从服务器的搭建:[主从服务器的搭建](http://www.aipanshi.com/blog/lanmp/linux-mysql-replication-master-slave.html) 推荐:[推荐](https://www.cnblogs.com/Renyi-Fan/p/11005130.html) 推荐:[推荐](http://www.aipanshi.com/blog/php/php2-1-variable.html)

相关文章