升级至MacOS Sonoma后Apache日志出现SwiftNativeNSStringBase错误求助
问题背景
Mac升级至Sonoma(14.2.1)后,通过Macports搭建的Apache/PHP/MySQL多站点环境中,单个站点无法加载,Apache错误日志报出:
+[__SwiftNativeNSStringBase initialize] may have been in progress in another thread when fork() was called.
+[__SwiftNativeNSStringBase initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
[core:notice] [pid 6373] AH00052: child pid 6914 exit signal Abort trap (6)
已尝试在.zshrc中添加export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES和export DISABLE_SPRING=true,但均无效。
针对性解决方案
1. 在Apache启动环境中注入变量
Apache作为系统服务启动时,不会读取用户shell的配置文件,需直接在Apache的启动配置中添加环境变量:
- 进入Macports Apache配置目录:
cd /opt/local/etc/apache2/ - 创建或编辑
envvars文件,添加:export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES - 重启Apache服务:
sudo port unload apache2 && sudo port load apache2
2. 排查站点专属PHP扩展
该错误通常由站点依赖的特定PHP扩展触发(尤其是涉及Swift交互或未适配Sonoma的第三方扩展):
- 对比正常站点与故障站点的PHP扩展列表,通过
php -m或phpinfo()输出查看差异 - 逐个禁用故障站点独有的扩展,定位触发问题的扩展后:
- 尝试更新该扩展至兼容Sonoma的版本
- 若为自定义Swift相关扩展,重新编译适配Sonoma的fork机制
3. 切换Apache MPM模式
默认的prefork模式频繁fork子进程,易触发Swift初始化冲突,可切换至event/worker模式(需配合PHP-FPM):
- 编辑Apache主配置文件
httpd.conf,替换MPM模块:# 注释掉prefork模块 # LoadModule mpm_prefork_module libexec/apache2/mod_mpm_prefork.so # 启用event模块 LoadModule mpm_event_module libexec/apache2/mod_mpm_event.so - 配置Apache反向代理到PHP-FPM(替代mod_php):
<FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> - 重启相关服务:
sudo port unload apache2 php-fpm && sudo port load apache2 php-fpm
4. 更新Macports及组件
确保所有依赖组件适配Sonoma:
- 更新Macports自身:
sudo port selfupdate - 更新所有过时端口:
sudo port upgrade outdated - 重启Apache、PHP等服务
内容的提问来源于stack exchange,提问作者belomat

