php面试题目更新中


发布时间:2022-07-19 23:04:54 | 来源: | 编辑整理:超管

 1、

$arr = array( 1,2,3,4 );

foreach( $arr as &$v ) {}

foreach($arr as $v) {}

打印$arr结果 : 1233


解析:

首先,在第一次foreach循环中,存在意义的只有最后一次循环,即:

$arr [ '3' ] = &$v;
因此,在第二次foreach循环中,$arr [ '3' ] 始终是 $v 的引用,即在该循环中的
最后一次结果,存在这种现象:
$arr [ '2' ] == 3;
$v = $arr [ '2' ];
$arr [ '3' ] = $v ;

//

在执行第一个使用引用的 foreach 时, 一开始, $v 指向 $arr[0] 的存储空间,空间内存储着 1 , foreach 结束时, $v 指向 $arr[3] 的存储空间,空间内存储着 4 。 下面要开始执行第二个 foreach 了,注意和第一个 foreach 不同, 第二个 foreach 没有使用引用,那么就是赋值方式, 即将 $arr 的值依次 赋值 给 $v 。 进行到第一个元素时,要将 $ar[0] 赋值给 $v 。 问题就在这里,由于刚刚执行完第一个 foreach, $v 不是一个新变量,而是已经存在的,指向 $arr[3] 的那个 引用 , 如此一来,对 $v 进行赋值的时候,就将 $arr[0] = 1 写入了 $arr[3] 的实际存储空间, 相当于对 $arr[3] 进行赋值,此时$arr[3] = 1。 依此类推,第二个 foreach 执行的结果, 就是数组的最后一个元素变成了倒数第二个元素的值,即$arr[3] = $arr[2] = 3。 // 原因就在于foreach中的引用在foreach完成后并没有释放,也就是说在第一个foreach中的引用一直保留着,当第一个foreach完成后,$v是指向$arr[4]的一个引用,

修改$v会修改$arr的值,再第二个foreach中,不断的将$arr中的值赋给$v,即第二个foreach执行中$arr的值在不断地变化,首先是第$arr[0]赋给$v,

$v修改$arr[4]的值,然后是$arr[1]。。。

一次下去,$arr每次改变的结果为: 1,2,3,1

1,2,3,2

1,2,3,3

1,2,3,3

因此出现最后的打印结果为: 1233


2、

$a = 20;
$a = &$b;
$a = 30;
unset($a);
var_dump($a,$b); //NULL int(30)


3、

$c = 20;
$c = &$d;
unset($c);
var_dump($c,$d); //NULL NULL 


4、

$e = 20;
$f = &$e;
$f = 30;
var_dump($e,$f); //int(30) int(30)


5、explain分析sql语句,表示实际决定使用索引的键是?

key


6、关闭php-fpm后访问网站报什么错?

502 Bad GateWay ,网关错误。


7、502 bad gateway产生错误的原因,怎么解决?

产生错误的原因:

连接超时,我们向服务器发送请求,由于服务器当前链接太多导致服务器方面无法给于正常的响应,产生此类报错。

怎么解决:

a.查看当前的PHP FastCGI进程数是否够用

netstat -anpo | grep "php-cgi" | wc -l

如果实际使用的"FastCGI进程数"接近预设的"FastCGI进程数",那么,说明"FastCGI进程数"不够用,需要增大。

b.部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间。

.....
http
{
......
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
......
}
c.PHP的内存不足,php.ini中memory_limit设低了会出错,修改了php.ini的memory_limit,重启nginx。


8、nginx报502、503的原因和解决方法?

在错误排查的时候,可以根据日志里状态码来诊断那个环节出现了问题。

  • 502:Bad Gateway 网关错误,如无空闲的php-fpm进程。
  • 503:Service Unavailable 服务不可用,如当前并发请求数达到nginx limit_conn上线。

  • 502=====
  • 检查php-fpm是否启动
  • 在 php.ini和 php-fpm.conf中分别有这样两个配置项:max_execution_time和 request_terminate_timeout。
  • 这两项都是用来配置一个 PHP 脚本的最大执行时间的。当超过这个时间时,PHP-FPM不只会终止脚本的执行,还会终止执行脚本的Worker进程。所以Nginx会发现与自己通信的连接断掉了,就会返回给客户端502错误。
  • 只需将这两项的值调大一些就可以让PHP脚本不会因为执行时间长而被终止了。request_terminate_timeout 可以覆盖 max_execution_time,所以如果不想改全局的php.ini,那只改PHP-FPM的配置就可以了。

503====

服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。(服务不可用)。一个 http 请求占用一个 php-fpm 进程,瞬时请求量过大时,没有足够的 php-fpm 进程去处理请求,就会返回 503 service unavailable。

或者,nginx 配置了频率限制,而 client 端又超过了配置的限制后就会收到 503 的响应。


9、

gbk编码下每个中文字符所占字节为2

utf-8编码下每个中文字符所占字节为3

strlen("hello你好世界"); //13(gbk),17(UTF-8)


10、

在字符串做运算得时候 如果开头有数字一直取到数字 后面得文字省略;如下:“33abc”+1 结果为:331;
开头没有: 如果PHP无法将字符串转换为整数,则假定它为0;如下:“one”+1 结果为:1;
另外±.都是一个等级 所以从左到右
连接运算符(“.”),它返回其左右参数连接后的字符串

echo 'Testing' . 1 + 2 . '34'; //234






=========================================

RabbitMQ


#######


什么是微服务?


微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分成一组小的服务,每个服务运行在其独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终价值。 服务之间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。


从技术维度来说:


微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事,从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动或销毁,拥有自己独立的数据库。


######


水平分表时怎么解决id冲突

参考:

https://segmentfault.com/q/1010000005881971

https://msd.misuland.com/pd/3255817997595450786

####

swoole长链接怎么判断是同一个用户

(1) 用户登录以后,将uid发送给swoole服务

(2 ) swoole服务将uid和fd配对,保存到redis/memache/mysql

(3-4) 用户通过对方的uid在redis/memache/mysql里查找配对的fd

(5) 用户将uid+fd值+消息发送给swoole

(6)swoole通过fd值将消息推送给用户

####


###

复合索引除了用在查询之外还可以用到什么地方

MySQL 会使用到索引的场景如下:


  1.根据一个条件快速的匹配到对应的行。


  2.缩小查询影响行数。如果一个查询字段有多个索引,MySQL 通常选择使用影响行数最小的索引(选择性最高的索引)。索引的选择性的计算 select count(distinct name) / count(*) from table; 


  3.对于组合索引,索引左边的列可以用索引前缀优化器来查询数据。例如,你有个三列的组合索引(col1,col2,col3) ,那么你可以使用索引查询(col1),(col1,col2),(col1,col2,col3)这三种组合的数据。有关于组合索引,详细请看另外一篇博客 MySQL 组合索引


  4.当和其他表进行连表查询的时候,如果进行判断的列的数据类型和大小相同,那么再这两个列上使用索引,可以让判断更加效率。例如:在如下查询中,给tb1.name和tb2.name添加索引会提升查询效率。 SELECT * FROM tb1, tb2 WHERE tb1. name = tb2. name 


  在这里,VARCHAR 与 CHAR 被认为是相同的类型。需要注意的是,如果要让索引生效,不仅需要类型一致,大小也必须一致。例如,VARCHAR(10) 和 CHAR(10) 大小相同可以使用索引,但 VARCHAR(10) 与 CHAR(15)就无法使用索引。


  5.查找索引列的 MIN() 或 MAX()值。


  6.通过索引列进行排序或分组,或者组合索引的左前缀进行排序或分组。


  7.查询索引列的内容。(如果只需要返回索引列的值,那么不需要查询数据行,直接从内存中读取检索值。这种情况称为覆盖索引)例如: SELECT key_part FROM table WHERE key_part=1 


  对于小型表或报表查询处理大多数或所有行的大型表的查询,索引不太重要。当查询需要访问大多数行时,顺序读取比通过索引更快。顺序读取可以最大限度地减少磁盘搜索,即使查询不需要所有行也是如此。只有数据较大,并且需要访问其中一部分数据的时候,索引才会显得比较重要。

###


mysql中间件

mycat等


=======================


为什么会走中间件

多少服务量才考虑做多服务

====

100w的订单数据怎么导出excel,速度多少?

https://www.it610.com/article/1296746056758927360.htm

====

大文件怎么下载

实现大文件下载的关键在于循环读取字节流

https://www.php.cn/php-weizijiaocheng-414593.html

=====

mysql建表原则

服务器502、503怎么处理

PHP引擎哪个好


自己怎么做一个PHP框架

Yii2的IOC反转

脚手架

魔术方法

=======

问:TP为什么可以用链式操作数据库

答:链式写法,我们知道,面向对象的方法,可以返回多种数据类型,当然,也可以返回对象自身,所以我们可以利用这个特性来实现。

$user->limit(10)->where("statys=1")->select();

那么这个语句就不难理解了。 方法执行后,传递对象给下个方法,以此类推。最后构造SQL语句模版串和执行拼接后的SQL语句。

====

问:TP操作数据库为什么不用重复实例化

答:php单例模式设计的数据库连接model类

为什么要使用单例模式

使用单例模式实现逻辑处理与数据库操作分离能很大提升mysql的sql处理能力,并且易于维护。

php单例模式(多次连接数据库只实例化一次) https://blog.csdn.net/leedaning/article/details/41869677

=====

很多文章,怎么搜索文章里的关键字

字段LIKE

fulltext

Sphinx

ElasticSearch,将mysql的数据放入es,php再调用es。

----

倒排索引,分词。对文章进行分词后,再根据关键词建立倒排索引。

搜索引擎三大过程,爬取内容,进行分词,建立倒排索引。

ElasticSearch将对搜索引擎的操作都封装成了restful的api,通过http请求就可以对其进行操作。同时他还考虑了海量数据,实现了分布式,是一个可以存储海量数据的分布式搜索引擎。

小史学完了 Elasticsearch,在笔记本上写下了如下记录:

反向索引又叫倒排索引,是根据文章内容中的关键字建立索引。

  • 搜索引擎原理就是建立反向索引。
  • Elasticsearch 在 Lucene 的基础上进行封装,实现了分布式搜索引擎。
  • Elasticsearch 中的索引、类型和文档的概念比较重要,类似于 MySQL 中的数据库、表和行。
  • Elasticsearch 也是 Master-slave 架构,也实现了数据的分片和备份。
  • Elasticsearch 一个典型应用就是 ELK 日志分析系统。

  • ----

=====

用户表分表,怎么通过手机号等字段定位到哪个表

分库分表首先是基于现有的业务量和未来的增量做出判断,比如拼多多这种日单量5000万的,半年数据得有百亿级别了,那都得分到4096张表了对吧,但是实际的操作是一样的,对于你们的业务分4096那就没有必要了,根据业务做出合理的选择。

对于基于shardingkey的查询我们可以很简单的解决,对于非shardingkey的查询可以通过落双份数据和数仓、ES的方案来解决,当然,如果分表后数据量很小的话,建好索引,扫全表查询其实也不是什么问题。

https://blog.csdn.net/weixin_39957461/article/details/110649414

======

swoole和wokerman的区别

swoole是使用C语言实现的socket通信框架,是php的扩展。workerman则是使用纯php实现的socket框架。二者进程模型上也存在很多的不同。

======

swoole怎么和app做心跳长链接

======

php设计模式

https://blog.csdn.net/jeremy_ke/article/details/89000003

https://blog.csdn.net/flitrue/article/details/52614599

======

linux命令

awk

======

php7、php8的新特性和改进

======

PSR4

======

删除字符串中的大写字母

======

xss、csrf、ssrf

======

in_array的时间复杂度

======

1000w身份证去重方法

======

  • 1.容器 循环依赖
  • 2.中间件原理
  • 3.事务相互等待
  • 4.aop
  • 5.composer包发布流程
  • 6.psr-2,psr-4
  • 7.微服务
  • 8.rpc
  • 9Yii框架的路由是怎么实现的?你知道动态路由吗?
    10.nginx的master-worker 和 php-fpm的master-worker有什么区别?
  • 11.抽象类中 抽象方法和普通方法的区别
  • 12.抽象类里面一定要有抽象方法吗 -不一定要有
  • 13.抽象类能不能继承接口 -可以继承
  • 14.接口是不是一定要定义方法 -不一定要有
  • 15.抽象类是不是一定要定义方法 -不一定要有
  • 16.trait有什么用,有什么优势,trait和普通父类继承区别在哪里
  • 17.分布式事务实际应用场景 真实案例
=======