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 的响应。
gbk编码下每个中文字符所占字节为2
utf-8编码下每个中文字符所占字节为3
strlen("hello你好世界"); //13(gbk),17(UTF-8)
10、
=========================================
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.分布式事务实际应用场景 真实案例