Be-PHP-Senior-Programmer

做你想做的,做你不会做的,做需要你做的 - 怎么才能提高你自己?

!!! 超长预警 !!!

编码习惯优秀,符合PSR代码规范,熟悉PHP项目优化

项目怎么优化?

PHP 项目优化

  1. PHP代码级别
  2. PHP周边问题
  3. PHP语言自身

PHP执行顺序

  • 少写代码,多尝试使用 php 本身的功能,例如内置函数,常量;
  • 内置函数的效率也是有高低的, 要选择效率高的内置函数;
  • 尽量避免使用 php 的魔术方法;
  • 不要使用错误抑制符 @;
  • 合理使用内存, 使用 unset() 释放未使用的内存;
  • 尽量少使用正则表达式;
  • 避免在循环中进行计算,因为这样每次循环都会计算一次;
  • 不要使用 php 进行密集型的运算;
  • 请务必使用带引号的字符串做键值;

哪些地方需要优化?

换句话说: 哪些是影响PHP性能的可能性

  • 语法使用不当
  • 使用 PHP 做了它不擅长的事情
  • 通过 PHP 连接的服务有性能问题
  • PHP 语言本身的缺点或特点
    • 语法不严谨
    • 原生对多线程支持不好
    • 原生不支持对象常驻内存
  • PHP 周边环境问题
  • 网络问题
  • 一些未知因素

如何发现需要优化的地方?

使用性能分析工具

熟练使用HTML/CSS/JavaScript/Ajax/JQuery/XML等技术进行WEB应用开发

JSON和XML的区别?

  • XML定义: 扩展标记语言 (Extensible Markup Language, XML)

    • 优点:
      • 格式统一,符合标准;
      • 容易与其他系统进行远程交互,数据共享比较方便
    • 缺点:
      • XML文件庞大,文件格式复杂,传输占带宽;
      • 服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;
      • 客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码
      • 服务器端和客户端解析XML花费较多的资源和时间
  • JSON定义: JSON(JavaScript Object Notation)一种轻量级的数据交换格式

    • 优点:
      • 数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
      • 易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;
      • 支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;
      • 在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;
      • 因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。
    • 缺点:
      • 没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性

JavaScript和Jquery的异同?

  • 本质区别:
    • JS是直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型;
    • jQuery是一个兼容浏览器的JS库

熟悉PHP7, 熟悉设计模式和算法, 深入了解PHP的性能最优化和安全最大化

PHP7有哪些特性?比PHP5快的原因是什么?

熟悉哪些设计模式? 比如说? 应用场景?

PHP 完整实战 23 种设计模式 - LearnKu

  • 工厂模式

用工厂方法或类来生成对象,而不是在代码中直接 new Class(),替换new Class() 这种写法
好处是如果生成对象的方式发生改变,比如构造参数改变,直接修改工厂方法就行了

  • 单例模式

使某个类的对象只允许创建一个
比如数据库类,数据库的连接只需要连接一次

  • 注册模式

解决全局变量共享问题和交换对象
可以理解成用一个类来存放全局变量

  • 适配器模式

可以将截然不同的函数接口封装成统一的 API
比如多种数据库的连接方法不同,通过这个模式封装成统一的 API

  • 策略模式

将一组特定的行为和算法封装成类,以适应某些特定的上下文环境

  • 数据对象映射模式

将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作
例子:ORM

  • 迭代器模式

在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素
实现 Iterator 接口即可

如何使PHP性能最优化?

任何提及优化的都不是一两句能说清楚的,所以这里提供一些文章自行查看.

安全最大化? 那有些什么安全问题? 如何解决?

  • [PHP 安全问题入门:10 个常见安全问题 + 实例讲解](PHP 安全问题入门:10 个常见安全问题 + 实例讲解)

PHP安全问题?

  • SQL注入:

    • 转义用户输入的数据
    • 使用封装好的语句
  • XSS:

    • 坚决不要相信用户的任何输入,并过滤掉输入中的所有特殊字符
    • 另外设置 Cookie 时,如果无需 JS 读取的话,请必须设置为 “HTTP ONLY”。这个设置可以令 JavaScript 无法读取 PHP 端种的 Cookie。

XSS 又叫 CSS (Cross Site Script) ,跨站脚本攻击

  • XSRF/CSRF
    • 最常用的防御方法是生成一个 CSRF 令牌加密安全字符串,一般称其为 Token,并将 Token 存储于 Cookie 或者 Session 中。

CSRF 是跨站请求伪造的缩写,它是攻击者通过一些技术手段欺骗用户去访问曾经认证过的网站并运行一些操作。

  • LFI
    • 要防御此类攻击,你必须仔细考虑允许用户输入的类型,并删除可能有害的字符,如输入字符中的 “.” “/” “\”。

LFI (本地文件包含) 是一个用户未经验证从磁盘读取文件的漏洞。

  • 不充分的密码哈希
    • 为密码哈希加盐(Salt),加盐处理避免了两个同样的密码会产生同样哈希的问题
    • 新版的 PHP 中也自带了安全的密码哈希函数 password_hash ,此函数已经包含了加盐处理。对应的密码验证函数为 password_verify 用来检测密码是否正确。password_verify 还可有效防止 时序攻击.

扎实的SQL知识,熟练使用MySQL,熟悉MySQL优化,熟悉Redis、MongoDB等NoSQL数据库

什么是NoSQL?

对不同于传统的关系数据库的数据库管理系统的统称,泛指非关系型的数据库.

  • NoSQL的四大种类
临时性键值存储 永久性键值存储 面向文档存储 面向列的存储
Memcached Tokyo Tyrant MongoDB Cassandra
Redis Flare CouchDB Hbase
Redis

MySQL如何优化? 从哪些方面优化?

MySQL 优化
MySQL SQL优化
MySQL 大表优化

Redis和Memcached的异同? 优劣势?

  • Redis

    • 优点:
      • 读写性能优异
      • 支持数据持久化,支持AOF和RDB两种持久化方式
      • 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
      • 数据结构丰富
    • 缺点:
      • Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
      • 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
      • Redis的主从复制采用全量复制,复制过程中主机会fork出一个子进程对内存做一份快照,并将子进程的内存快照保存为文件发送给从机,这一过程需要确保主机有足够多的空余内存。
      • Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费
  • Memcached

    • 优点:
      • 部分容灾: memcache使用一致性哈希算法,处理”雪崩”问题
      • 容量问题
      • 均衡请求
    • 缺点:
      • 不能持久化存储
      • 集群数据没有复制和同步机制

MongoDB的应用场景?

MongoDB 是一个高性能,开源,无模式的文档型数据库,开发语言是C++。它在许多场景下可用于替代统的关系型数据库或键/值存储方式。
什么场景应该用 MongoDB ?
MongoDB 使用场景及运维管理问题交流探讨
MongoDB、Hbase、Redis等NoSQL优劣势、应用场景

  • MongoDB
    • 优点:
      • 更高的写负载,MongoDB拥有更高的插入速度。
      • 处理很大的规模的单表,当数据表太大的时候可以很容易的分割表。
      • 高可用性,设置M-S不仅方便而且很快,MongoDB还可以快速、安全及自动化的实现节点 (数据中心)故障转移。
      • 快速的查询,MongoDB支持二维空间索引,比如管道,因此可以快速及精确的从指定位置 获取数据。
      • 非结构化数据的爆发增长,增加列在有些情况下可能锁定整个数据库,或者增加负载从而 导致性能下降,由于MongoDB的弱数据结构模式,添加1个新字段不会对旧表格有任何影响, 整个过程会非常快速。
    • 缺点
      • 不支持事务。
      • MongoDB占用空间过大 。
      • MongoDB没有成熟的维护工具。

记忆最深刻: 优化过什么SQL?

自由发挥…

熟悉B2B/B2C/O2O等网站性能优化,熟练掌握MySQL主从开发、索引优化、查询优化和存储优化,以及PHP缓存、静态化等技术

什么是B2B/B2C/O2O ?

  • B2B - 经济组织对经济组织
  • B2C - 经济组织对消费者
  • O2O - 网上与网下相结合

索引如何优化? 什么场景需要优化?

MySQL 索引优化全攻略

常见的数据库集群架构如何?

一主多从,主从同步,读写分离.

主从复制的原理是什么? 主服务器出问题 从如何保证业务正常?

MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。
深度探索MySQL主从复制原理

  • 数据库主库和从库不一致,常见有这么几种优化方案:
    • 业务可以接受,系统不优化
    • 强制读主,高可用主库,用缓存提高读性能
    • 在cache里记录哪些记录发生过写请求,来路由读主还是读从

查询如何优化?

MySql查询性能优化

  • 避免向数据库请求不需要的数据

避免使用SELECT *这种方式进行查询,应该只返回需要的列。

  • 查询数据的方式

查询数据的方式有全表扫描、索引扫描、范围扫描、唯一索引查询、常数引用等。这些查询方式,速度从慢到快,扫描的行数也是从多到少。可以通过EXPLAIN语句中的type列反应查询采用的是哪种方式。

  • 分解大的查询

可以将一个大查询切分成多个小查询执行,每个小查询只完成整个查询任务的一小部分,每次只返回一小部分结果
删除旧的数据是一个很好的例子。

  • 优化MIN()和MAX()

添加索引可以优化MIN()和MAX()表达式。例如,要找到某一列的最小值,只需要查询对应B-Tree索引的最左端的记录即可。类似的,如果要查询列中的最大值,也只需要读取B-Tree索引的最后一条记录。

  • 用IN()取代OR

在MySql中,IN()先将自己列表中的数据进行排序,然后通过二分查找的方式确定列的值是否在IN()的列表中,这个时间复杂度是O(logn)。如果换成OR操作,则时间复杂度是O(n)。

  • 优化关联查询

优化关联查询,要确保ON或者USING子句中的列上有索引,并且在建立索引时需要考虑到关联的顺序。通常来说,只需要在关联顺序中的第二个表的相应列上创建索引
此外,确保任何的GROUP BY和ORDER BY中的表达式只涉及到一个表中的列,这样才能使用索引来优化这个过程。

  • 临时表的概念

当遇到子查询时,先执行子查询并将结果放到一个临时表中,然后再将这个临时表当做一个普通表对待。
MySql的临时表是没有任何索引的,在编写复杂的子查询和关联查询的时候需要注意这一点。
临时表也叫派生表。

  • 排序优化

应该尽量让MySql使用索引进行排序。当不能使用索引生成排序结果的时候,MySql需要自己进行排序。

  • 子查询优化

MySql的子查询实现的非常糟糕。最糟糕的一类查询是WHERE条件中包含IN()的子查询语句。
应该尽可能用关联替换子查询,可以提高查询效率。

  • 优化COUNT()查询

当使用COUNT(*)时,统计的是行数,它会忽略所有的列而直接统计所有的行数。而在括号中指定了一个列的话,则统计的是这个列上值不为NULL的个数。
可以考虑使用索引覆盖扫描或增加汇总表对COUNT()进行优化。

熟悉Swoole,深入其原理,有Swoole实际项目研发经验

swoole的优势? 实际应用过吗?

PHP-FPM vs Swoole

  • Swoole 加速的原理
    • 由 Reactor(epoll 的 IO 复用方式)负责监听 Socket 句柄的事件变化,解决高并发问题
    • 通过内存常驻的方式节省 PHP 代码初始化的时间,在使用笨重的框架时,用 swoole 加速效果是非常明显的。

PHP-FPM VS Swoole

  • PHP-FPM

    • Master 主进程 / Worker 多进程模式
    • 启动 Master,通过 FastCGI 协议监听来自 Nginx 传输的请求。
    • 每个 Worker 进程只对应一个连接,用于执行完整的 PHP 代码。
    • PHP 代码执行完毕,占用的内存会全部销毁,下一次请求需要重新再进行初始化等各种繁琐的操作。
    • 只用于 HTTP Server。
  • Swoole

    • Master 主进程(由多个 Reactor 线程组成)/ Worker 多进程(或多线程)模式
    • 启动 Master,初始化 PHP 代码,由 Reactor 监听 Socket 句柄的事件变化。
    • Reactor 主线程负责子多线程的均衡问题,Manager 进程管理 Worker 多进程,包括 TaskWorker 的进程。
    • 每个 Worker 接受来自 Reactor 的请求,只需要执行回调函数部分的 PHP 代码。
    • 只在 Master 启动时执行一遍 PHP 初始化代码,Master 进入监听状态,并不会结束进程。
    • 不仅可以用于 HTTP Server,还可以建立 TCP 连接、WebSocket 连接。

swoole的协程实现原理?

4.0 协程实现原理

  • LaravelS / Swift / 或者其他的Swoole实际开发经验?

熟悉ThinkPHP/Laravel/Lumen等框架

Laravel 门面/自动注入/依赖反转 如何实现?

依赖注入,控制翻转,反射各个概念的理解和使用

  • 框架的 CURD/中间件/Auth/Restful API

  • 这几个框架的 JWT/Token/Passport 相关问题?

熟悉缓存技术(Redis,Memcached)、消息队列(Resque,RabbitMQ)等领域;

  • Redis有哪些数据类型?

  • 一般用哪种类型? 为什么? 时间复杂度?

  • Redis做一个热门榜单? 伪代码如何实现?

  • 你使用过哪些消息队列? 什么应用场景? 秒杀需要注意什么?

  • 缓存穿透/缓存雪崩如何解决?

  • 如何实现消息队列?

熟悉PHP常用的SPL库,并合理应用到日常开发中;

https://www.php.net/manual/zh/book.spl.php

  • 用过哪些PHP基本扩展?

  • 用过哪些PHP SPL库? 优劣势是什么?

  • 开发中用过哪些?

有大型分布式、高并发、高负载、高可用系统设计、开发和调优经验;

  • 什么是分布式? 如何做到分布式?

  • 高并发和高负载 怎么处理? 怎么优化?

  • 处理过最多的qps是多少? 怎么设计的? 怎么处理库存过度的问题?

熟悉PHP的多进程模型(PCNTL),熟悉PHP的协程模型,并合理应用到日常开发中;

  • 进程/线程/协程的定义? 区别?

  • PHP原生如何实现多进程? 缺点是什么?

  • PHP协程模型怎么实现? 如何实现PHP的协程?

熟悉Linux系统工具的使用(如top,strace,perf,vmstat,sar,tcpdump),能够快速找出系统瓶颈并调优;

  • Linux 常用命令? 作用是?

熟悉Sed/Awk等Linux 文本工具的使用,结合shell构建复杂的系统工具;

  • shell命令的使用? 完成一个自动发布的shell命令?

  • 使用sed/awk 查询文本?

熟悉svn、git代码管理;

  • svn/git 如何实现紧急发布?

  • svn/git 如何实现多分支协同开发?

  • 如何搭建git server ?

熟悉面向对象编程,熟悉常用设计模式,熟悉 S.O.L.I.D 原则;

https://zh.wikipedia.org/wiki/SOLID_(%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%AE%BE%E8%AE%A1)

  • 什么是S.O.L.I.D?

  • 使用过哪些设计模式?

对分布式系统、微服务、高并发、高集群有了解;

  • 什么是微服务? 优劣势?

  • 如何搭建集群? 常见问题怎么解决?

  • 如何搭建分布式系统?

熟悉MySQL建表、慢查询分析、SQL优化、索引调优、分表分库分区;

  • 什么是慢查询? 如何开启? 怎么使用binlog日志恢复数据库?

  • 从哪些进行SQL优化?

  • 索引的类型有哪些? 具体应用场景? 如何优化索引?

  • B Tree 和 B+Tree 的区别?

  • 怎么分表分库分区? 何时需要? 优缺点是什么?

  • MySQL的锁有哪些? 具体使用?

  • MySQL 引擎的选择? 事务的处理? 大表查询如何优化?

有丰富的后台系统开发经验,有丰富的数据处理、统计相关经验;

  • LaravelAdmin / FastAdmin ?

  • 实现大表统计? 大数据导表?

熟悉微信公众号、支付宝服务窗的接口及平台特性,有相关经验;

  • 实现微信登录/授权/支付?

  • 实现支付宝支付?

  • 实现一些其他第三方?

关键词

PHP MySQL Linux NoSQL Redis Memcached MongoDb SQL

Laravel Lumen ThinkPHP3 ThinkPHP5 FuelPHP Swoole Workerman Laravel admin FastAdmin

HTML CSS JavaScript Ajax Pjax Jquery XML JSON

Nginx Shell RabbitMQ SPL PSR MVC OOP

top strace perf vmstat sar tcpdump Sed Awk

svn git docker Vagrant

dingo Restful API CORS JWT

VueJs WVVM Github GitLab ShowDoc eoLinker

dsp ssp Lua Symfony Yaf

ElasticSearch IK Go-MySQL-Elasticsearch

reliese annotations PHPUnit Composer

Python Go Ruby Lua Node.js Rust React

AB XHProf vld XDebug

参考

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2023 Keep It Simple And Stupid All Rights Reserved.

访客数 : | 访问量 :