面试准备指南:电商、数据库、PHP函数、SQL优化等常见问题解析

2025-01-15
来源:网络整理

以下都是转自别人的总结,我觉得答案都不错:

面试前,多了解一下该公司的信息。可以看看面试公司主要是做什么的。电商、数据库、PHP函数、SQL优化、接口等等经常被问到,而且都是必问的问题。其中有一些问题是从网上整理出来的,我个人觉得答案还不错。

1.请自我介绍一下?

答:根据自己的情况回答

2.您在公司负责哪些项目?

答:由于我们公司是外包公司,所以很多项目都是交叉进行的。我做过论坛、微信、商场。我主要负责的模块包括……;

3.你为什么来上海?

答:根据自己的情况回答,最好如实回答。

4、现在上海比较流行什么框架?

答:根据您所在地区回答;

5.你做了哪些模块?

答:登录注册、商品管理、购物车模块、订单管理等;

6.你们公司使用什么框架?

答:我们公司使用TP框架,使用++PHP进行开发,因为TP框架是一个免费、开源、轻量级的PHP开发框架,而且是中国人自己开发的,国内也用的。比较多,各种信息也比较齐全;

7.什么是mvc?他们之间是什么关系?

答:MVC是一种开发模式,主要分为三个部分:M(),即模型,负责数据的操作; V(view),即视图,负责前后端的显示; C(),即控制器负责业务逻辑;

客户请求项目的控制者。如果执行过程中需要数据,控制器会从模型中获取数据,然后通过视图显示获取到的数据;

8.什么是面向对象编程?

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

OOP具有三大特点:

1、封装:又称信息隐藏,是指将一个类的使用和实现分离,只留下一些接口和方法与外界连接,或者只暴露一些方法供开发人员使用。因此,开发者只需要关注这个类是如何使用的,而不需要关注它的具体实现过程。这样可以实现MVC的分工协作,有效避免程序之间的相互依赖,实现代码模块之间的松耦合。

2、继承:子类自动继承父类的属性和方法,并且可以添加新的属性和方法或者重写一些属性和方法。继承提高了代码的可重用性。 PHP只支持单继承,即一个子类只能有一个父类。

3、多态性:子类继承了父类的属性和方法,并重写了部分方法。因此,虽然多个子类具有相同的方法,但是这些子类实例化的对象在调用这些相同的方法后却可以获得完全不同的结果。这种技术就是多态性。多态性提高了软件的灵活性。

1. 易于维护

采用面向对象思想设计的结构,可读性强。由于继承的存在,即使需求发生变化,维护也只会在局部模块,因此维护非常方便且成本低廉。

2. 高品质

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

3、效率高

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

4. 易于扩展

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

9. 它是什么以及它有什么作用?

答案1:它是一个用PHP编写的模板引擎。它也是业界最著名的PHP模板引擎之一。它将逻辑代码和外部显示分离,提供了一种易于管理和使用的方法,将php逻辑代码与html代码混合分离

答案2:它是PHP中最著名的引擎框架之一。我们公司使用的是TP框架,里面已经封装了模板,所以没有单独使用。

答案3:它是一个模板引擎。最明显的是它可以缓存模板。一般来说,模板就是制作一个静态页面,然后用任意分隔符在里面剪切一些动态部分,然后用PHP打开模板文件,替换分隔符中的值,然后输出,你可以看看里面的零件。

设置缓存参数后,模板第一次运行时会被打开,当PHP替换里面的值时,读取到的HTML和PHP部分会重新生成一个临时PHP文件,这样就不需要打开模板了每次都是模板。再次阅读 html。如果修改了模板,只需刷新即可。

10.TP框架有哪些优势?

答:该框架是PHP中最常见的框架之一,也是目前市场上的主流框架。它是一个免费开源、快速、简单的面向对象的轻量级PHP开发框架,为敏捷WEB应用开发、简化企业应用开发而生。自创立以来,一直秉承简约实用的设计原则。在保持卓越性能和最少代码的同时,也注重易用性。它具有许多原有的功能和特性,并在易用性、可扩展性和性能方面不断优化和改进。现已成长为国内最领先、最具影响力的WEB应用开发框架。众多典型案例保证其能够稳定用于商业和门户级开发。

11.TP有什么特点?

答:1.多表查询非常方便。只需几行代码就可以完成多个表的关联操作。

2、集成模板,实现前后端分离

3.支持多种缓存技术,技术支持特别好

4、命名标准、模型、视图、控制器严格遵循命名规则,通过命名一一对应。

5.支持多种url模式

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

7.支持应用程序扩展、类库扩展、驱动程序扩展等。

12.TP框架中有哪些大写字母函数?

U:url的组装

A:内部实例化控制器

S:缓存处理

R:调用控制器的操作方法

D:实例化自定义模型类

M:实例化基础模型类

一:获取参数

L:设置或获取当前语言

C:设置或获取、保存配置

13.请介绍一下框架?

答:框架的设计思想比较先进,非常适合应用各种开发模式。作为一个框架,它已经为你准备好了一切。这是 PHP 的未来。没有它,PHP肯定会衰落。

该框架最大的特点和优秀之处在于它集成了PHP比较新的特性,以及各种设计模式、Ioc模式、依赖注入等。

14.有什么特点?

答案1:

1、强大的休息功能:通过简单的回调函数即可调用,快速绑定和

2.:命令行工具,很多手动任务可以自动化

3.可继承模板简化视图开发和管理

4. 模板:渲染速度更快

5.ORM操作数据库

6.:管理数据库和版本控制

7.测试功能也很强大

也是一大亮点

答案2:框架引入了门面、依赖注入、Ioc模式以及各种设计模式等。

15、简述数据库的优化?

答:数据库优化可以从四个方面进行优化:

1、结构层:Web服务器采用负载均衡服务器,服务器采用主从复制,读写分离

2、从存储层:使用合适的存储引擎,采用三种范式

3、从设计层面:使用分区来分离表和索引,表字段使用适当的字段属性,适当使用逆范式,启用缓存

4. SQL语句层:当结果相同时,使用高效、快速且节省资源的SQL语句执行。

16.如何解决异常处理?

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

解决异常:使用函数获取异常(也可以使用try()和()函数),然后使用r()函数设置默认的异常处理程序,()函数执行它。执行机制是PHP需要调用该函数将其转移到内存中,然后当页面上的所有PHP语句都执行完毕后调用该函数。

17.说说前端?

答:我在工作中处理前端功能时,一般都是使用ajax向后台请求数据,然后返回数据显示在前端页面上。我从来没有完全自己完成过 HTML 和 CSS 样式。如果公司确实有这样的需求,我可能会找一些前端模板或者前端框架,比如h-ui等。

18. 权限管理(RBAC)的实施?

答:1、首先创建用户表:id name auto(保存格式:-)

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

19. 支付功能的实现?

回答:

20、如何保证促销产品不会超卖?

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

第一种选择:①下单前,我们判断促销产品的数量是否足够。如果不够,我们不允许下订单。在改变库存的时候,我们加了一个条件,只改变库存大于0的产品的库存,当时我们用ab进行压力测试。当并发数超过500、访问量超过2000时,仍然会出现超卖情况。所以我们否认了。

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

第三种方案:③使用文件锁来实现。当用户抓取促销品时,首先触发文件锁以防止其他用户进入。用户抢到促销品后,文件锁被解锁,允许其他用户操作。这样可以解决超卖问题,但是会给文件带来大量的I/O开销。

最后我们用队列来实现。要促销的产品数量存储在队列中。每当用户抢到促销产品时,就会从队列中删除一条数据,以确保该产品不会超售。这样操作起来非常方便,而且效率极高。最终我们采用了这个方法来实现。

21.商城限时抢购是否实行?

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

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

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

对于第一个问题,已经很容易想到使用缓存来处理抢购,避免直接操作数据库,比如使用。对于第二个问题,我们可以使用队列来完成,将要销售的产品立即放入队列中。因为pop操作是原子的,即使很多用户同时到达,也会按顺序执行。文件锁和事务在高并发下表现更好。下降速度非常快。当然,还得考虑其他方面,比如把抢购页面做成静态的,通过ajax调用接口。还可能存在用户多次抓取的情况。这种情况下需要添加排队队列和抢购。结果队列和库存队列。高并发情况下,将用户放入排队队列,使用线程循环将用户移出排队队列,并判断该用户是否已在抢购结果队列中。如果是,则已被抢购,否则未抢购,库存减1,写入数据库。将用户放入结果队列。

22、购物车是如何实现的?

答:购物车相当于真正超市里的购物车。区别在于,一种是实体购物车,另一种是虚拟购物车。用户可以在购物网站的不同页面之间跳转来购买自己喜欢的产品。当您点击购买时,该产品将自动保存在您的购物车中。重复购买后,所有选定的产品都会放入购物车。购物车统一到收银台,这也让顾客体验到现实生活中购物的感觉。服务器跟踪每个用户的操作,以确保每件商品在结帐时都有其所有者。

主要涉及以下几点:

1. 将产品添加到购物车并下订单。

2.删除购物车中已订购的商品

3.修改购物车中某本书的订单数量

4.清空购物车

5.显示购物车中商品的清单、数量和价格

实现购物车的关键是服务器识别每个用户并与他们保持联系。然而,HTTP协议是一种“无状态()”协议,因此服务器无法记住谁在购买该产品。当将产品添加到购物车时,服务器不知道购物车中原来有什么,导致用户位于不同的页面。购物车在多次跳跃时无法“随身携带”,这给购物车的实施造成了一定的困难。

目前购物车主要是通过或者结合数据库来实现的。我们来分析一下它们的机制和功能。

23、使用先进先出队列消息时要注意什么?

答:列表通常用来实现队列操作。这有一个小的限制。所有任务统一先进先出。如果你想优先处理某项任务,这并不容易处理。这就需要给予队列优先级。概念,我们可以优先考虑高级任务。有几种方法可以实现这一目标:

1)单列表实现:队列的正常操作是左进右出(,rpop)。为了先处理高优先级的任务,遇到高级别的任务时,可以直接跳入队列,直接放入队列的头部()。这样,当你从队列的头部(右)获取一个任务时,你就得到了高优先级的任务(rpop)

2)使用两个队列,一个普通队列和一个高级队列,根据任务的级别放入不同的队列。任务的获取也非常简单。该命令可以按顺序从多个队列中取值,并且会按照给定的方式取值。依次查看key,在找到的第一个非空列表末尾弹出一个元素,>0

作为高优先级任务队列

作为普通任务队列

这样先处理高优先级任务,没有高优先级任务时,再获取普通任务。

方法一最简单,但实际应用比较有限。方法3可以实现复杂的优先级,但实现复杂,不利于维护。

方法2是推荐的用法,最适合实际应用。

24.您遇到过哪些问题以及如何解决的?

答:在我负责的B2B电商项目中,我负责的是订单模块。由于顾客同时从多个商家选择商品,最终生成了一份订单。结果我们平台在给商家结算的时候出现了未知的错误。比较费应该支付给哪个商家?经过我们组的讨论,需要涉及到订单拆分,也就是说,用户点击支付后,如果有多个商品,且不是来自同一家店铺,就必须使用订单拆分。例如,如果有两个商品,并且它们不是来自同一家商店,则会将它们放在原来的订单号下,生成两个子订单号,并修改订单表中两个商品的订单号。最终实现了货物的配送管理,解决了我们的问题。

我认为开发过程中遇到的问题只有两个。一是技术层面。我想,只要有毅力、有热情,就没有解决不了的问题。另一个问题是沟通。无论何时何地,沟通都是最重要的,尤其是我们在做开发的时候。如果沟通不好,就会影响整个项目的进度。我是一个非常善于交际的人,所以这一点也很重要。没什么大不了的。

25. 用户订单如何处理?

答:判断用户是否登录,未登录则无法下单。登录后,您可以下订单并生成唯一的订单号。此时订单状态为未付款。

26、电商登录是如何实现的?

答:分为普通登录和第三方登录。我们主要说一下第三方登录。第三方登录主要使用协议。我就以QQ的第三方登录为例来说明一下:当用户在我们的网站上请求第三方登录QQ时,我们的网站会引导用户跳转到QQ登录授权界面。当用户输入QQ和密码并成功登录后,会自动跳转回本站设置的回调页面,并带有code参数。然后你使用该代码再次请求QQ授权页面,你就可以从中获取一个( )。 ),通过这个,我们可以调用QQ提供的接口,比如获取,获取用户的基本信息。获取之后,我们需要获取用户的授权信息,并绑定到我们平台的普通用户。这样无论是普通用户登录还是第三方登录用户都可以实现登录。

27. 接口安全如何处理?

答:我们当时就是这样做的,使用HTTP POST方法对固定参数+附加参数进行数字签名,使用md5加密。例如:我想通过标题获取一条信息,在客户端使用信息标题+日期+双方约定的密钥,通过m d5加密生成签名(sign),然后传递给服务器作为参数。服务器端也采用同样的方法进行验证。接收到的符号与我们通过算法计算出的值相同。这证明是正常的接口请求。我们才会返回对应的接口数据。

28. 使用什么技术来发送短信?它在哪里被称为?

答:我主要使用第三方短信接口。我在申请接口的时候配置了相应的信息,然后在我们网站上需要短信验证的地方调用。我们通常在用户注册时使用它。

29.您在工作中遇到什么困难?

答:总体来说:我在工作中主要遇到以下难以处理的问题:

① 以前工作的时候,我发现经常有一些临时的需求打乱了我的计划。有时任务还没有完成,我还得做其他任务。到最后,大大小小的事情还有很多。但还没有完成得很好。稍后我会总结一下。我会优先考虑这些。遇到临时需求时,我会按照优先级重新布局现有任务和临时任务,保证规定时间内的效率。完成高优先级任务。

②在做项目需求时,如果遇到理解能力差的人,沟通时很容易生气,影响情绪。最终,你将无法达到所需的结果。从现在开始,每当遇到这种情况时,我通常会使用纸质的、更直观的东西,以双方都同意和理解的方式进行沟通,这样就减少了以后很多不必要的麻烦。大家都知道,对于程序员来说,改变需求是一件非常痛苦的事情,所以早期的沟通非常重要。

③还有一点,我以前的领导不太懂技术,所以每次有新的需求出来,总是要求我们在短时间内完成。如果完成不了,就会被怀疑是我们能力有问题。当然,每个领导都希望自己的员工能够尽快完成任务,降低成本,提高效率。这时,我会细化我们的需求,列出重点和难点,制定时间计划,并耐心地与领导沟通项目每个点的重要性和所花费的时间比例,确保在这个计划中完成时间点内保质保量完成任务。渐渐地,我得到了领导的认可。事实上,领导者并非一味不讲道理。只要计划好,以最低的成本获得最高的价值,大家都很容易理解。

30、用户如何在不登录的情况下将商品添加到购物车?

答:用户无需登录即可在其中保存自己想要购买的产品信息(如产品ID、产品价格、产品、购买数量等关键数据),将内容保存到数据库并清除数据。

31.你写过接口吗?你如何定义一个接口?

答:我已经写了。接口有两种类型:一种是数据接口,另一种是应用程序接口。

数据接口:是比抽象类更抽象的某种“结构”——它实际上不是类,而是像类一样的某种语法结构。它是一个结构规范,指定了我们的类的定义格式。一般在团队比较大、分支较多的情况下使用。

应用接口:API()是外部访问数据的入口

我主要从事APP开发中接口的编写。客户需要什么样的数据,我们就会为他们提供相应的数据。数据以json/xml格式返回,并附有相应的接口文档。

32. sku库存减少了吗?

答案:SKU = Unit(库存单位)

即库存进出的计量单位可以是单元、箱、托盘等。SKU是区分单一产品的库存单位。

它最常用于服装和鞋类产品。例如纺织品中的一个SKU通常代表:规格、颜色、款式。

设计表的时候,不仅有产品表,产品表中还有总库存。我们还需要涉及一个SKU表,其中有SKU库存和单价字段。用户每次购买产品,实际上都是购买SKU。产品,下单成功后,应根据所购买产品的唯一SKU号减少相应的SKU库存。当然,产品主表中存储的是产品的总库存,总库存中的库存也需要减少。

33、如何设置库存?

答:库存分为商品总库存和SKU库存。通常,商品总库存是 SKU 库存的总和。一般情况下,在商城后台对商品设置最大库存和最小库存后,将当前库存数量与最大和最小进行比较。如果库存超出或低于库存,都会以报表的形式体现出来,方便用户掌握商品的库存溢缺情况。状态和数量。

34、如何保证订单表和库存表数据的一致性?

答:在电商系统中,订单成功生成后,相应的库存减少是正常的,必须保证两者的一致性。但是,有时会因为某些原因,比如程序逻辑问题、并发问题等,导致下单成功但库存没有减少。我们不允许这种情况发生。而这里的交易正好可以解决这个问题。首先,我们要选择数据库的存储引擎。交易规定,只有当订单完成且相应库存减少时,才允许提交交易。 ,否则事务将回滚以保证数据一致性。

35、O2O用户在C端下单时,如何保证BA端数据一致?

答:O2O是一种线上线下结合的模式。 O2O模式奉行“网上支付+实体店消费”的消费模式,即消费者在网上下单并完成支付后,凭消费券到实体店消费。 O2O模式将商户信息和支付流程放在线上,而商品和服务的兑换则放在线下。也就是说,O2O模式适用于快递无法配送的有形产品。数据一致性问题是O2O行业最常见的问题。我们可以类似于数据库的主从复制思想来解决这个问题。 O2O有一个供应商系统,类似于主服务器。 C端(从服务器)下单次将数据同步更新到供应商系统,b和a实时从供应商系统拉取数据进行同步,比如使用定时任务定期拉取数据同步。

36. 回显'1'.(2)+3

如上图所示。为什么结果是511?

这个结果的计算分三步来理解:

第一个计算是右侧的(2)+3。你可以直接理解为(2+3),结果是5。它是一个返回值始终为1的函数。

第二步是echo '1'.('')(返回值为1),所以结果将为11。

第三步,将之前计算的结果连接起来,最后输出。结果是511。

同样,它可以解释为什么 echo '2' 的结果。 (2) + 3;是 521,

回显'1'。 ('2') + 3;结果是214

分享