0x00 背景
最近需要调试一段PHP代码,多年没有碰过世界上最好的语言的我想直接用Mac上现成的VS code环境调试下,以为很好配置的环境结果用了三个晚上才算完成,所以记录下这一路来遇到的大坑。
0x01 环境配置
php做开发最基本的配置基本就是php + Nginx + Mysql了,如果需要使用VS code做调试,则还需安装一个Xdebug接入。
0x01 php
php的安装很简单,直接
1 | brew install php |
即可。
0x02 Nginx
安装Nginx直接通过homebrew:
1 | brew install nginx |
接下来设置root地址等地址到~/Document/...
接下来执行
1 | brew start nginx |
运行Nginx,这里要注意不要用sudo
不然会报一大堆权限错误无法读取用户目录下的路径的错误。
0x03 php-fpm
Mac 自带 php-fpm,在终端执行 php-fpm,会报如下错误:
1 | ERROR: failed to open configuration file '/private/etc/php-fpm.conf': No such file or directory (2) |
错误信息显示,不能打开配置文件,cd /private/etc,发现没有 php-fpm.conf 文件,但是有 php-fpm.conf.default 文件。这个文件是默认配置,我们可以复制一份,改名为 php-fpm.conf,然后再根据需要改动配置。
1 | cp /private/etc/php-fpm.conf.default /private/etc/php-fpm.conf |
执行 php-fpm,再次报错:
1 | ERROR: failed to open error_log (/usr/var/log/php-fpm.log): No such file or directory (2) |
错误信息显示,不能打开错误日志文件。cd /usr/var/log 发现根本没有这个目录,甚至连 var 目录都没有,加上为了避免权限问题,干脆配置到 /usr/local/var/log
目录。
修改php-fpm.conf
error_log 配置为 /usr/local/var/log/php-fpm.log
,并把 user 和 group 改为和当前用户一样。
执行 php-fpm,再次报错:
1 | NOTICE: [pool www] 'user' directive is ignored when FPM is not running as root |
于是 sudo php-fpm,再次报错:
1 | ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (48) |
因为原本的php-fpm.conf会占用9000端口报错,编辑 php-fpm.conf,修改 listen 为 127.0.0.1:9999。
接下来继续报错
1 | 2018/11/09 21:54:11 [error] 70601#0: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /phpinfo.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9999", host: "localhost:8080" |
这个主要是因为主配置文件是/usr/local/etc/php/7.0/php-fpm.conf
,但最后一句引用了一个文件夹的配置文件:
1 | include=/usr/local/etc/php/7.0/php-fpm.d/*.conf |
在 php-fpm.d 文件夹里有一个 www.conf 文件,它里面默认是:
1 | user = _www |
在OSX系统里应该把它改为:
1 | user = [your username] |
如果不改这里,即使路径是对的,你也会一直在Nginx错误日志里看到"Primary script unknown"
的日志。
其中你的用户名可以通过:
1 | ps aux | grep 'php-fpm' |
获取。
通过下面步骤可以看到配置是否正确:
添加到/usr/local/etc/nginx/nginx.conf的http部分:
1 | log_format scripts '$document_root$fastcgi_script_name > $request'; |
添加下面的内容到站点的server部分:
1 | access_log /var/log/nginx/scripts.log scripts; |
如果一切运行正常,请求的日志会像下面一样被打印出来:
1 | /path/to/docroot/phpinfo.php > GET /phpinfo.php |
如果一切顺利,此时你应该可以看到php打出来的机器各种配置。
0x04 连接VS code
折腾了各种Nginx和PHP的坑之后,暂时用自己服务器上的MySQL配合着Nginx、PHP环境完成了代码调试。由于php的错误提示很详细,基本刷下页面看着错误提示改一改代码各种问题也都解决了。
不过最终的目标还是需要直接使用VS code用于代码调试的,这个可以通过xDebug和VS code的插件实现。
详细配置过程可以参考这篇OSX下配置VSCode的PHP调试环境