php 删除空数组-【笔试】PHP核心技术笔试题,跳槽必备!

2023-09-02 0 6,274 百度已收录

笔试打造战舰,下班拧螺丝。 每天我们都会整理最接地气的笔试题,希望对您有所帮助!

什么是 1oops?

答:oop是面向对象编程。 面向对象编程是一种计算机编程框架。 OOP 的基本原理是计算机程序由可以充当子例程的单个单元或对象组成。

OOP具有三大特点

1、封装:俗称信息隐藏,就是将一个类的使用和实现分离,只保留一些与外界通信的套接字和技能,或者只公开一些技能供开发者使用。 因此,开发者只需要关注如何使用这个类,而不需要关心它的具体实现过程。 只有这样才能实现MVC的分工协作,也能有效防止程序之间的相互依赖,实现代码模块之间的松耦合。

2、继承:基类手动继承其父类的属性和技能,并且可以添加新的属性和技能或者重绘一些属性和方法。 继承降低了代码的可重用性。 PHP只支持单继承,即一个子类只能有一个父类。

3、多态性:泛型继承父类的属性和方法,并重绘了部分方法。 因此多个子类似乎具有相同的方法,并且由该泛型类型实例化的对象在调用这些相同的方法后可以得到完全不同的结果。 这些技术就是多态性。 多态性增加了软件的灵活性。

1、维护方便

采用面向对象思想设计的结构,具有较高的可读性。 由于继承的存在,虽然需求发生变化,但维护只是部分模块,因此维护非常方便且成本低廉。

2. 高品质

设计时,重用原项目领域内已经测试过的现有类,使系统满足业务需求并具有更高的质量。

3、效率高

在软件开发过程中,现实世界中的事物根据设计的需要被具体化并形成类。 采用这种方法解决问题贴近日常生活、自然的思维形式,必然会提高软件开发的效率和质量。

4. 易于扩展

由于继承、封装、多态等特点,自然需要设计出高内聚、低耦合的系统结构,使系统更加灵活、更容易扩展,但成本却更低。

2. 合并两个字段的方法有多种。 尝试比较它们的优点和缺点。

形式:

1. array_merge()

2.“+”

3. 数组合并递归

的优点和缺点:

array_merge 简单合并字段

array_merge_recursive 合并两个字段。 如果链表中有完全相同的数据,则递归合并。

array_combine 和 '+':合并两个字段,后者的值作为新链表的键

3 PHP的is_writeable()函数存在一个bug,导致很难准确判断一个目录/文件是否可写。 请编写一个函数来判断目录/文件是否绝对可写。

答:该错误有两个方面,

1、在windows中,当文件只有只读属性时,is_writeable()函数返回false。 当它返回 true 时,文件不一定是可写的。

如果是目录,则在该目录下新建文件,通过打开该文件来判断;

如果是文件,可以通过打开文件(fopen)来测试文件是否可写。

2、在Unix下,当php配置文件中开启safe_mode(safe_mode=on)时,is_writeable()也是不可用的。

读取配置文件以查看安全模式是否启用。

/**
* Tests for file writability
*
* is_writable() returns TRUE on Windows servers when you really can't write to
* the file, based on the read-only attribute. is_writable() is also unreliable
* on Unix servers if safe_mode is on.
*
@access   private
@return   void
*/


if ( ! function_exists('is_really_writable'))
{
    function is_really_writable($file){

    // If we're on a Unix server with safe_mode off we call is_writable
    if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE){
        return is_writable($file);
    }

    // For windows servers and safe_mode "on" installations we'll actually
    // write a file then read it. Bah...
    if (is_dir($file)){

        $file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100));

        if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE){
            return FALSE;
        }

        fclose($fp);
        @chmod($file, DIR_WRITE_MODE);
        @unlink($file);
        return TRUE;

    } elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) {

        return FALSE;
    }

    fclose($fp);
    return TRUE;

    }

}

4PHP的垃圾回收机制是怎样的? PHP 可以手动管理视频内存并消除不再需要的对象。 PHP 使用引用计数(referencecounting)作为简单的垃圾收集(garbagecollection)机制。 每个对象都包含一个引用计数器。 每个引用都连接到该对象,计数器就加1。当引用离开生存空间或者设置为NULL时,计数器就减1。当一个对象的引用计数器达到零时,PHP知道你不再使用它了。需要使用该对象并释放其占用的显存空间。

5 编写一个函数,尽可能高效地从标准 URL 检索文件扩展名,例如:您需要检索 php 或 .php

<?php

    // 方案一
    function getExt1($url){

        $arr = parse_url($url);
        //Array ( [scheme] => http [host] => www.startphp.cn [path] => /abc/de/fg.php [query] => id=1 )

        $file = basename($arr['path']);
        $ext = explode('.', $file);
        return $ext[count($ext)-1];
    }



    // 方案二
    function getExt2($url){

        $url = basename($url);
        $pos1 = strpos($url,'.');
        $pos2 = strpos($url,'?');

        if (strstr($url,'?')) {
            return substr($url,$pos1+1,$pos2-$pos1-1);

        } else {
            return substr($url,$pos1);
        }
    }

    $path = "http://www.startphp.cn/abc/de/fg.php?id=1";
    echo getExt1($path);
    echo "
"
;
    echo getExt2($path);

?>

6.使用正则表达式提取一个标记语言(html或xml)代码段并手动指定标签的指定属性值(需要考虑属性值的不规则性,例如不区分大小写、属性名之间有空格)值和等号等)。 这里假设需要提取test标签的attr属性值。 请自行创建包含该标签的字符串(腾讯)

如下:

<?php
    header("content-type:text/html;charset=utf-8");

    function getAttrValue($str,$tagName,$attrName){
        $pattern1="/<".$tagName."(s+w+s*=s*(['"]?)([^'"]*)())*s+".$attrName."s*=s*(['"]?)([^'"]*)()(s+w+s*=s*(['"]?)([^'"]*)(9))*s*>/i";

        $arr=array();
        $re=preg_match($pattern1,$str,$arr);

        if($re){
            echo"
$arr[6]={$arr[6]}"
;
        }else{
            echo"
没找到。"
;
        }

    }

    // 示例

    $str1="";
    getAttrValue($str1,"test","attr");//找test标签中attr属性的值,结果为ddd

    $str2="<test2 attr='ddd'attr2='ddd2't1="t1 value"t2='t2 value'>";

    getAttrValue($str2,"test2","t1");//找test2标签中t1属性的值,结果为t1 value

?>

7php中WEB上传文件的原理是什么,如何限制上传文件的大小?

上传文件的表单使用post表单,但需要在表单中添加enctype='multipart/form-data'。

通常您可以添加一个隐藏字段:,位于文件字段上方。

value的值为客户端上传文件的字节数限制。 这样可以防止用户花时间等待上传大文件,后来才发现文件太大而上传失败。

使用文件字段选择要上传的文件。 当点击提交按钮时,文件将被上传到服务器中的临时目录,并在脚本结束时被销毁。 因此,应该在脚本结束之前连接到服务器。 在某个目录下,可以通过move_uploaded_file()函数连接临时文件。 要获取有关临时文件的信息,请使用 $_FILES。

限制上传文件大小的激励措施包括:

客户端隐藏字段MAX_FILE_SIZE的值(可以绕过)。

服务器端的 upload_max_filesize、post_max_size 和 memory_limit。 这些项目无法使用脚本进行设置。

自定义文件大小限制逻辑。 虽然服务器限制可以由您自己确定,但在某些情况下可能需要考虑某些因素。 所以这种形式的限制往往是必要的。

8 请解释 PHP 中按值传递和按引用传递之间的区别。 什么时候应该按值传递,什么时候应该按引用传递?

按值传递:函数范围内对值的任何更改在函数外部也将被忽略

通过引用传递:对函数范围内的值的任何更改也会反映在函数外部

相同点和不同点: 当按值传递时,PHP 必须复制该值。 特别是对于小字符串和对象,这可能是一项昂贵的操作。 通过引用传递不需要复制值,这对于性能提升非常有用。

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

Varchar是变长的,节省存储空间,而char是定宽的。 搜索效率比char类型快。 由于varchar是不固定长度,所以必须先查找宽度,然后再提取数据。 这比char定长类型多了一步,所以效率较低。

10静态化是如何实现的? 如何实现伪静态

1、静态化是指页面静态化,即生成真正的静态文件,即可以直接从文件中获取数据,无需查询数据库,这是指真正的静态。

实现方式主要有两种:一种是我们向数据库添加信息时生成的静态文件,也称为模板替换技术。 一是当用户访问我们的页面时,首先判断是否有对应的缓存文件。 如果有缓存文件且没有数据库,则同时生成缓存文件。

2、伪静态并不是真正意义上的静态。 之所以采用伪静态,主要是为了SEO推广。 搜索引擎获取动态文件比较困难,不利于网站推广。实习原理基于Apache或Nginx的rewrite wit

主要有两种形式:一种是直接在配置虚拟机的地方配置伪静态。 这需要在每次更改后重新启动 Web 服务器。 另一个是分布式的。 可以在网站根目录下创建.htaccess文件,并在其上配置相应的重绘规则,实现伪静态。 这些不需要每次重绘时都重新启动Web服务器,而且结构上也比较清晰。

11如何应对负载和高并发

1.HTML静态化

最高效、消耗最少的就是纯静态的HTML页面,所以我们网站的页面尽量使用静态页面。 这是最简单的方法,但也是最有效的方法。

2、图像服务器分离

将图片分开存储,最大限度降低图片等大流量的成本。 可以放到一些相关的平台上,比如七牛等。

3. 数据库集群和数据库表哈希和缓存

数据库的并发连接数是100个,一个数据库是远远不够的。 可以从读写分离、主从复制、数据库集群入手。 另外,尽量减少数据库访问,可以使用memcache、redis等缓存数据库。

4.镜子:

为了最大限度地减少下载,可以将不同的请求分发到多个镜像。

5、负载均衡:

Apache的最大并发连接数是1500,只能减少服务器。 可以从硬件入手,比如F5服务器。 其实硬件的成本比较高php 删除空数组,所以我们往往从软件入手。

12PHP7有哪些新特性?

标量类型声明:PHP7 中函数的实际参数类型声明可以是标量。 在PHP5中,只能是类名、接口、数组或callable(PHP5.4,即可以是函数,包括匿名函数)。 现在您还可以使用 string、int、float 和 bool。

返回值类型声明:减少对返回类型声明的支持。 与参数类型声明类似,返回类型声明指定函数返回值的类型。 可用类型与参数声明中可用的类型相同。 NULL合并运算符:因为日常使用中有很多同时使用三元表达式和isset()的情况,所以NULL合并运算符提示变量存在且值不为NULL。 它将返回它自己的值,否则它将返回它的第二个值。 操作数。

use 增强:现在可以通过单个 use 语句一次性导出从同一名称空间导出的类、函数和常量匿名类:现在支持通过 newclass 实例化匿名类

13种常见的PHP安全攻击SQL注入:

用户可以通过在表单数组中输入SQL语句来影响SQL的正常执行。

避免:使用 mysql_real_escape_string() 过滤数据。 自动检测每个数据是否是正确的数据类型。 使用预处理语句并绑定变量。 参数化SQL:指设计连接数据库、访问数据时填写值或数据。 其中,使用参数(Parameter)来赋予值,使用@或? 来表示参数。

XSS 攻击:一种跨站点脚本攻击,用户在您的网站中输入一些数据,包括客户端脚本(通常是 JavaScript)。 如果你在没有过滤的情况下将数据输出到另一个网页,这个脚本就会被执行。

避免:为了避免XSS攻击,请使用PHP的htmlentities()函数进行过滤,然后输出到浏览器。

CSRF:跨站请求伪造,指看似网站可信用户的页面发出的请求,并且被伪造

避免:一般来说,确保用户来自您的表单,但与您发送的每个表单相匹配。 有两点必须牢记:对用户会话采取适当的安全措施,例如:为每个会话更新id以及为用户使用SSL。 生成另一个一次性令牌并将其嵌入表单中,将其存储在会话(会话变量)中,并在提交时检查它。 比如laravel中的_token

代码注入:代码注入是通过计算机漏洞处理无效数据而造成的。 当您无意中执行任意代码(通常是通过文件包含)时,就会出现问题。 写得不好的代码可能会允许包含并执行远程文件。 与许多 PHP 函数一样,require 可以包含 URL 或文件名。

避免代码注入来过滤用户输入在php.ini设置中禁用allow_url_fopen和allow_url_include。这将禁用远程文件的require/include/fopen

16面向对象有什么特点?

主要包括封装、继承、多态。 如果是4个方面,则加上:具体性。

包裹:

封装是保证软件组件具有优良模块化性的基础。 封装的目标是实现软件组件的高内聚、低耦合,避免程序相互依赖带来的变更影响。

遗传:

定义和实现一个类时,可以在一个已经存在的类的基础上进行,并且可以将这个已经存在的类定义的内容作为自己的内容,并且可以添加一些新的内容,也可以使用原来的内容被改变。 让它更适合特殊需要的方法就是继承。 继承是泛型手动共享父类的数据和技能的机制,类之间的关系可以提高软件的可重用性和可扩展性。

多态性:

多态是指程序中定义的引用变量所指向的具体类型以及通过引用变量发出的方法调用并不是在编程时确定的,而是在程序运行过程中确定的,即引用变量将指向毕竟那堂课。 对于引用变量的实例对象,在程序运行过程中必须判断引用变量发出的方法调用是否是该类中实现的方法。

具体的:

表征就是找出一些事物的相似点和共性,然后将这些事物归为一类。 本课只考虑那些事物的相似性和共性,而忽略了这些与当前主题和目标无关的方面。 专注于与您当前目标相关的事情。 例如,当你看到一只蚂蚁和一头小象时,你可以想象它们之间的相似之处,那就是具体性。

17、优化SQL语句的方法有哪些? (选择几个)

(1)在Where谓词中:where表之间的连接必须写在其他where条件之前,并且这些能够过滤出最大条数记录的条件必须写在where谓词的末尾。 拥有是最后的。

(2) 将 IN 替换为 EXISTS,将 NOTIN 替换为 NOTEXISTS。

(3) 防止在索引列上使用估计值

(4) 防止在索引列上使用ISNULL和ISNOTNULL

(5)优化查询,尽量避免全表扫描,首先考虑对where和orderby涉及的列建立索引。

(6)尽量避免在where谓词中判断数组的null值,否则引擎会放弃索引的使用而进行全表扫描。

(7)尽量避免在where谓词中对数组进行表达式操作,这会导致引擎放弃使用索引而进行全表扫描

18MySQL数据库作为发布系统的存储。 预计三天内增量将超过5万件。 运营和维护预计需要两年时间。 如何优化呢?

(1)设计一个设计良好的数据库结构,允许部分数据冗余,并尽可能避免连接查询,以提高效率。

(2)选择合适的表数组数据类型和存储引擎,并适当添加索引。

(3)做mysql主从复制读写分离。

(4)将数据表分表,减少单表数据量,提高查询速度。

(5)添加缓存机制,如redis、memcached等。

(6)对于不经常变化的页面,生成静态页面(如ob缓存)。

(7)编写高效的SQL。 例如,SELECT*FROMTABEL 更改为 SELECTfield_1,field_2,field_3FROMTABLE。

19对于流量大的网站,你们用什么方法来解决页面访问量的统计问题?

(1)确认服务器是否能够支持当前流量。

(2)优化数据库访问。

(3)严禁图片盗链等外部访问链接(盗链)。

(4)控制文件下载。

(5)做负载均衡,使用不同的主机来分流流量。

(6)利用浏览统计软件了解访问量,进行有针对性的优化。

20 说说你对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:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。
InnoDBInnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。
6、 表锁差异
MyISAM:只支持表级锁,用户在操作myisam表时,selectupdatedeleteinsert语句都会给表自动加锁,如果加锁以后的表满足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:如果你的数据执行大量的INSERTUPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。
11、 外键
MyISAM:不支持
InnoDB:支持
通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。

21redis和memache缓存的区别

总结一:

1.数据类型

Redis数据类型丰富,支持set list等类型
memcache支持简单数据类型,需要客户端自己处理复杂对象

2.持久性

redis支持数据落地持久化存储
memcache不支持数据持久存储

3.分布式存储

redis支持master-slave复制模式
memcache可以使用一致性hash做分布式

value大小不同

memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用

4.数据一致性不同

redis使用的是单线程模型,保证了数据按顺序提交。
memcache需要使用cas保证数据一致性。CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作

5.cpu利用

redis单线程模型只能使用一个cpu,可以开启多个redis进程

总结二:

1.Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。
2.Redis不仅仅支持简单的k/v类型的数据,同时还提供listsethash等数据结构的存储。
3.Redis支持数据的备份,即master-slave模式的数据备份。
4.Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
我个人认为最本质的不同是Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存

总结三:

redis和memecache的不同在于:

1、存储方式:
memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小
redis有部份存在硬盘上,这样能保证数据的持久性。
2、数据支持类型:
redis在数据支持上要比memecache多的多。
3、使用底层模型不同:
新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4、运行环境不同:
redis目前官方只支持Linux 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统 环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上

memcache只能当做缓存,cache
redis的内容是可以落地的,就是说跟MongoDB有些类似,然后redis也可以作为缓存,并且可以设置master-slave

22 先进先出redis消息队列需要注意什么?

答:一般使用列表来实现队列操作。 这种方式有一个小限制,所以所有任务统一先进先出。 如果你想优先处理某项任务,这并不容易处理。 这就需要对队列进行优先级排序。 概念上,我们可以对高层任务进行优先级排序,实现方法有以下几种形式:

1)单列表实现:队列的正常操作是左进右出(lpush,rpop)。 为了先处理高优先级的任务,当遇到高级别的任务时,可以直接跳入队列,直接加载到队列颈中(rpush),这样,当从队列颈中获取到任务时(右) ,获得高优先级任务(rpop)

2)使用两个队列,一个普通队列,一个中间队列,根据任务级别加载不同的队列。 获取任务也非常简单。 redis的BRPOP命令可以按顺序从多个队列中取值,并且BRPOP会根据给定的key顺序,在找到的第一个非空列表末尾弹出一个元素,redis>BRPOPlist1list20

list1 做为高优先级任务队列
list2 做为普通任务队列

这样就实现了先处理高优先级任务,当没有高优先级任务时,就去获取普通任务
方式1  最简单,但实际应用比较局限,方式3可以实现复杂优先级,但实现比较复杂,不利于维护
方式2  是推荐用法,实际应用最为合适

23Redis如何避免高并发?

答:虽然redis不存在并发问题,但由于是单进程,无论多少条命令都是依次执行的。 我们使用的时候可能会出现并发问题,比如获取和设置这个pair。 为什么Redis会出现高并发问题? Redis 出生判定

Redis是一个单线程机制的nosql数据库。 基于key-value,数据可以持久化到磁盘。 由于是单线程,redis本身没有锁的概念,多个客户端连接之间不存在竞争,jedis等客户端并发访问redis时就会出现问题。 出现连接超时、数据转换错误、阻塞、客户端关闭连接等问题,都是由于客户端的连接混乱造成的。

同时,单线程的性质决定了对同一个key的高并发操作会排队等待处理。 如果并发量较大,后续请求可能会超时。

远程访问redis时,由于网络等因素,导致高并发访问导致延迟返回的问题。

解决方案

连接在客户端池化,客户端读写Redis操作会同步内部锁。

从服务器角度来看,锁机制是通过setnx方向改变来实现的。

24限时抢购使用哪些数据库以及如何实施?

答:因为秒杀的瞬间并发量非常大,如果同时请求数据库的话,数据库的压力就会非常大,导致数据库的性能大幅提升,更严重的是,可能会导致数据库服务器宕机。 这时候通常是通过显存缓存数据库redis来实现的。 Redis是一个非关系型数据库,并且redis是单线程的。 秒杀过程可以通过redis队列来完成。

25、什么情况下使用缓存?

答:当用户第一次访问应用系统时,由于尚未登录,会被引导至认证系统进行登录。认​​证系统根据用户提供的登录信息进行身份校准。 如果校准通过,应返回给用户。 一个认证凭证——票据; 当用户访问其他应用程序时,他会携带这张票据作为自己的身份验证凭证。 应用系统收到请求后,将门票发送至认证系统进行校准,并检查门票的有效性。 合法性。 如果校准通过,用户无需再次登录即可访问应用系统2和应用系统3。

实现主要技术点:

1. 两个站点共享数据验证系统

2、主要通过跨域请求实现验证和会话处理。

26如何解决异常处理?

答:抛出异常:使用try...catch,将异常代码放在try代码块中,如果没有触发异常则代码继续执行,如果触发异常则抛出异常。 Catch 代码块捕获异常并创建包含异常信息的对象。 $e->getMessage(),输出异常错误信息。

解决异常:使用set_error_handler函数获取异常(也可以使用try()和catch()函数),然后使用set_exception_handler()函数设置默认的异常处理程序,并使用register_shutdown_function()函数执行。 执行机制是php需要将调用输入的函数调入显存。 当页面上所有的PHP语句都执行完毕后,这个函数会被再次调用。

27. 实施权限管理(RBAC)?

1、首先创建用户表:idnameauto(保存格式:controller-mode)

2.然后在后台创建一个通用的控制器,并在控制器中封装一个构造方法。 当用户登录成功后,使用TP框架中封装的session函数获取服务器中存储的sessionid,然后实例化模型,通过用户id获取数据表中存储的auth数据,使用explode函数将获取到的数据进行拆分,并使用链表保存,然后使用TP框架中封装的常量获取当前的控制器和方法,然后组装成字符String,使用in_array函数判断字段是否丰富在当前获取到的控制器和方法中,如果没有则提示用户没有权限,如果有则进行下一步

28如何保证促销产品不会超买?

答:这个问题是我们开发过程中遇到的一个难点。 超买的主要原因是下单数量与我们要推广的产品数量不一致。 每次,订单数量总是高于我们促销产品的数量。 数量需要很大。 我们小组讨论了很长时间,提出了几个实现方案:

第一种解决方案:每次下单前,我们都会判断促销产品的数量是否足够,如果不够,我们将不允许下单。 修改库存的时候,我们添加了一个条件,只修改库存小于0的产品的库存,当时我们用 ab 进行压力测试,发现当并发数超过500,访问量超过2000时,超买仍然会发生。 所以我们否认了。

第二种解决方案:使用mysql事务加排它锁来解决问题。 首先我们选择innoDB作为数据库的存储引擎,它是使用排他锁实现的。 一开始我们测试了共享锁,发现还是会出现溢出的情况。 抢购现象。 有一个问题是,当我们运行列宽并发测试时,对数据库的性能影响很大,给数据库造成很大的压力,最终被我们拒绝了。

第三种选择:使用文件锁实现。 当用户抓取促销品时,首先触发文件锁以防止其他用户进入。 用户抢到促销品后,用户解锁文件锁,并允许其他用户进行操作。 这可以解决超买问题并导致文件的I/O开销较高。

最后我们使用redis队列来实现。 待推广的商品数量以队列的形式存储在redis中。 用户每次抢到促销商品时,都会从队列中删除一条数据,以保证该商品不会削弱。这个操作看似很方便,但效率极高。 最终我们采用了这些方法来实现

29 商场闪购的实现?

答:疯狂抢购、闪购是时下非常常见的应用场景。 有两个主要问题需要解决:

1 高并发对数据库带来的压力

2、如何解决竞争条件下正确的库存削减(“超买”问题)

关于第一个问题,已经很容易想到使用缓存来处理匆忙,避免直接操作数据库,比如使用Redis。

第二个问题php 删除空数组,我们可以使用redis队列来完成,将要秒杀的产品放入队列中,因为pop操作是原子的,虽然很多用户同时到达,但是是顺序执行的,文件锁和事务都在高并发性能增长非常快。 其实还需要考虑其他的事情,比如把狂奔页面静态化,通过ajax调用socket。 还可能存在用户多次抓取的情况。 这时候就需要添加一个队列。 队列和加急结果队列和库存队列。

高并发情况下,将用户放入排队队列,使用线程处理出排队队列的用户,并判断该用户是否已经在结果队列中。 ,写入数据库,并将用户放入结果队列中。

30如何应对负载和高并发?

答:从低成本、高性能、高扩展性角度考虑,有以下几种解决方案:

1. 静态HTML

虽然大家都知道最高效、最便宜的就是纯静态的HTML页面,所以我们网站的页面尽量使用静态页面。 这是最简单的方法,但也是最有效的方法。

2、图像服务器分离

将图片分开存储,最大限度降低图片等大流量的成本。 你可以把它们放到一些相关的平台上,比如牛骑等等。

3. 数据库集群和数据库表哈希和缓存

数据库的并发连接数是100个,一个数据库是远远不够的。 可以从读写分离、主从复制、数据库集群入手。 另外,尽量减少数据库访问,可以使用memcache、redis等缓存数据库。

4、镜像:

为了最大限度地减少下载,可以将不同的请求分发到多个镜像。

5、负载均衡:

Apache的最大并发连接数是1500,只能减少服务器。 可以从硬件入手,比如F5服务器。 其实硬件的成本比较高,所以我们往往从软件入手。

负载均衡是建立在现有网络结构之上的。 它提供了一种廉价、有效、透明的方式来扩展网络设备和服务器的带宽、增加吞吐量、增强网络数据处理能力,同时也提高网络性能。 道路的灵活性和可用性。 目前使用最广泛的负载均衡软件是Nginx、LVS、HAProxy。

我们来谈谈以下三种类型的异同:

Nginx 的优点是:

工作在网络的第7层,可以实现一些http应用的分流策略,如域名、目录结构等。 其常规规则比HAProxy更加强大和灵活,这也是其目前广泛流行的主要原因之一。 ,Nginx 可以单独依赖于此的情况比 LVS 少得多。

Nginx 对网络稳定性的依赖性很小。 理论上,如果能ping通,就可以执行负载功能。 这也是它的优点之一。 相反,LVS对网络稳定性的依赖性更大,这一点我深有体会;

Nginx的安装和配置相对简单,并且易于测试。 它基本上可以复制错误日志。 LVS的配置和测试需要相对较长的时间,并且LVS对网络的依赖程度较高。

可承受高负载压力且稳定。 如果硬件不错的话,通常可以支持几万并发,负载程度也相对比LVS小一些。

Nginx可以通过该端口监控服务器内部的故障,例如服务器处理网页返回的状态码、超时等,并将返回错误的请求重新提交到另一个节点。 但缺点是不支持URL测量。 例如,用户正在上传文件,上传过程中处理上传的节点出现故障。 Nginx会将上传切换到另一台服务器重新处理,LVS会直接断开。 If a large file is uploaded, files or very important files, users may be dissatisfied.

Nginx is not only an excellent load balancer/reverse proxy software, it is also a powerful web application server. LNMP is also a particularly popular web architecture in recent years, and its stability is very good in high-traffic environments.

Nginx is now becoming more and more mature as a web reverse acceleration cache, and its speed is faster than the traditional Squid server. You can consider using it as a reverse proxy accelerator.

Nginx can be used as a mid-level reverse proxy. At this level, Nginx basically has no rivals. The only one that can compare with Nginx is lighttpd. However, lighttpd does not yet have the full functions of Nginx, and the configuration is not so clear and easy to read. Community information It is also far less active than Nginx.

Nginx can also be used as a static web page and image server, and its performance in this area is unmatched. The Nginx community is also very active and there are many third-party modules.

The disadvantages of Nginx are:

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 php php 删除空数组-【笔试】PHP核心技术笔试题,跳槽必备! https://www.wkzy.net/game/190162.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务