1.PHP的冒泡排序
<?php
//定一个数组
$arr = [10,1,5,4,7,9,3,6];
//控制轮次数
for($i = 0; $i < count($arr); $i++)
{
//控制次数
for($j = $i + 1; $j < count($arr); $j++)
{
//如果当前值大于后面的值
if($arr[$i] > $arr[$j])
{
//位置交换
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
}
}
}
//输出
echo '<pre>';
print_r($arr);
echo '<pre/>';
?>
2. SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?
1、http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。
2、SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。
禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的。
3.请写出数据类型(int char varchar datetime text)的意思;请问 varchar 和 char有什么区别?
Int 整数 char 定长字符 Varchar 变长字符 Datetime 日期时间型 Text 文本型 Varchar 与char的区别 char是固定长度的字符类型,分配多少空间,就占用多长空间。 Varchar是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间。 由于varchar类型是可变的,所以在数据长度改变的时,服务器要进行额外的操作,所以效率比char类型低。
4. isset() 和 empty() 区别
Isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假,empty判断变量是否为空为假,只可传一个变量,如果为空为假则返回真。
5.请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。
6.PHP常用的字符操作函数
trim()
函数可以去除字符串的开始位置和结束位置的空格,并将结果字符串返回,默认情况下去除的字符是换行符和回车符(\n和\r),水平和垂直制表符(\t和X0B)
ltrim()
函数只从字符的开始处(左边)去除空格
rtrim()
函数只从函数的结束处(右边)去除空格
strtoupper
将字符串转为大写
strtolower
将字符串转为小写
ucfirst
如果字符串第一个字符是字母,将其转为大写
ucwords
将字符串的每个单词的首字母大写
strcmp()
比较两个字符串,如果相等,函数返回0
strlen()
函数测试字符串的长度
strpos($str,search,[int])
查找search在$str中的第一次位置从int开
stripos($str,search,[int])
函数返回字符串在另一个字符串中第一次出现的位置。该函数对大小写不敏感
strrpos($str,search,[int])
查找search在$str中的最后一次出现的位置从int
submit($str,int start[,int length])
从$str中strat位置开始提取[length长度的字符串]。
strstr($str1,$str2)
从$str1(第一个的位置)搜索$str2并从它开始截取到结束字符串;若没有则返回FALSE.
7.PHP 常用的数组操作函数
一、变量与数组的转换
compact()
将变量以变量名的方式组装成数组
<?php
$bianliang1 = '赵';
$bianliang2 = '锐';
$arr = compact('bianliang1','bianliang2');
//返回的结果为
['bianliang1'=>'赵','bianliang2'=>'锐'];
//应用场景1
在TP、Laravel中将查询出来的数据向末班引擎中添加的时候会用到..
extract()
将数组解析成变量/ 和compact是反转的
<?php
$arr = ['bianliang1'=>'赵','bianliang2'=>'锐'];
extract($arr);
//使用-输出bianliang1(相当于你声明了一次变量,有点向ES6解构赋值的意思)
echo $bianliang1;
二、变量和字符串的转换
<?php
$str = '热爱,喜欢,兴奋';
$arr = explode(',',$str);//表示以字符串中的逗号分隔成数组
//结果为
['热爱','喜欢','兴奋'];
如果解析的字符串是个空字符串,结果是一个数组有一个索引为0的值,值为空;并不是个空数组;
<?php
$arr = ['热爱','喜欢','兴奋'];
//将数组解析成字符串
$str = implode(',',$arr);
//得到的结果为
'热爱,喜欢,兴奋'
三、数组和数组之间关系
array_merge()
并集关系
<?php
$arr1 = ['赵','上','的'];
$arr2 = ['张','赵'];
//将2个数组合并
$arr_mer = array_merge($arr1,$arr2);
//结果为
['赵','上','的','张','赵']
array_diff()
差集关系
<?php
$arr1 = ['赵','上','的'];
$arr2 = ['张','赵'];
//获取第一个数组在第二个数组中的差集部分,就是没有的部分
$arr_dif = array_diff($arr1,$arr2);
//结果为
['上','的']
array_intersect()
交集关系
$arr1 = ['赵','上','的'];
$arr2 = ['张','赵'];
//获取2个数组相交集的部分数组
$arr_inter = array_intersect($arr1,$arr2);
//结果为
['赵']
四、数组值的操作
array_pop()
删除数组最后一个值
<?php
$arr = ['赵','上','的'];
array_pop($arr);//删除数组最后一个值
//结果为
['赵','上']
array_push()
向数组中追加一个值
<?php
$arr = ['赵','上','的'];
array_push($arr,'王');//支持多个参数,比如第三个参数 仍然会被追加到数组中去
//得到结果为: (array_push不需要接收,直接引用操作原数组)
echo $arr;
['赵','上','的','王'];
五、判断值是否存在数组中
array_in()
判断值是否存在数组中
<?php
$arr = ['name'=>'赵锐庆','age'=>18,'class'=>'大班'];
$bol = in_array('赵锐庆',$arr);//如果存在返回true 否则返回false
//得到结果为true
array_key_exists()
判断键是否存在数组中
<?php
$arr = ['name'=>'赵锐庆','age'=>18,'class'=>'大班'];
$bol = array_key_exists('name',$arr);//如果值存在返回true,否则返回false
//得到结果为true
六、数组去重
array_unique()
数组去从
<?php
$arr = ['赵','赵','锐'];
$arr_uni = array_unique($arr);//数组去重
//得到的结果为
['赵','锐']
七、获取二维数组中值的集合
array_column()
获取二维数组中值的集合
$arr = [
['name'=>'赵锐庆','id'=>'one','school'=>'南理工'],
['name'=>'孙悟空','id'=>'two','school'=>'南理工'],
['name'=>'刘德华','id'=>'three','school'=>'南理工'],
['name'=>'朱德','id'=>'four','school'=>'南理工'],
];
//提取name为键的值构成一维数组
$arr_colu = array_column($arr,'name');
//得到结果
['赵锐庆','孙悟空','刘德华','朱德']
//提取那么为键的值切提取对应数组红的id值作为键构成一维键值数组
$arr_colu = array_column($arr,'name','id');
['one'=>'赵锐庆','two'=>'孙悟空','three'=>'刘德华','four'=>'朱德']
八、提取数组的键与值
array_values()
获取数组的键
<?php
$arr = ['name'=>'赵锐庆','id'=>'one','school'=>'南理工'];
$arr_val = array_values($arr);//提取数组中的值
//得到的结果为
['赵锐庆','one','南理工'];
array_keys()
获取数组的值
<?php
$arr = ['name'=>'赵锐庆','id'=>'one','school'=>'南理工'];
$arr_key = array_keys($arr);//提取数组中键的集合
//得到结果为
['name','id','school'];
九、返回数组中值的和
array_count()
返回数组中值的和
$arr = ['name'=>'赵锐庆','id'=>'one','school'=>'南理工'];
$number = count($arr);
//返回的结果
3
十、返回数组随机的键
array_rand()
返回数组随机的键
$arr = ['name'=>'赵锐庆','id'=>'one','school'=>'南理工'];
$number = array_rand($arr);
//返回的结果
'id'
十一、搜索值是否存在数组中
array_search()
搜索值是否存在数组中
<?php
$arr = ['name'=>'赵锐庆','id'=>'one','school'=>'南理工'];
$is = array_search('赵锐庆'=>$arr);
//返回的结果
'name'
十二、多维数组进行排序
/*
上面讲的数组排序都是指的一个整体数组,索引数组升序降序等等或者关联数组根据键值对的升序或者排序;
而这里将的排序是一个数组收到其他数组的影响进行排序;其实这种方式就如同对数据库的数据进行升降排序的道理是一致的;
*/
$guys = array(
array('name'=>'jake', 'score'=>80, 'grade' =>'A'),
array('name'=>'jina', 'score'=>70, 'grade'=>'A'),
array('name'=>'john', 'score'=>30, 'grade' =>'A'),
array('name'=>'sss', 'score'=>70, 'grade'=>'C'),
array('name'=>'ben', 'score'=>20, 'grade'=>'B')
);
//如上有一个数组,要求根据score字段升序,相同的情况下根据name字段排序;
$score = array_column($guys,”score”);
$score = array_column($guys,”name”);
Array_multisort($score,SORT_ASC,$name,SORT_DESC,$guys );
8.php读取文件内容的几种方法和函数?
打开文件,然后读取。Fopen() fread()
打开读取一次完成 file_get_contents()
9.简述Cookie的设置及获取过程
设置COOKIE的值:
Setcookie(名称,值,保存时间,有效域);
获取值:$_COOKIE['名称'];
10.面向对象中接口和抽象类的区别及应用场景?
- 有抽象方法的类叫做抽象类,抽象类中不一定只有抽象方法,抽象方法必须使用abstract关键字定义。
- 接口中全部是抽象方法,方法不用使用abstract定义。
- 当多个同类的类要设计一个上层,通常设计为抽象类,当多个异构的类要设计一个上层,通常设计为接口。
11.对于大流量的网站,您采用什么样的方法来解决访问量问题?
优化程序,优化数据库,如果程序和数据库已经最优化,使用以下解决方法:
- 确定当前服务器设备是否满足流量需求。
- 使用Memcache缓存技术,把动态内容缓存到文件中,动态网页直接调用这些文件,而不必再访问数据库。
- 禁止外部盗链,图片和文件外部盗链会给服务器带来大量的负载压力,可以通过refer来禁止外部盗链,或者使用apache来配置禁止盗链。
- 控制大文件的下载,大文件的下载对于非SCSI硬盘来说会占用大量的资源,导致服务器的响应能力下降。
- 使用不同的主机分流主要流量,使服务器均衡负载。
- 使用流量统计软件统计分析网站流量,可以知道哪些地方耗费了大量的流量,哪些页面需要再进行优化。
12.用PHP写出显示客户端IP与服务器IP的代码
获取客户端IP:$_SERVER(“REMOTE_ADDR”)
;
获取服务器端IP:$_SERVER["SERVER_ADDR"]
;
13.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
<?php
function my_scandir($dir){
$files = array();
if ( $handle = opendir($dir) ){
while ( ($file = readdir($handle)) !== false ) {
if ( $file != ".." && $file != "." ) {
if ( is_dir($dir . "/" . $file) ) {
$files[$file] = scandir($dir . "/" . $file);
}else {
$files[] = $file;
}
}
}
closedir($handle);
return $files;
}
}
14.数据库索引有几类,分别是什么?什么时候该用索引?
普通索引
、主键索引
、唯一索引
并非所有的数据库都以相同的方式使用索引,作为通用规则,只有当经常查询列中的数据时才需要在表上创建索引。
15.写几个魔术方法并说明作用?
__call()当调用不存在的方法时会自动调用的方法
__autoload()在实例化一个尚未被定义的类是会自动调用次方法来加载类文件
__set()当给未定义的变量赋值时会自动调用的方法
__get()当获取未定义变量的值时会自动调用的方法
__construct()构造方法,实例化类时自动调用的方法
__destroy()销毁对象时自动调用的方法
__unset()当对一个未定义变量调用unset()时自动调用的方法
__isset()当对一个未定义变量调用isset()方法时自动调用的方法
__clone()克隆一个对象
__tostring()当输出一个对象时自动调用的方法
16.++i 和 i++哪一个效率高,为什么?
++i效率比i++的效率更高,因为++i少了一个返回i的过程。
17.magic_quotes_gpc()、magic_quotes_runtime()的意思是什么?
Magic_quotes_gpc()是php配置文件中的,如果设置为on则会自动POST,GET,COOKIE中的字符串进行转义,在‘之前加\
Magic_quotes_runtime()是php中的函数,如果参数为true则会数据库中取出来的单引号、双引号、反斜线自动加上反斜杠进行转义。
18. 框架中什么是单一入口和多入口,单一入口的优缺点?
- 多入口就是通过访问不同的文件来完成用户请求。
单一入口指web程序所有的请求都指向一个脚本文件的。
- 单一入口更容易控制权限,方便对http请求可以进行安全性检查。
缺点:URL看起来不那么美观,特别是对搜索引擎来说不友好。
19. 对关系型数据库而言,索引是相当重要的概念,请回答有关索引几个问题:
索引的目的是什么?
- 快速访问数据表中的特定信息,提高检索速度
- 创建唯一性索引,保证数据库表中每一行数据的唯一性
- 加速表和表之间的连接
- 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
索引对数据库系统的负面影响是什么?
负面影响:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。
为数据表建立索引的原则有哪些?
在最频繁使用的、用以缩小查询范围的字段上建立索引
在平频繁使用的、需要排序的字段上建立索引
什么情况下不宜建立索引?
- 对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引
- 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text),值范围较少的知道等。
20.web应用中,数据库的读取频率远高于写入频率, 如何优化MySQL而应对此种情景?
使用memcache缓存技术,将动态数据缓存到文件,访问动态页面时直接调用缓存文件,而不必重新访问数据库,这样就减少了查询数据库的次数。
如果网站的访问量很大,可以把数据库读写服务器分开,使用多台服务器去处理数据库查询,使用较少的服务器去处理数据库的写入和修改。
21. include与require的区别?
1.include()
在执行文件时每次都要进行读取和评估
require()
文件只处理一次(实际上文件内容替换了require()语句)
2.require()
通常放在PHP脚本程序的最前面
include()
的使用和require()
一样,一般放在流程控制的处理区段中,PHP脚本文件读到include()
语句时,才将它包含的文件读进来,这种方式,可以把程序执行时的流程简单化
3,require()
和include()
语句是语言结构,不是真正的函数,可以像PHP的其他语言结构一样
4,include_once()
和require_once()
语句也是在脚本执行期间包括并运行指定文件,与include()
require()
唯一的区别是如果文件中的代码已经被包括了,则不会再次包括.
5,require()
包含文件失败,停止执行,给出错误(致命的)
include()
常用于动态包含.
通常是自动加载的文件,即使加载出错,整个程序还是继续执行
一个页面声明,另一个页面调用
包函文件失败,继续向下执行,返回一条警告
22. PHP字符串中单引号与双引号的区别?
单引号不能解释变量,而双引号可以解释变量。
单引号不能转义字符,在双引号中可以转义字符。
23.了解XSS攻击吗? 如何防止 ?
- XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,然后利用不安全的Activex控件执行恶意的行为。
- 使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。
SQL注入漏洞产生的原因 ? 如何防止?
SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。
24. 防止SQL注入:
- 开启配置文件中的magic_quotes_gpc和magic_quotes_runtime设置
- 执行sql语句时使用addslashes进行sql语句转换
- Sql语句书写尽量不要省略小引号和单引号
- 过滤掉sql语句中的一些关键字:update、insert、delete、select、*
- 提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。
- Php配置文件中设置register_globals为off,关闭全局变量注册
- 控制错误信息,不要再浏览器上输出错误信息,将错误信息写到日志文件中。
25.、如何处理负载,高并发?
- HTML静态化
效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。 - 图片服务器分离
把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛等 - 数据库集群和库表散列及缓存
数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。 - 镜像:
尽量减少下载,可以把不同的请求分发到多个镜像端。 - 负载均衡:
Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。
26.PHP的基本变量类型
四种标量类型:boolean
(布尔型)、integer
(整型)、float
(浮点型, 也称作 double)、string
(字符串)
两种复合类型:array
(数组)、object
(对象)
最后是两种特殊类型:resource
(资源)、NULL
(NULL
26. 什么是面向对象?主要特征是什么?
面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。
封装
:封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别,将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。
继承
:继承是面向对象的基本特征之一,继承机制允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
多态
:多态同一个行为具有多个不同表现形式或形态的能力。是指一个类实例(对象)的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。