您现于de位置乃:亚博 > APP基础

亚博 2019-07-14 APP基础 265

APP面试时常常被问到de技术问题

1.get,postde区别

**显示有区别 **
get方法乃将字符串拼接于地址栏后面可以看见 
而post方法看不见
 
**传递de大小有区别 **
具体大小和浏览器有关系 ie浏览器乃2k其他浏览器de好的值可能不同 但乃也比较小. 
而post方法传递参数de大小乃可以设定de 原来乃认为无限大.于Php当中于app.ini文件乃可以设置参数de大小de.
 
**安全性 **
get方法安全性比较低因为暴露于外面而post方法安全性比较高
 
**提交de原理 **
get方法提交de数据都乃独立de. 
而Post方法将所有de提交de数据变成1个整体(将提交de数据变成xml格式)
 
**灵活性**
get方法很灵活  
post方法不灵活 必须要有表单de参与才能用post提交很不方便

2.require include区别

require乃无条件包含也就乃如果1个流程里加入require,无论条件成立与否都会先执行require
include有返回值 而require没有(可能因为如此requirede速度比include快)
包含文件不存于或者语法错误de时候require乃致命de错误终止执行,include不乃

3.获取URL后缀名

pathinfo()解析文件路径 返回其组成部分;
返回关联数组
dirname    文件路径
basename   文件名+扩展名
extension   最后1个扩展名
filename   文件名
eg: print_r( pathinfo('/ab/cd/e.app') );
Array(
  [dirname] => /ab/cd
  [basename] => e.app
  [extension] => app
  [filename] => e
)
扩展:
打印解析路径    var_dump( pathinfo($path) );
打印路径de父级路径    var_dump( pathinfo($path, PATHINFO_DIRNAME) );
打印路径de尾名    var_dump( pathinfo($path, PATHINFO_BASENAME) );
打印路径de最后de扩展名   var_dump( pathinfo($path, PATHINFO_EXTENSION) );
打印路径de文件de名字   var_dump( pathinfo($path, PATHINFO_FILENAME) );

4.tcp,udp,http区别

参考链接:https://blog.csdn.net/qq_31332467/article/details/79217262

5.获取上级目录de方法

echo __FILE__ ; // 获取当8谖募㩳e绝秏onth肪都暗刂 结果:D:\aaa\my.app 
echo dirname(__FILE__); // 取得当前文件所于de好的目录 结果:D:\aaa\ 
echo dirname(dirname(__FILE__)); //取得当前文件de上1层目录名 结果:D:\

6.数据库主从复制 读写分离

* 什么乃主从复制
主从复制 乃用来建立1个和主数据库完全1样de数据库环境 称为从数据库;
 
* 主从复制de原理:
1.数据库有个bin-log2进制文件 记录了所有desql语句.
2.只需要把主数据库debin-log文件中desql语句复制.
3.让其从数据derelay-log重做日志文件中于执行1次这些sql语句即可.
 
* 主从复制de作用
1.做数据de热备份 作为后备数据库 主数据库服务器故障后 可切换到从数据库继续工作 避免数据丢失.
2.架构de扩展.业务量越来越大 I/O访问频率过高 单机无法满足 此时做多库de存储 降低磁盘I/O访问频率 提高单机deI/O性能
3.主从复制乃读写分离de基础 使数据库能制成更大 de并发.例如子报表中 由于部署报表desql语句10分慢 导致锁表 影响前台de服务.如果前台服务使用master 报表使用slave 那么报表sql将不会造成前台所 保证了前台de访问速度.
 
* 主从复制de几种方式:
1.同步复制:所谓de同步复制 意思乃masterde变化 必须等待slave-1,slave-2,...,slave-n完成后才能返回.
2.异步复制:如同AJAX请求1样.master只需要完成自己de数据库操作即可.至于slaves乃否收到2进制日志 乃否完成操作 不用关心.MYSQLde默认设置.
3.半同步复制:master只保证slaves中de1个操作成功 就返回 其他slave不管.
这个功能 乃由google为MYSQL引入de.
 
* 关于读写分离
于完成主从复制时 由于slave乃需要同步masterde.所以对于insert/delete/update这些更新数据库de操作 应该于master中完成.而selectde查询操作 则落下到slave中.

7.数据库索引

**什么乃索引**
索引乃对数据库表中1列或多列de值进行排序de1种结构 使用索引可快速访问数据库表中de特定信息.(摘自百度百科)
 
**索引类型**
1.FULLTEXT 全文索引
    全文索引 仅MyISAM引擎支持.其可以于CREATE TABLE  ALTER TABLE  CREATE INDEX 使用 不过目前只有 CHAR VARCHAR  TEXT 列上可以创建全文索引.
2.HASH 哈希索引
    HASH索引de唯1性及类似键值对de形式10分适合作为索引 HASH索引可以1次定位 不需要像树形索引那样逐层参照 因此具有极高de效率.但乃这种高效乃有条件de.即只于"="和"in"条件下高效 对于范围查询 排序及组合索引仍然效率不高.
3.BTREE 树形索引
    BTREE所以乃1种将索引按1定算法 存入1个树形de数据结构中(2叉树) 每次查询都乃从树de入口root开始 1次遍历node 获取leaf.这乃MySQL中默认也乃最常用de索引类型.
4.RTREE
    RTREE于MySQL中很少使用 仅支持geometry数据类型 支持该存储引擎只有MyISAM BDb InnoDb NDb Archive几种.相对于BTREE RTREEde优势于于范围查找.
 
**索引种类**
普通索引:仅加速查询
唯1索引:加速查询+列值唯1(可以有null)
主键索引:加速查询+列值唯1(不可以有null)+表中只有1个
组合索引:多列值组成1个索引 专门用于组合搜索 其效率大于索引合并
全文索引:对文本内容进行分词 进行搜索
外键索引:与主键索引形成联系 保证数据de完整性.
 
**索引使用de注意事项**
1.符合索引遵循前缀原则
2.like查询%不能再前 否则索引失效.如有需要 使用全文索引
3.column is null可以使用索引
4.如果MySQL估计使用索引比全表扫描慢 则放弃使用索引
5.如果or前de条件中列有索引 后面de没有 索引不会生效.
6.列类型乃字符串 查询时 1定要给值加引号 否则索引失效.
7.确定order by 和 group by 中只有1个表de列 这样才能使用索引

8.高并发de解决方案

web服务器优化 :负载均衡 
流量优化:防盗链处理 将恶意请求屏蔽 
前端优化:减少http请求 添加异步请求 启用浏览器缓存和文件压缩 cdn加速 建立独立de图片服务器 
服务端优化:  页面静态化 并发处理 队列处理 
数据库优化: 数据库缓存 分库分表 分区操作  读写分离 负载均衡

9.MVCde理解

1 Model(业务模型):应用程序中用于处理应用程序数据逻辑de部分 通常模型对象负责于数据库中存取数据.          
2 view(视图):应用程序中处理数据显示de部分.通常视图乃依据模型数据创建de.
3 controller(控制器):应用程序中处理用户交互de部分.通常控制器负责从视图读取数据 控制用户输入 并向模型发送数据.

10.常用de文件操作函数

**1. 获得文件名:**
basename — 返回路径中de文件名部分
 
$path = "/home/cate/index/index2.app";\
$file = basename($path);\
echo $file; //结果index2.app
 
**2. 获得目录名**
dirname — 返回路径中de目录部分
 
$path = "/home/cate/index/index2.app";\
$file = dirname($path);\
echo $file;//结果/home/cate/index
 
**3.得到路径关联数组**
pathinfo() 函数以数组de形式返回关于文件路径de信息.
返回de数组块素如下:
-   [dirname]: 目录路径
-   [basename]: 文件名
-   [extension]: 文件后缀名
-   [filename]: 不包含后缀de文件名
pathinfo(path,options)
| path | 必需.规定要检查de路径. |
| options | 可选.规定要返回de数组块素.默认乃 all.
 
可能de值:
 
-   PATHINFO_DIRNAME - 只返回 dirname
-   PATHINFO_BASENAME - 只返回 basename
-   PATHINFO_EXTENSION - 只返回 extension
-   PATHINFO_FILENAME - 只返回 filename
 
 |
 **4.filesize取得文件大小**
filesize ( string $filename )
返回文件大小de字节数 如果出错返回  **FALSE** 并生成1条  **E_WARNING** 级de错误.
 
 **判断目录乃否存于**
 $lujing = "./nihao/wohao";
 if(!is_dir($liujing)){ 
     mkdir(iconv("UTF-8", "GBK", $lujing),0777,true);
 }
 
 **判断文件乃否存于**
 file_exists(path);

11.常见de排序算法

1. 冒泡排序
思路分析:于要排序de1组数中 对当前还未排好de序列 从前往后对相邻de两个数依次进行比较和调整 让较大de数往下沉 较小de往上冒.即 每当两相邻de数比较后发现它们de排序与排序要求相反时 就将它们互换.
 
代码实现:
$arr=array(1,43,54,62,21,66,32,78,36,76,39);  
function bubbleSort($arr)
{  
  $len=count($arr);
  //该层循环控制 需要冒泡de轮数
  for($i=1;$i<$len;$i++)
  { //该层循环用来控制每轮 冒出1个数 需要比较de次数
    for($k=0;$k<$len-$i;$k++)
    {
       if($arr[$k]>$arr[$k+1])
        {
            $tmp=$arr[$k+1];
            $arr[$k+1]=$arr[$k];
            $arr[$k]=$tmp;
        }
    }
  }
  return $arr;
}
 
2. 选择排序 
思路分析:于要排序de1组数中 选出最小de1个数与第1个位置de数交换.然后于剩下de数当中再找最小de与第2个位置de数交换 如此循环到倒数第2个数和最后1个数比较为止.
 
代码实现:
function selectSort($arr) {
//双重循环完成 外层控制轮数 内层控制比较次数
 $len=count($arr);
    for($i=0; $i<$len-1; $i++) {
        //先假设最小de值de位置
        $p = $i;
 
        for($j=$i+1; $j<$len; $j++) {
            //$arr[$p] 乃当前已知de最小值
            if($arr[$p] > $arr[$j]) {
            //比较 发现更小de,记录下最小值de位置;并且于下次比较时采用已知de最小值进行比较.
                $p = $j;
            }
        }
        //已经确定了当前de最小值de位置 保存到$p中.如果发现最小值de位置与当前假设de位置$i不同 则位置互换即可.
        if($p != $i) {
            $tmp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    //返回最终结果
    return $arr;
}
 
3.插入排序
思路分析:于要排序de1组数中 假设前面de数已经乃排好顺序de 现于要把第n个数插到前面de有序数中 使得这n个数也乃排好顺序de.如此反复循环 直到全部排好顺序.
 
代码实现:
function insertSort($arr) {
    $len=count($arr); 
    for($i=1, $i<$len; $i++) {
        $tmp = $arr[$i];
        //内层循环控制 比较并插入
        for($j=$i-1;$j>=0;$j--) {
            if($tmp < $arr[$j]) {
                //发现插入de块素要小 交换位置 将后边de块素与前面de块素互换
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $tmp;
            } else {
                //如果碰到不需要移动de块素 由于乃已经排序好乃数组 则前面de就不需要再次比较了.
                break;
            }
        }
    }
    return $arr;
}
 
4.快速排序  
思路分析:选择1个基准块素 通常选择第1个块素或者最后1个块素.通过1趟扫描 将待排序列分成两部分 1部分比基准块素小 1部分大于等于基准块素.此时基准块素于其排好序后de正确位置 然后再用同样de方法递归地排序划分de两部分.
 
代码实现:
function quickSort($arr) {
    //先判断乃否需要继续进行
    $length = count($arr);
    if($length <= 1) {
        return $arr;
    }
    //选择第1个块素作为基准
    $base_num = $arr[0];
    //遍历除了标尺外de所有块素 按照大小关系放入两个数组内
    //初始化两个数组
    $left_array = array();  //小于基准de
    $right_array = array();  //大于基准de
    for($i=1; $i<$length; $i++) {
        if($base_num > $arr[$i]) {
            //放入左边数组
            $left_array[] = $arr[$i];
        } else {
            //放入右边
            $right_array[] = $arr[$i];
        }
    }
    //再分别对左边和右边de数组进行相同de排序处理方式递归调用这个函数
    $left_array = quick_sort($left_array);
    $right_array = quick_sort($right_array);
    //合并
    return array_merge($left_array, array($base_num), $right_array);
}

12.接口与抽象类de区别

1. 接口
(1)对接口de使用乃通过关键字implements
(2)接口不能定义成员变量(包括类静态变量) 能定义常量
(3)子类必须实现接口定义de所有方法
(4)接口只能定义不能实现该方法
(5)接口没有构造函数
(6)接口中de方法和实现它de类默认都乃public类型de
2. 抽象类
(1)对抽象类de使用乃通过关键字extends
(2)不能被实例化 可以定义子类必须实现de方法
(3)子类必须定义父类中de所有抽象方法 这些方法de访问控制必须和父类中1样(或者更为宽松)
(4)如1个类中有1个抽象方法 则该类必须定义为抽象类
(5)抽象类可以有构造函数
(6)抽象类中de方法可以使用private,protected,public来修饰.
(7)1个类可以同时实现多个接口 但1个类只能继承于1个抽象类.
3. Final类/方法
(1)final类不能被继承
(2)final方法不能被重写
4. Static类/方法
(1)可以不实例化类而直接访问
(2)静态属性不可以由对象通过->操作符来访问,用::方式调用

13.innoDB MyISAMde区别

MyISAM:
不支持事务;
数据存储于磁盘 可被压缩 存储空间较.
只支持表级锁;
支持(FULLTEXT类型de)全文索引.
保存有表de总行数 如果select count(*) from table 会直接取出该值;
如果执行大量deSELECT MyISAM乃更好de选择;
不支持外键;
 
InnoDB:
支持事务;
存储于共享空间 需要更多de内存和存储;
具有事务 回滚和崩溃修复能力;
只支持行级锁;
不支持(FULLTEXT类型de)全文索引 但乃innodb可以使用sphinx插件支持全文索引 并且效果更好;
支持外键;
如果您de数据执行大量deINSERT或UPDATE 出于性能方面de考虑 应该使用InnoDB表.
 
**MyISAM和InnoDB两者de应用场景:**\
1) MyISAM管理非事务表.它提供高速存储和检索 以及全文搜索能力.如果应用中需要执行大量deSELECT查询 那么MyISAM乃更好de选择.\
2) InnoDB用于事务处理应用程序 具有众多特性 包括ACID事务支持.如果应用中需要执行大量deINSERT或UPDATE操作 则应该使用InnoDB 这样可以提高多用户并发操作de性能.

14.常见de设计模式

#策略模式
策略模式乃对象de行为模式 用意乃对1组算法de封装.动态de选择需要de算法并使用.
策略模式指de乃程序中涉及决策控制de1种模式.策略模式功能非常强大 因为这个设计模式本身de核心思想就乃面向对象编程de多形性思想.
策略模式de3个角色:
1.抽象策略角色
2.具体策略角色
3.环境角色(对抽象策略角色de引用)
实现步骤:
1.定义抽象角色类(定义好各个实现de共同抽象方法)
2.定义具体策略类(具体实现父类de共同方法)
3.定义环境角色类(私有化申明抽象角色变量 重载构造方法 执行抽象方法)
就于编程领域之外 有许多例子乃关于策略模式de.例如:
如果我需要于早晨从家里出发去上班 我可以有几个策略考虑:我可以乘坐地铁 乘坐公交车 走路或其它de途径.每个策略可以得到相同de结果 但乃使用了不同de资源.
 
# 工厂模式
工厂模式乃我们最常用de实例化对象模式 乃用工厂方法代替new操作de1种模式.
使用工厂模式de好处乃 如果您想要更改所实例化de类名等 则只需更改该工厂方法内容即可 不需逐1寻找代码中具体实例化de地方(new处)修改了.为系统结构提供灵活de动态扩展机制 减少了耦合.
 
# 单例模式
单例模式确保某个类只有1个实例 而且自行实例化并向整个系统提供这个实例.
单例模式乃1种常见de设计模式 于计算机系统中 线程池 缓存 日志对象 对话框 打印机 数据库操作 显卡de驱动程序常被设计成单例.
单例模式分3种:懒汉式单例 饿汉式单例 登记式单例.
单例模式有以下3个特点:
1.只能有1个实例.
2.必须自行创建这个实例.
3.必须给其他对象提供这1实例.
那么为什么要使用APP单例模式?
APP1个主要应用场合就乃应用程序与数据库打交道de场景 于1个应用中会存于大量de数据库操作 针对数据库句柄连接数据库de行为 使用单例模式可以避免大量denew操作.因为每1次new操作都会消耗系统和内存de资源.
 
# 注册模式
注册模式 解决全局共享和交换对象.已经创建好de对象 挂于到某个全局可以使用de数组上 于需要使用de时候 直接从该数组上获取即可.将对象注册到全局de树上.任何地方直接去访问.
 
# 适配器模式
将各种截然不同de函数接口封装成统1deAPI. \
APP中de数据库操作有MySQL,MySQLi,PDO3种 可以用适配器模式统1成1致 使不同de数据库操作 统1成1样deAPI.类似de场景还有cache适配器 可以将memcache,redis,file,apc等不同de缓存函数 统1成1致. \
首先定义1个接口(有几个方法 以及相应de参数).然后 有几种不同de情况 就写几个类实现该接口.将完成相似功能de函数 统1成1致de方法.

15.写出乘法表de算法

1.99乘法表 for 实现:
for($i=1;$i<10;$i++){    
    for($j=1;$j<=$i;$j++){        
    echo $i.'*'.$j.'='.$i*$j.'   ';   
    }    
    echo '<br />';
}
2.99乘法表 while 实现:
$m = 1;
while($m<10){    
    $n = 1;   
    while($n<=$m){       
    echo $m.'*'.$n.'='.$m*$n.'   ';        
    $n++;       
}       
echo '<br>';        
$m++;}

16.echo print_r print,var_dump区别

echo乃APP语句, print和print_r乃函数,语句没有返回值,函数可以有返回值(即便没有用)
print() 只能打印出简单类型变量de值(如int,string)
print_r() 可以打印出复杂类型变量de值(如数组,对象)
echo 输出1个或者多个字符串
echo:语句结构;
print:乃函数 有返回值
print_r:能打印数组 对象
var_dump:能打印对象数组 并且带数据类型

17.session和cookiede区别

session:储存用户访问de全局唯1变量,存储于服务器上deapp指定de目录中de(session_dir)de位置进行de存放
 cookie:用来存储连续訪問1个頁面时所使用 乃存储于客户端 对于Cookie来说乃存储于用户WINdeTemp目录中de.
两者都可通过时间来设置时间长短

18.用APP写出显示客户端IP与服务器IPde代码

客户端:$_SERVER["REMOTE_ADDR"]
服务器:$_SERVER["SERVER_ADDR"]

19.sql语句应该考虑哪些安全性

(1)防止sql注入 对特殊字符进行转义 过滤或者使用预编译sql语句绑定
(2)使用最小权限原则 特别乃不要使用root账户 为不同de动作或者操作建立不同de账户
(3)当sql出错时 不要把数据库出错de信息暴露到客户端

20.优化mysqi数据库de方法

(1)选取适当de字段 打字段设置为NOT NULL 于查询de时候数据库不用比较NULL;
(2)使用链接(join)代替子查询;
(3)使用联合(UNION)查询代替手动创建临时表;
(4)尽量减少使用(LIKE)关键字和通配符
(5)使用事务和外健

21.对于大流量de网站 您会采用什么方法来解决访问量?

(1)首先确认服务器硬件乃否满足支持当前de流量;
(2)优化数据库de访问;
(3)禁止外部盗链;
(4)控制大文件下载;
(5)使用不同de主机分流;
(6)使用流量分析统计;

22.isset(),empty()de区别

isset():
若变量不存于则返回 FALSE 
若变量存于且其值为NULL 也返回 FALSE 
若变量存于且值不为NULL 则返回 TURE 
同时检查多个变量时 每个单项都符合上1条要求时才返回 TRUE 否则结果为 FALSE 
 
empty():
若变量不存于则返回 TRUE
若变量存于且其值为"" 0 "0" NULL  FALSE array() var $var; 以及没有任何属性de对象 则返回 TURE\
若变量存于且值不为"" 0 "0" NULL  FALSE array() var $var; 以及没有任何属性de对象 则返回 FALSE

23.6大设计原则(接14点设计模式)

1.单1职责原则:1个类只负责1个职责.
2.开闭原则:1个软件实体比如类-模块-函数 应该对扩展开放 对修改关闭.
3.里氏替换原则:所有引用基类de地方必须透明地使用其子类de对象 子类必须完全实现父类de方法 可以拓展自己de方法和属性 即子类可以扩展父类de功能 但乃不能改变父类de原有功能.
4.迪米特法则:1个对象应该对其他对象保持最少de了解.
5.接口隔离原则:类间de依赖应该建立于最小de接口上.
6.依赖倒置原则:高层模块不应该依赖底层模块 2者应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象;

24.group by 与distinctde区别

25.开发中应该注意哪些安全机制

1.APP配置
2.Sql注入 
3.Xss攻击(cross site script 跨站脚本) 
4.盗链 
5.CSRF(跨站请求伪造cross site request forgery) 
6.CC(乃利用不断对网站发送连接请求致使形成拒绝服务de目de)

26.memcache和Redisde区别

数据结构:memcache仅支持简单dekey-value形式 Redis支持de数据更多(string字符串 set集合 list列表 hash散列 zset有序集合);
多线程:memcache支持多线程 Redis支持单线程
持久化:Redis支持持久化 memcache不支持持久化
分布式:Redis做主从结构 memcache服务器需要通过hash1致化来支撑主从结构
 
1.  Redis中 并不乃所有de数据都1直存储于内存中de 这乃和Memcache相比1个好的de区别.
2.  Redis于很多方面具备数据库de特征 或者说就乃1个数据库系统 而Memcache只乃简单deK/V缓存.
3.  他们de扩展都需要做集群;实现方式:master-slave Hash.
4.  于100k以上de数据中 Memcache性能要高于Redis.
5.  如果要薲e诖媸褂眯 使用简单dekey-value存储de话 Memcachedde内存利用率更高 而如果Redis采用hash结构来做key-value存储 由于其组合式de压缩 其内存利用率会高于Memcache.当然 这和您de应用场景和数据特性有关.
6.  如果您对数据持久化和数据同步有所要求 那么推荐您选择Redis 因为这两个特性Memcache都不具备.即使您只乃希望于升级或者重启系统后缓存数据不会丢失 选择Redis也乃明智de.
7.  Redis和Memcache于写入性能上面差别不大 读取性能上面尤其乃批量读取性能上面Memcache更强

27.常用de数组函数

数组de键名和值:
array_values($arr);  获得数组de值
array_keys($arr);  获得数组de键名
array_flip($arr);  数组中de值与键名互换(如果有重复前面de会被后面de覆盖)
in_array("apple",$arr);  于数组中检索apple
array_search("apple",$arr);  于数组中检索apple  如果存于返回键名
array_key_exists("apple",$arr);  检索给定de键名乃否存于数组中
isset($arr[apple]):   检索给定de键名乃否存于数组中
 
数组de内部指针:
current($arr);  返回数组中de当前单块\
pos($arr);  返回数组中de当前单块\
key($arr);  返回数组中当前单块de键名\
prev($arr);  将数组中de内部指针倒回1位\
next($arr);  将数组中de内部指针向前移动1位\
end($arr);  将数组中de内部指针指向最后1个单块\
reset($arr;  将数组中de内部指针指向第1个单块\
each($arr);  将返回数组当前块素de1个键名/值de构造数组 并使数组指针向前移动1位\
list($key,$value)=each($arr);  获得数组当前块素de键名和值
 
数组de排序:
1.通过块素值对数组排序:
sort($arr);  由小到大de顺序排序(第2个参数为按什么方式排序)忽略键名de数组排序\
rsort($arr);  由大到小de顺序排序(第2个参数为按什么方式排序)忽略键名de数组排序\
usort($arr,"function");  使用用户自定义de比较函数对数组中de值进行排序(function中有两个参数 0表示相等 正数表示第1个大于第2个 负数表示第1个小于第2个)忽略键名de数组排序\
asort($arr);  由小到大de顺序排序(第2个参数为按什么方式排序)保留键名de数组排序\
arsort($arr);  由大到小de顺序排序(第2个参数为按什么方式排序)保留键名de数组排序\
uasort($arr,"function");  使用用户自定义de比较函数对数组中de值进行排序(function中有两个参数 0表示相等 正数表示第1个大于第2个 负数表示第1个小于第2个)保留键名de数组排序
 
2.通过键名对数组排序
ksort($arr);  按照键名正序排序\
krsort($arr);  按照键名逆序排序\
uksort($arr,"function");  使用用户自定义de比较函数对数组中de键名进行排序(function中有两个参数 0表示相等 正数表示第1个大于第2个 负数表示第1个小于第2个)
 
数组de合并:
array_merge($arr1,$arr2);  合并两个或多个数组(相同de字符串键名 后面de覆盖前面de 相同de数字键名 后面de不会做覆盖操作 而乃附加到后面)
array_merge_recursive($arr1,$arr2);   递归合并操作 如果数组中有相同de字符串键名 这些值将被合并到1个数组中去.如果1个值本身乃1个数组 将按照相应de键名把它合并为另1个数组.当数组 具有相同de数组键名时 后1个值将不会覆盖原来de值 而乃附加到后面
 
数组de差集
array_diff($arr1,$arr2);  返回差集结果数组\
array_diff_assoc($arr1,$arr2,$arr3);  返回差集结果数组 键名也做比较
 
数组de交集
array_intersect($arr1,$arr2);  返回交集结果数组\
array_intersect_assoc($arr1,$arr2);  返回交集结果数组 键名也做比较
 
其他:
extract($arr);用于把数组中de块素转换成变量导入到当前文件中 键名当作变量名 值作为变量值
compact(var1,var2,var3);compact() 函数创建包含变量名和它们de值de数组.
array_slice($arr,0,3);  可以将数组中de1段取出 此函数忽略键名
array_push($arr,"apple","pear");  将1个或多个块素压入数组栈de末尾(入栈) 返回入栈块素de个数\
array_pop($arr);  将数组栈de最后1个块素弹出(出栈)

28.浏览器通过URL访问de原理

1.键盘或触屏输入URL并回车确认
2.URL解析/DNS解析查找域名IP地址
3.网络连接发起HTTP请求
4.HTTP报文传输过程
5.服务器接收数据
6.服务器响应请求/MVC
7.服务器返回数据
8.客户端接收数据
9.浏览器加载/渲染页面
10.打印绘制输出

29.常见de负载均衡方案

1.基于DNSde负载均衡
2.基于4层交换技术de负载均衡
3.基于7层交换技术de负载均衡
4.4层+7层负载结合方案

30.mysql_fetch_row()和mysql_fetch_array()de区别

mysql_fetch_row() 从和结果标识 data 关联de结果集中取得1行数据并作为数组返回.每个结果de列储存于1个数组de单块中 偏移量从 0 开始.依次调用 mysql_fetch_row() 将返回结果集中de下1行 如果没有更多行则返回 FALSE.                                                     
 
mysql_fetch_array() 函数从结果集中取得1行作为关联数组 或数字数组 或2者兼有.
 
解释:
(1)如果您de表里面有字段a b c那么您用mysql_fetch_row()  就返回array(1=>ade值 2=>bde值 3=>cde值)这个时候您读数组de话 只能这样写$array[1],$array[2]才能得到ade值;
 
(2)要乃用mysql_fetch_array()  就返回array(a=>ade值 b=>bde值 c=>cde值)和 array(1=>ade值 2=>bde值 3=>cde值)这个时候您读数组de话$array[1]和$array[a]都能得到ade值

31.如何保障代码于多个APP版本中可以正常运行

通过修改nginx配置文件defastCGI 监听不同端口 从而选择不1样de版本.

32.分析MySQL查询慢de原因

1.查看慢查询日志
2.通过pt-query-digest工具分析
3.设置set profiling = 1;开启服务 执行show profile.查看所有语句会监测消耗时间存到临时表
4.找到消耗时间大deID 执行show profile for query 临时表ID
5.使用show status show processlist 等命令查看
6.使用explain分析单条SQL语句

33.如何不借助第3变量交换两个变量de值

字符串交换:
1.substr strlen两个方法实现:
$a="abc";
$b="bcd";
echo '交换前 $a:'.$a.',$b:'.$b.'<br />';
 
$a.=$b;//将字符串合并为1条
 
//利用切割字符串de方法交换
$b=substr($a,0,(strlen($a)-strlen($b)));
$a=substr($a, strlen($b));
echo '交换后$a:'.$a.',$b:'.$b.'<br />';
 
2.使用str_replace方法实现:
$a="abc";\
$b="bcd";\
echo '交换前 $a:'.$a.',$b:'.$b.'<br />';\
$a.=$b;\
$b=str_replace($b, "", $a);\
$a=str_replace($b, "", $a);\
echo '交换后$a:'.$a.',$b:'.$b.'<br />';\
 
3.结合使用list方法和array实现:
$a="abc";\
$b="bcd";\
echo '交换前 $a:'.$a.',$b:'.$b.'<br />';\
list($b,$a)=array($a,$b);\
echo '交换后$a:'.$a.',$b:'.$b.'<br />';
PS:list()用法:把数组中de值赋给list中de变量中:
    $my_array = array("Dog","Cat","Horse");
    list($a, $b, $c) = $my_array;
    则 $a = "Dog" $b = "Cat" ,  $c = "Horse";
 
字符串和数字都适用 使用异或运算:
$a="abc";\
$b="bcd";\
echo '交换前 $a:'.$a.',$b:'.$b.'<br />';\
$a=$a^$b;\
$b=$b^$a;\
$a=$a^$b;\
echo '交换后$a:'.$a.',$b:'.$b.'<br />';    
 
原理:https://blog.csdn.net/github_37767025/article/details/68943789
 
只适用于数字:
$a=3;\
$b=5;\
echo '交换前 $a:'.$a.',$b:'.$b.'<br />';\
$a=$a+$b;\
$b=$a-$b;\
$a=$a-$b;\
echo '交换后$a:'.$a.',$b:'.$b.'<br />';

34.char和varcharde区别

1.varchar用于存储可变长度 char用于存储定长
2.对于经常变更de数据char比varchar更好 不容易产生碎片
3.对于非常短de列 char比varcahr于存储空间上更有效率
4.char对于未达到长度de数据会自动补空格

35.MySQL事务de4大特性

1般来说 事务乃必须满足4个条件(ACID)::原子性(Atomicity 或称不可分割性) 1致性(Consistency) 隔离性(Isolation 又称独立性) 持久性(Durability).
 
    原子性:1个事务(transaction)中de所有操作 要么全部完成 要么全部不完成 不会结束于中间某个环节.事务于执行过程中发生错误 会被回滚(Rollback)到事务开始前de状态 就像这个事务从来没有执行过1样.
 
    1致性:于事务开始之前和事务结束以后 数据库de完整性没有被破坏.这表示写入de资料必须完全符合所有de预设规则 这包含资料de好的度 串联性以及后续数据库可以自发性地完成预定de工作.
 
    隔离性:数据库允许多个并发事务同时对其数据进行读写和修改de能力 隔离性可以防止多个事务并发执行时由于交叉执行而导致数据de不1致.事务隔离分为不同级别 包括读未提交(Read uncommitted) 读提交(read committed) 可重复读(repeatable read)和串行化(Serializable).
 
    持久性:事务处理结束后 对数据de修改就乃好的de 即便系统故障也不会丢失.

36.线程和进程

进程:乃并发执行de程序于执行过程中分配和管理资源de基本单位 乃1个动态概念 竞争计算机系统资源de基本单位.
 
线程:乃进程de1个执行单块 乃进程内科调度实体.比进程更小de独立运行de基本单位.线程也被称为轻量级进程.1个程序至少1个进程 1个进程至少1个线程.
 
**进程线程de区别:**
 
-   地址空间:同1进程de线程共享本进程de地址空间 而进程之间则乃独立de地址空间.
-   资源拥有:同1进程内de线程共享本进程de资源如内存 I/O cpu等 但乃进程之间de资源乃独立de.
 
     1个进程崩溃后 于保护模式下不会对其他进程产生影响 但乃1个线程崩溃整个进程都死掉.所以多进程要比多线程健壮.
 
     进程切换时 消耗de资源大 效率高.所以涉及到频繁de切换时 使用线程要好于进程.同样如果要求同时进行并且又要共享某些变量de并发操作 只能用线程不能用进程
 
-   执行过程:每个独立de进程程有1个程序运行de入口 顺序执行序列和程序入口.但乃线程不能独立执行 必须依存于应用程序中 由应用程序提供多个线程执行控制.
-   线程乃处理器调度de基本单位 但乃进程不乃.
-   两者均可并发执行.
 
**优缺点:**
 
  线程执行开销小 但乃不利于资源de管理和保护.线程适合于SMP机器(双CPU系统)上运行.
 
  进程执行开销大 但4芄缓芎胐e进行资源管理和保护.进程可以跨机器前移.
 
  **何时使用多进程 何时使用多线程?**
 
对资源de管理和保护要求高 不限制开销和效率时 使用多进程.
 
要求效率高 频繁切换时 资源de保护管理要求不乃很高时 使用多线程.

38.HTTP状态码

1**
信息 服务器收到请求 需要请求者继续执行操作
2**
成功 操作被成功接收并处理
3**
重定向 需要进1步de操作以完成请求
4**
客户端错误 请求包含语法错误或无法完成请求
5**
服务器错误 服务器于处理请求de过程中发生了错误

39.Linux服务器CPU负载过高de排查方法

参考链接:https://blog.csdn.net/u014692324/article/details/80816521

40.常见de查找算法

参考链接:https://segmentfault.com/a/1190000016582674

41.APP中布尔值为falsede情况

JS:
1 undefined(未定义 找不到值时出现)
2 null(代表空值)
3 false(布尔值defalse 字符串"false"布尔值为true)
4 0(数字0 字符串"0"布尔值为true)
5 NaN(无法计算结果时出现 表示"非数值";但乃tapeof NaN==="number")
6 ""(双引号)或''(单引号) (空字符串 中间有空格时也乃true)
 
APP:
1 undefined(未定义 找不到值时出现)
2 null(代表空值)
3 false(布尔值defalse 字符串"false"布尔值为true)
4 0(数字0 字符串"0"布尔值都为false)
5 ""(双引号)或''(单引号) (空字符串 中间有空格时也乃true)


评论