PHP 高频追问

1. 你为什么核心业务更喜欢用 PHP,而不是全部换成 Go?

推荐回答

我不会从语言好坏去看,而是从业务特点看。像复杂业务规则、后台配置、状态流转、和产品运营频繁协作这类场景,PHP 的开发效率和团队协作成本更有优势。 Go 我也会用,但我更倾向把它放在实时链路、高并发服务、消费者和批处理这类更适合服务化的场景。

你可以挂回项目

  • 海外业务平台:订阅、支付、退款、后台规则更适合 PHP
  • 推广 ROI 线:后台和配置用 PHP,实时链路和消费者用 Go

2. PHP 做复杂业务时,你最看重什么?

推荐回答

我最看重三件事:

  1. 业务状态模型是不是清楚
  2. 边界和异常流是不是提前想清楚
  3. 后续扩展和治理是不是可控

很多人把 PHP 理解成“写接口快”,但我更关心它能不能把复杂规则真正稳定落地。


3. PHP-FPM 打满了你怎么排查?

推荐回答

我会先分层看:

  1. 是业务慢还是依赖慢
  2. 是慢 SQL 还是外部接口超时
  3. 是偶发峰值还是持续打满
  4. 有没有缓存命中不足或某些热点请求

如果是 PHP-FPM 本身打满,我会结合慢日志、请求分布、数据库和外部依赖去看,而不是只调大 worker 数。 调参数只能缓解,真正要解决还是得回到慢链路本身。


4. PHP 项目怎么做依赖注入和解耦?

推荐回答

我的理解是依赖注入不是为了框架感,而是为了把业务逻辑和具体实现解耦。 比如支付、消息通知、三方渠道适配、模型能力接入,这些都适合通过接口和容器做抽象,这样后面扩展新渠道或替换实现成本更低。

项目里怎么讲

你可以讲不同支付渠道、不同广告渠道、不同 AI 能力接入都适合走这套抽象。


5. PHP 怎么做高并发?

推荐回答

PHP 本身不是高并发问题的全部答案。真正做高并发时,我更关注:

  • 缓存
  • 异步解耦
  • 限流
  • 幂等
  • 热点隔离
  • 把不适合 PHP 同步处理的部分拆到 Go / MQ / 后台任务

也就是说,PHP 在复杂业务主链路里完全可以很好用,但不能把所有高峰压力都堆在同步请求里。


6. Swoole 和传统 PHP-FPM 你怎么选?

推荐回答

如果是典型后台和复杂业务系统,我更习惯传统 PHP-FPM,因为模型清晰、治理成熟。 如果场景是长连接、WebSocket、协程并发、实时流式处理,Swoole 更有价值。 我会根据场景选,不会为了“更快”就盲目上 Swoole。


7. 你怎么避免 PHP 项目越做越乱?

推荐回答

我会重点抓这几个点:

  • 模块边界清楚
  • 状态定义清楚
  • 统一返回和错误码
  • 关键逻辑服务化
  • 日志和监控先补齐
  • 公共能力抽象但不过度设计

业务复杂时,最怕的不是代码多,而是规则散、状态乱、异常全靠猜。


8. PHP 做支付 / 订阅链路最难的是什么?

推荐回答

不是把回调接上,而是状态一致性。 比如支付成功、退款、恢复订阅、回调乱序、重复通知、权益同步,这些都可能同时影响同一笔业务。 我一般会先把支付状态、订阅状态、权益状态拆开,再定义状态机,然后通过事件表唯一键、事务、幂等、副作用去重和对账补偿把链路兜住。

如果继续追问“分布式锁够不够”

我的回答会是: 不够。分布式锁解决的是“同一时刻别并发改”,数据库幂等解决的是“这个事件昨天处理过,今天重试来了别再生效”。 真正稳的方案通常是状态机 + 数据库幂等 + 可选分布式锁 + 补偿任务。


9. PHP 里你怎么做代码可维护性?

推荐回答

我比较重视的是:

  • 业务规则不要散在 controller 里
  • 复杂链路下沉到 service / domain 层
  • DTO / VO / 枚举 / 状态机清晰
  • 接口契约和测试点先明确
  • 公共逻辑抽象要有边界,避免过度封装
  • 如果业务已经明显重于 CRUD,就重新按领域边界拆分,而不是继续往原来的大类里堆逻辑

更稳一点的说法

我理解可维护性不是多拆几个 service 就结束了,更重要的是状态、规则归属和领域边界是否清楚。像支付、订阅、退款这种场景,如果没有统一模型,后面一定会越来越乱。


10. 技术总监如果问“你是高级 PHP 工程师的依据是什么”,你怎么答?

推荐回答

我觉得不是因为我会多少语法点,而是我长期用 PHP 承接复杂业务系统,包括订阅、支付、退款、交易、后台和多服务协同。 我做的不是单点接口,而是业务建模、方案拆解、状态治理、联调上线和问题治理,这些更接近高级 PHP 工程师真正的职责。


11. 领域设计什么时候值得在 PHP 项目里上?

推荐回答

当业务已经开始出现多状态、多入口、多团队协作,而且大家经常对同一个业务概念理解不一致时,领域设计就值得考虑了。 它不是为了堆术语,而是为了把业务模型、规则归属和一致性边界讲清楚。

我会怎么判断

  • 如果只是后台 CRUD,先别上
  • 如果已经是支付、退款、订阅、审批、库存这类复杂业务,就该考虑
  • 如果同一条规则散在多个 controller、job、listener 里反复出现,通常就说明边界没建好