lzcBk

1、用PHP写出显示客户端的IP和服务端的IP

echo $_SERVER[\'REMOTE_ADDR\'];//客户端IP

echo gethostbyname($_SERVER[\'SERVER_NAME\'])//服务端

 

 

2、写出一下程序的输出结果:

<?php    

$data = [\'a\',\'b\',\'c\']; 

foreach($data as $k=>$v){

    $v = &$data[$k];

}

?>

A $data = [\'a\',\'b\',\'c\'];            B $data = [\'b\',\'b\',\'c\'];             C $data = [\'b\',\'c\',\'c\']; 

解析:这里有个考点要记得 就是&是引用;修改引用变量的值,那么空间的值也会改变,第一次循环 得到$v=&$data[0]=>\'a\',第二次循环$v=&$data[1]=>\'b\',可见第一次引用的$data[0]的值已经被改变,所以此时的$data[0]=b,此时$v引用的$data[1],进入第三次循环 此时$v又变为 $v=&$data[2]=>\'c\',,$v又一次改变,引用的$data[1]的值也被改变为C,所以此时的$data[1]=c,这样循环结束 $data[0]=>\'b\', $data[1]=>\'c\', $data[2]=>\'c\',

 3、写出一下程序的输出结果:

<?php 

$a= 0.1; $b = 0.7;

if($a+$b ==0.8){ echo true; }else{ echo false; }

?>

A 空;     B true;      C false;     D、1;  E、0;  F:报错

解析:这里的考点有两个:1,echo false和true的值;2、浮点类型不能用于精确计算;首先浮点类型的数据不能用于计算,他会将浮点类型转为二进制,所以有一定的损耗,故它无限接近于0.8,也就是0.79999999...,所以echo 应该是个false;echo false;结果是空;echo true;结果是1;

 4、用php方式对目录遍历

$dir = \'./test\';

function loopDir($dir){
    $handle = opendir($dir);
    while(false !==($file =readdir($handle))){
        if($file!=\'.\'&&$file!=\'..\'){
            echo $file."<br>";
            if(filetype($dir.\'/\'.$file)==\'dir\'){
                loopDir($dir.\'/\'.$file);
            }
        }
    }
}

loopDir($dir);

 



 5、请简单叙述 CGI fastCGI h和 PHP-FPM的区别

CGI 代表为了联系PHP 和websevae 的一个桥梁
fastCGI 是CGI的改良版
PHP-FPM 进程管理器

 6、冒泡排序很实用要记得

function maopao($arr){
    $len = count($arr);
    $n = count($arr)-1;
    for($i=0;$i<$len;$i++){
        for($j=0;$j<$n;$j++){
            if($arr[$j]<$arr[$j+1]){
                $temp = $arr[$j+1];
                $arr[$j+1] = $arr[$j];
                $arr[$j] =$temp;
            }
        }
    }
    return $arr;
}

7、快速排序

function quick_sort($array) {

    if (count($array) <= 1) return $array;

    $key = $array[0];

    $left_arr = array();

    $right_arr = array();

    for ($i=1; $i<count($array); $i++){

        if ($array[$i] <= $key)

            $left_arr[] = $array[$i];

        else

            $right_arr[] = $array[$i];

    }

    $left_arr = quick_sort($left_arr);

    $right_arr = quick_sort($right_arr);

    return array_merge($left_arr, array($key), $right_arr);

}

8、请说明 PHP 中传值与传引用的区别,什么时候传值什么时候传引用?

按值传递:函数范围内对值的任何改变在函数外部都会被忽略

按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改

优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。

    按引用传递则不需要复制值,对于性能提高很有好处。

9、MySQL数据库中的字段类型varchar和char的主要区别是什么?

char和varchar最大的不同就是一个是固定长度,一个是可变长度.由于是可变长度,因此存储的是实际字符串再加上一个记录字符串长度的字节。如果分配给char或varchar列的值超过 列的最大长度,则对值进行裁剪.

 varchar(M)和char(M),M都表示字符数.varchar的最大长度为65535个字节,不同的编码所对应的最大可存储的字符数不同.char最多可以存放255个字符,不同的编码最大可用字节数不同

 

10、什么是面向对象?主要特征是什么?

面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。

11、SESSION 与 COOKIE的区别是什么?

SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。禁用cookie后,session还可以使用,在存储session的文件中,生成sessionID,通过get传参的方式将sessionID传到要实现session共享的页面,读取sessionID,从而从session中获取数据。

12、对缓存技术的了解

1、缓存技术是将动态内容缓存到文件中,在一定时间内访问动态页面直接调用缓存文件,而不必重新访问数据库。

2、使用memcache、redis可以做缓存。

13、表单中get和post提交方式的区别?

get是显式的,数据从url中可以看到,传输的数据量小,安全性低; post是隐式的,传送的数据量较大,安全性较高

14、优化mysql数据库的方法

              1,数据表中的数据类型的优化  如选择合适的字段,选择效率快速的字段 

    2,索引优化

    3、SQL语句的优化

      (1)优化查询过程中的数据访问如使用limit、使用返回列不用*

      (2)优化长难句的查询语句 变复杂为简单、切分查询、分解关联查询

      (3)优化特定类型的查询语句如优化count()、优化关联查询、优化子查询、优化Group by、优化li\'mit

    4、存储引擎的优化

      (1)尽量使用InnoDB存储引擎,因为它支持事务、外键、使用独立表空间、使用的是行级锁、

    5、数据表结构的设计优化

      (1)分区操作 如通过特定的策略对数据进行物理拆分、对用户透明的、partition by

      (2)分库分表  如水平拆分(以行级进行拆分)、垂直拆分(列及拆分)

    6、数据架构的优化

      (1)主从复制

      (2)读写分离

      (3)双主热备

      (4)负载均衡  通过LVS的三种模式实现的、Mycat数据库中间件实现的

15、语句include和require的区别是什么?

  require是无条件包含,也就是如果一个流程里加入require,无论条件成立与否都会先执行require,当文件不存在或者无法打开的时候,会提示错误,并且会终止程序执行

  include有返回值,而require没有(可能因为如此require的速度比include快),如果被包含的文件不存在的化,那么会提示一个错误,但是程序会继续执行下去

16、redis和memcacahe、mongoDB的区别?

   都是非关系型数据库,性能都非常高,但是mongoDB和memcache、redis是不同的两种类型。后两者主要用于数据的缓存,前者主要用在查询和储存大数据方面,是最接近数据库的文档型的非关系数据库。

   从数据存储位置上来分,memcache的数据存在内存中,而redis既可以存储在内存中,也可以存储的到磁盘中,达到持久化存储的功能,memcache一旦断电,数据全部丢失,redis可以利用快照和AOF把数据存到磁盘中,当恢复时又从磁盘中读取到内存中,当物理内存使用完毕后,可以把数据写入到磁盘中。

   从存储数据的类型上来分,memcache和redis存储的方式都是键值对,只不过redis值的类型比较丰富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache主要存储的是字符串。

17、PHP的基本变量类型

              四种标量类型:boolean (布尔型)、integer (整型)、float (浮点型, 也称作 double)、string (字符串)

    两种复合类型:array (数组)、object (对象)

    最后是两种特殊类型:resource(资源)、NULL(NULL)

18、静态化如何实现的?伪静态如何实现?

            1、 静态化指的是页面静态化,也即生成实实在在的静态文件,也即不需要查询数据库就可以直接从文件中获取数据,指的是真静态。
      实现方式主要有两种:

        一种是我们在添加信息入库的时候就生成的静态文件,也称为模板替换技术。

        一种是用户在访问我们的页面时先判断是否有对应的缓存文件存在,如果存在就读缓存,不存在就读数据库,同时生成缓存文件。

    2、伪静态不是真正意义上的静态化,之所以使用伪静态,主要是为了SEO推广,搜索引擎对动态的文件获取难度大,不利于网站的推广。实习原理是基于Apache或Nginx的rewrite机智
  主要有两种方式:

      一种是直接在配置虚拟机的位置配置伪静态,这个每次修改完成后需要重启web服务器。

      另一种采用分布式的,可以在网站的根目录上创建.htaccess的文件,在里面配置相应的重写规则来实现伪静态,这种每次重写时不需要重启web服务器,且结构上比较清晰。

19、对于大流量的网站,采用什么样的方法来解决访问量问题?

  1. 确认服务器硬件是否足够支持当前的流量
  2. 优化数据库访问。
  3. 禁止外部的盗链。
  4. 控制大文件的下载。
  5. 使用不同主机分流主要流量
  6. 使用流量分析统计软件
  7. 尽量使用静态页,缓存       

20、如何处理负载,高并发

  1、HTML静态化
  效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。
  2、图片服务器分离
  把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛等
  3、数据库集群和库表散列及缓存
  数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。
  4、镜像:
  尽量减少下载,可以把不同的请求分发到多个镜像端。
  5、负载均衡:
  Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。

30、Mysql的读写分离?

  读写分离的实现原理就是在执行SQL语句的时候,判断到底是读操作还是写操作,把读的操作转向到读服务器上(从服务器,一般是多台),写的操作转到写的服务器上(主服务器,一般是一台,视数据量来看)。

31、商城秒杀的实现?

       把要秒杀的商品放入到队列中,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,文件锁和事务在高并发下性能下降很快,当然还要考虑其他方面的东西,比如抢购页面做成静态的,通过ajax调用接口,其中也可能会出现一个用户抢多次的情况,这时候需要再加上一个排队队列和抢购结果队列及库存队列。高并发情况下,将用户进入排队队列,用一个线程循环处理从排队队列取出一个用户,判断用户是否已在抢购结果队列,如果在,则已抢购,否则未抢购,库存减1,写数据库,将用户入结果队列。

32、请介绍一下laravel框架?

  laravel框架的设计思想比较先进,非常适合应用各种开发模式,作为一个框架,它为你准备好了一切,composer是php的未来,没有composer,php肯定要走向没落

  laravel框架最大的特点和优秀之处就是集合了php比较新的特点,以及各种各样的设计模式,Ioc模式,依赖注入等

33、TP的特性有哪些? 

  1.多表查询非常方便,在model中几句代码就可以完成对多表的关联操作

  2.融合了smarty模板,使前后台分离

  3.支持多种缓存技术,尤其对memcache技术支持非常好

  4.命名规范,模型,视图,控制器严格遵循命名规则,通过命名一一对应

  5.支持多种url模式

  6.内置ajax返回方法,包括xml,json,html等

  7.支持应用扩展,类库扩展,驱动扩展等

34、__FILE__表示什么意思?

  文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。

35、$str是一段html文本,使用正则表达式去除其中的所有js脚本

 $pattern = ‘/<script.*>\.+<\/script>/’;

 preg_replace($pattern,’’,$str);

 

36、常见的 PHP 安全性攻击

SQL注入:用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。
防止

使用mysql_real_escape_string()过滤数据

手动检查每一数据是否为正确的数据类型

使用预处理语句并绑定变量

参数化SQL:是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@或?来表示参数。

XSS攻击 :跨站点脚本攻击,由用户输入一些数据到你的网站,其中包括客户端脚本(通常JavaScript)。如果你没有过滤就输出数据到另一个web页面,这个脚本将被执行。
防止:为了防止XSS攻击,使用PHP的htmlentities()函数过滤再输出到浏览器。

CSRF:跨站点请求伪造,是指一个页面发出的请求,看起来就像是网站的信任用户,但是是伪造的
防止:一般来说,确保用户来自你的表单,并且匹配每一个你发送出去的表单。有两点一定要记住:

对用户会话采用适当的安全措施,例如:给每一个会话更新id和用户使用SSL。

生成另一个一次性的令牌并将其嵌入表单,保存在会话中(一个会话变量),在提交时检查它。 如laravel中的 _token

代码注入:代码注入是利用计算机漏洞通过处理无效数据造成的。问题出在,当你不小心执行任意代码,通常通过文件包含。写得很糟糕的代码可以允许一个远程文件包含并执行。如许多PHP函数,如require可以包含URL或文件名。
防止代码注入

过滤用户输入

在php.ini中设置禁用allow_url_fopen和allow_url_include。这将禁用require/include/fopen的远程文件

37、PHP支持多继承吗?

  不支持。PHP中只允许单继承,父类可以被一个子类用关键字“extends”继承。

38、PHP如何实现多继承吗?

  可以使用 interface 或 trait 实现 。

  1.使用 interface 声明类不能被实例化,并且属性必须是常量,方法不能有方法体 

  2.trait 声明的类不能被实例化,由use引入,会覆盖父类的相同属性及方法,如果有多个use,那么按顺序下面的覆盖最上面的相同的属性及方法

39、PHP 数组排序

sort() - 以升序对数组排序

rsort() - 以降序对数组排序

asort() - 根据值,以升序对关联数组进行排序

ksort() - 根据键,以升序对关联数组进行排序

arsort() - 根据值,以降序对关联数组进行排序

krsort() - 根据键,以降序对关联数组进行排序

 

40、谈谈你对 mysql 引擎中的MyISAM与InnoDB的区别理解?

InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。

以下是一些细节和具体实现的差别:
MyISAM与InnoDB的区别是什么?

1、 存储结构
MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

2、 存储空间

MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。

InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

3、 可移植性、备份及恢复

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。

InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。

4、 事务支持

MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。

InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

5、 AUTO_INCREMENT

MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。

InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

6、 表锁差异

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。

InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

7、 全文索引

MyISAM:支持 FULLTEXT类型的全文索引

InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

8、 表主键

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。

InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

9、 表的具体行数

MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出出该值。

InnoDB:没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。

10、 CURD操作

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。

InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

11、 外键

MyISAM:不支持

InnoDB:支持

通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌

 

41、如何把一个GB2312格式的字符串装换成UTF-8格式?

<?php

    iconv(\'GB2312\',\'UTF-8\',\'加油加油\');

?>

 

分类:

技术点:

相关文章:

  • 2021-04-01
  • 2021-12-19
  • 2021-10-11
  • 2021-05-30
  • 2021-07-06
  • 2021-07-24
  • 2021-10-13
猜你喜欢
  • 2021-12-13
  • 2022-12-23
  • 2021-08-17
  • 2022-12-23
  • 2022-02-06
  • 2021-07-11
  • 2021-11-18
相关资源
相似解决方案