加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0472zz.com/)- 云渲染、网络安全、终端安全、数据治理、智能机器人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux下PHP开发环境搭建实战指南

发布时间:2026-11-05 08:01:58 所属栏目:Linux 来源:DaWei
导读:  去年一月,我在三号机房搭完最后一套PHP环境,窗外在下冻雨,雨点砸在机柜顶上像撒了一把铁豆子。老张端着保温杯进来问“Xdebug装好了没”,我正用tail -f看php-fpm错误日志,头也没抬说“刚崩第三回了”,他杯子底磕在机架

  去年一月,我在三号机房搭完最后一套PHP环境,窗外在下冻雨,雨点砸在机柜顶上像撒了一把铁豆子。老张端着保温杯进来问“Xdebug装好了没”,我正用tail -f看php-fpm错误日志,头也没抬说“刚崩第三回了”,他杯子底磕在机架横梁上“铛”一声,我手抖删错了行,重输sudo systemctl restart php8.2-fpm时把-fpm打成-fmp,服务直接失联十七分钟。


  优胜劣汰?对。不是环境挑人,是环境把人筛成渣。你搭个LAMP就以为稳了?那会儿我看着Nginx日志里三百七十二条“Connection refused”,手指头都快按进键盘缝里——不是不会查,是查到第四层才发现PHP-FPM的socket路径被Docker卷挂载时硬生生截了尾,/run/php/php8.2-fpm.sock 变成 /run/php/php8.2-fpm.soc,少了个k。这个我敢打包票,因为我就蹲在监控台底下拿手机拍过截图,背景里还照见小王蹲着拧机柜螺丝,螺丝刀反光晃得我右眼直跳。


文章配图,仅供参考

  小陈非说用systemctl enable php8.2-fpm就等于开机自启,我说你试试改完/etc/php/8.2/fpm/pool.d/www.conf之后reload不重启进程——他当场敲了systemctl reload php8.2-fpm,结果所有worker进程卡在old gen里不动,连ps aux | grep fpm都飘着两个僵尸态pid。我说你reboot试试,他翻白眼:“又不是Windows”。后来他真去按了物理电源键,机柜灯灭那一秒,我听见隔壁工位的咖啡机“嘀”地响了一声,没人理它。


  其实最荒诞的是Composer。不是它版本冲突,是它默认用/tmp当缓存目录——而我们这台服务器的tmpfs挂载大小设的是256M,装个laravel/framework + doctrine/dbal直接撑爆。我原以为是内存不足,查top查了十八秒,结果看见df -h /tmp底下写着99%,而/tmp底下躺着个叫composer_cache_7b3a41的目录,里面塞了八百四十二个.phar解压包。小李路过瞥了一眼,顺手把rm -rf /tmp/composer_cache_写进alias,起名叫“清道夫”,第二天他就辞职了,没留交接单,只留下shell历史里一行:alias clear-composer='rm -rf /tmp/composer_cache_ && echo "gone"'


  对了,那天下午四点零七分,机房空调突然停了十分钟,不是故障报警,是物业检修——他们关总闸前根本没发邮件,就让保洁阿姨拿张A4纸贴在机房门口,纸上印着歪斜的宋体字:“临时断电,约10分钟”。我盯着那张纸边角翘起来,左手在键盘上按住Ctrl+C,右手抄起保温杯喝了半口凉透的枸杞茶,茶汤底下沉着三颗发蔫的枸杞,像三个拒绝启动的worker进程。


  你说Docker好?我信。但去年搭环境那天,我亲手拉下来的php:8.2-apache镜像,build后跑localhost报错:mod_rewrite模块没加载。查Dockerfile发现官方镜像压根不装libapache2-mod-rewrite,得自己apt-get install再a2enmod rewrite再service apache2 restart——结果Apache拒绝启动,因为Docker里没有systemd,你得用apache2-foreground,而不是service。这个我说不准,因为小王当时在啃鸭脖,油蹭到键盘F7键上,我借他笔记本试了三次才跑通,第三次时他鸭脖骨头掉进了我的机械键盘空格键缝隙里,现在敲空格还有咔哒声。


  还有一次,为了导出dev环境的扩展列表,我写了个for循环批量php -m > modules.log,结果文件里混进了七行“PHP Deprecated: Function get_magic_quotes_gpc() is deprecated”的告警——不是代码问题,是某个同事上周偷偷往/etc/php/8.2/cli/conf.d/99-debug.ini里加了display_errors = On,还写了句注释:“方便定位”。方便个屁。我删掉那行后重新跑了十一次命令才拿到干净列表,第七次的时候窗外雨变小了,开始飘雾,机柜冷凝水顺着走线槽往下滴,在地面聚成指甲盖大的水洼,倒映着UPS的红色告警灯。


  说实话,现在看到“一键搭建”四个字就想笑。上周五小刘传我个.sh脚本,开头写着# Tested on Ubuntu 22.04 LTS,我本地跑一遍没问题,推到测试服直接卡死在pecl install xdebug——原来他本机开了代理,脚本里curl -sS https://getcomposer.org/installer 默认走了$HTTP_PROXY,而测试服没配proxy,但脚本没加curl -x参数也没fallback逻辑,就干耗着,超时都没报错,就静音等,等了两分三十七秒,期间我数了机柜风扇转速:从3800rpm降到3600rpm,又升回3750rpm。最后我拔网线重插,手背蹭过散热孔,烫得缩了一下。


  要我说,所谓实战指南,就是把踩过的坑列成清单,但清单永远漏掉最脏那个——比如PHP.INI里date.timezone = Asia/Shanghai和Asia/Shanghai/Beijing其实能共存,但后者会覆盖前者,且ini扫描顺序取决于文件名ASCII码值,不是时间戳也不是读取顺序。这个细节我查了三天源码才确认,第三天中午老张接了个电话,说“嗯…对…再加两台DB…哦好的”,挂了就把新数据库IP塞进.env文件,顺手改了php.ini里allow_url_fopen = Off,说“安全起见”。然后我们的Composer update全挂了,因为packagist.org的域名解析走https,而allow_url_fopen=Off会导致stream_socket_client失败——但它不报错,只返回false,所以Composer默默回退到HTTP协议,然后被CDN拦住。我盯着curl -v https://packagist.org/packages.json 看了三遍,直到看见响应头里那行Location: http://…才拍桌子骂出来。桌上有份没拆的麻辣香锅外卖,塑料盒底印着“饿了么·2023冬季限定”,日期模糊不清。


  行了,先这样。我得去改一下php8.2-fpm.service的RestartSec=3改成RestartSec=10,不然它崩溃太快,systemd都来不及记日志。至于要不要把/etc/php/8.2/fpm/pool.d/www.conf里的pm.max_children从50砍到35……再说吧。我刚看见小李的钉钉头像亮了,备注是“自由职业者”,签名写着:“再也不碰prod env的php.ini”。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!