iOS转PHP:Xcode到Laravel的16年Ruby老兵调试手记
|
iOS转PHP:Xcode到Laravel的16年Ruby老兵调试手记。2025年5月,我在深圳南山某创业公司接手一个 Laravel 11 + Livewire 3 的后台项目——它正卡在 Stripe Webhook 验证失败上,而前任 iOS 工程师写的 PHP 代码里混着 Swift 风格的 Optional chaining 模拟:$data?->event_type ?? 'unknown',结果 PHP 8.2 直接 parse error 报错第47行。 我花37分钟重写了 Webhook 签名验证逻辑,用的是 Laravel 自带的 Illuminate\\Support\\Str::isUuid() 做兜底校验——但这根本不是问题根源。真正卡住我的是本地开发环境:MAMP Pro 6.9 启用了 PHP 8.2.12,但 Homestead box 默认装的 php-curl 扩展没开启 SSLv3 支持,导致 stripe-php SDK 发起的 curl_init() 调用静默失败,日志里只有一行“cURL error 35: SSL connect error”,连 trace 都不打。我试了 openssl version -a(显示 OpenSSL 3.0.13),又翻了 /etc/ssl/openssl.cnf,在 [system_default_sect] 下加了 Options = UnsafeLegacyRenegotiation ——这玩意儿苹果工程师绝不会碰,iOS 上 SSL/TLS 握手失败顶多弹个 UIAlertController。 失败案例很具体:2025年5月12日下午,我把 Laravel Mix 编译的 app.js 直接扔进 Xcode 项目当 WebView 加载,结果 Safari Web Inspector 里看到 TypeError: Cannot read property 'dispatch' of undefined ——因为 Vue 3 的 createApp() 返回值被 webpack externals 误配成全局变量,而 Xcode 的 WKWebView 不会自动注入 。我手动加 script 标签后,发现 date-fns 的 formatISO 在 PHP 时间戳(1715529600)传进来时吐出 1970-01-01T00:00:00.000Z ——原来 PHP Carbon::now()->timestamp 返回 int,但 JS new Date(1715529600) 是毫秒级,少乘了 1000。 这个过程里最反直觉的细节?Laravel 的 php artisan serve 默认绑定 127.0.0.1:8000,而 iOS Simulator 却访问不了 localhost ——必须改 host 为 0.0.0.0:8000,再在 macOS 共享网络设置里打开防火墙例外,否则 iPhone 真机用同一个 Wi-Fi 连过去,curl -v http://192.168.1.102:8000/api/test 会卡在 TCP SYN_SENT。我查 packet capture 时发现,macOS 的 pfctl 规则居然把来自 192.168.1.0/24 的包全 drop 了,就因为去年我配过一个测试用的 pf.conf ——那文件还在 /etc/pf.legacy.backup.20241107。 新技术。
文章配图,仅供参考 我承认:没跑通 PHPUnit 数据库迁移快照测试——testbench 用的 sqlite :memory:,但 schema:create 命令在 CI 环境里报 SQLSTATE[HY000]: General error: 1 no such table: migrations,而本地用 MySQL 8.0.33 却正常;暂时搁置,先用 tinker 手动 seed 27 条 fake 订单测完支付回调流再说。 2025年5月18日,我把 Ruby 的 dry-struct 验证规则翻译成 Laravel Form Request,但碰上一个没文档的坑:当请求字段是 nested array,比如 items[0][price],Laravel 的 validate() 方法会把 keys 当字符串处理,而 dry-struct 支持 Symbol keys 映射。我试了三次:第一次用 $request->validate(['items..price' => 'required|numeric']),漏掉了 items.[0].id 字段的 presence 校验;第二次手写 Rule::forEach(),结果 foreach 中 return 的 Closure 被当成数组键;第三次直接改用 $request->all() + custom foreach loop 打日志 ——发现 $request->input('items') 返回空,原来是前端传的是 items[0][price]=199&items[1][price]=299,但 Nginx fastcgi_params 里缺少 fastcgi_param PHP_VALUE "max_input_vars=5000"; 这配置 PHP-FPM 默认只有1000,超了就丢参数。 我不确定要不要把 Ruby 的 Roda + Sequel 迁移脚本也搬来 Laravel ——毕竟 Artisan migrate:rollback --step=1 和 sequel postgres://u:p@h/d -m db/migrate/ 用起来手感差太多。但得试试。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


PHP实时交互卡顿?17年运维老手三招速解