朝花夕拾|勿忘初心 朝花夕拾|勿忘初心

Mac OS Sierra 配置PHP开发与漏洞分析环境

in Mac Playing read (655) 1503汉字 站长Lucifaer 文章转载请注明来源!

主要有以下这么几个模块:

  • 任意PHP版本切换
  • PhpStorm+Xdebug调试环境

任意PHP版本切换

在Coding或者漏洞分析的时候,经常会碰到这样的情况:Mac OS自带PHP版本为5.6.29,但是实际工作环境需要7.07.1这样的版本。如果重新更换PHP版本,可能会导致系统出现一些问题,而且会导致本地生产环境混乱。

所以,有没有一种可以方便管理PHP版本的方法,使得我们使用起来更加便捷?

网上也是有很多的方法,有的使用php-version,然而在使用过之后发现并不是想象中的那么方便。其实Homebrew本身就提供了非常好的版本管理方案,再配合上sphp就非常方便。

安装Homebrew

Homebrew包管理器,可以理解为Debian系的apt,它提供了非常强大的包管理功能,可以方便的在Mac上安装各种功能各异的软件。

具体安装命令:

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

其中可能会遇到的问题,是由于你没有安装XCode Command Line Tools,可以根据报错提示的安装命令来进行安装。

注意,在Mac下大多数组件不需要使用sudo来进行安装,如果乱使用sudo会使你的环境变得非常杂乱,所以,能不使用sudo就不使用sudo

可以用下面的命令查看是否安装成功:

$ brew --version

在每次进行安装前,推荐使用brew doctor来检测配置是否正确,如果有不正确的地方,brew也会给出提示,按照提示来修复就好。

添加第三方库

将使用一些来自第三放仓库的软件,所以需要添加额外的仓库:

$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/php
$ brew tap homebrew/apache

更新brew

$ brew update

安装Apache

最新的Mac OS 10.12预装了Apache 2.4,但是预装的缺少了一些必要的脚本,所以这就是预装ApacheHomebrew配合特别困难的原因。解决该问题最简单的方法就是使用Homebrew重新安装配置Apache

如果之前已经装有Apache并且在运行中,首先要关闭它,然后移除自动加载脚本:

$ sudo apachectl stop
$ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null
$ brew install httpd24 --with-privileged-ports --with-http2

上面命令执行成功结果如下:

$ /usr/local/Cellar/httpd24/2.4.25: 212 files, 4.4M, built in 1 minute 45 seconds

请记住这个路径,如果你的路径不是这个,在运行下面命令的时候,将其替换为你的路径:

sudo cp -v /usr/local/Cellar/httpd24/2.4.25/homebrew.mxcl.httpd24.plist /Library/LaunchDaemons
sudo chown -v root:wheel /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist
sudo chmod -v 644 /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist
sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.httpd24.plist

现在就通过Homebrew安装上了Apache,并使用管理员权限将其配置为自启动。这个时候Apache已经启动了,打开127.0.0.1来验证是否成功。

关于一些小问题

配置完后,可能会出现源生Apache对80端口的影响,可以在/etc/apache2/httpd.conf中的Listen 80中将80改成其他的端口。之后重启Apache服务,sudo apachectl restart

Apache的配置

更改DocumentRoot

打开配置文件:

vim /usr/local/etc/apache2/2.4/httpd.conf

搜索DocumentRoot,看到这一行:

DocumentRoot "/usr/local/var/www/htdocs"

将这行配置改为自己的用户主目录中的目录,把your_user改为你的用户名:

DocumentRoot /Users/your_user/sites

接着将上面这行代码下面的<Directory>也改为你的新的DocumentRoot:

<Directory /Users/your_user/sites>

记得在用户目录下创建Sites目录。

<Directory>代码块里面,我们还需要将AllowOverride改为下面的样子:

# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
#   AllowOverride FileInfo AuthConfig Limit
#
AllowOverride All

接下来通过取消注释使用mod_rewrite模块:

LoadModule rewrite_module libexec/mod_rewrite.so

用户和用户组

现在Apache已经指向了我们的用户主目录下的Sites目录,不过当Apache运行的时候,其用户及用户组都是daemon,当程序访问我们的用户主目录的时候,就会遇到权限问题。这时我们可以在httpd.conf中将用户和用户组分别改为你的用户名your_userstaff

User your_user
Group staff

PHP的安装

接下来安装PHP5.6、PHP7.0、PHP7.1,并使用一个简单的脚本来切换不同的版本。

可以使用brew options php56来查看所有可以安装的选项设置。

$ brew install php56 --with-httpd24
$ brew unlink php56
$ brew install php70 --with-httpd24
$ brew unlink php70
$ brew install php71 --with-httpd24

没有--with-httpd24PHP将不会安装连接Apache的组件,将无法生成libphp7.so文件,即无法再Apache中进行设置。

可能你也需要根据自己的需要修改一些 PHP 的配置,常见的比如修改内存配置或date.timezone配置。各个版本的配置文件即php.ini在下面的目录:

/usr/local/etc/php/5.6/php.ini
/usr/local/etc/php/7.0/php.ini
/usr/local/etc/php/7.1/php.ini

Apache和PHP的配置

打开/usr/local/etc/apache2/2.4/httpd.conf,搜索php,可以发现已经有了以下的配置:

LoadModule php5_module        /usr/local/Cellar/php56/5.6.29_5/libexec/apache2/libphp5.so
LoadModule php7_module        /usr/local/Cellar/php70/7.0.14_7/libexec/apache2/libphp7.so
LoadModule php7_module        /usr/local/Cellar/php71/7.1.0_11/libexec/apache2/libphp7.so

我们用一个更加通用的路径来替换它们:

LoadModule php5_module        /usr/local/opt/php56/libexec/apache2/libphp5.so
LoadModule php7_module        /usr/local/opt/php70/libexec/apache2/libphp7.so
LoadModule php7_module        /usr/local/opt/php71/libexec/apache2/libphp7.so

之所以可以如此的修改,是因为/usr/local/opt/php71其实是由brew创建的/usr/local/Cellar/php71的软连接。

这么修改的好处是,升级PHP的小版本号的时候,比如7.1.0_11,我们就不需要再修改LoadModule对应的值了。

接下来配置PHP的主目录索引文件,找到下面的代码块:

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

替换为:

<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

保存后重启Apache,PHP的安装就完成了,可以通过phpinfo来验证。

配置PHP版本切换脚本

sphp添加到brew的/usr/local/bin里面:

$ curl -L https://gist.github.com/w00fz/142b6b19750ea6979137b963df959d11/raw > /usr/local/bin/sphp
$ chmod +x /usr/local/bin/sphp

检测PATH路径

Homebrew在安装程序的时候一般会把程序的可执行文件加入到/usr/local/bin/usr/local/sbin这两个目录中,可以通过下面的命令来检测可执行文件路径是否正确:

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

如果没有类似输出,可以手动添加这些路径:

export PATH=/usr/local/bin:/usr/local/sbin:$PATH

添加完路径到配置文件后,使用下面的命令重新载入配置文件使其生效:

# 若使用的是默认终端
$ source ~/.profile
# 或如果使用的是 zsh
$ source ~/.zshrc

继续配置任意版本切换:

注释掉正在使用的LoadModule

#LoadModule php5_module        /usr/local/opt/php56/libexec/apache2/libphp5.so
#LoadModule php7_module        /usr/local/opt/php70/libexec/apache2/libphp7.so
#LoadModule php7_module        /usr/local/opt/php71/libexec/apache2/libphp7.so

并在下面添加:

# Brew PHP LoadModule for `sphp` switcher
#LoadModule php5_module /usr/local/lib/libphp5.so
LoadModule php7_module /usr/local/lib/libphp7.so

PHP切换测试:

完成上面的步骤之后,就可以使用 sphp 命令来切换 PHP 版本了。sphp 的参数是由两个数字组合成的两位数:

$ sphp 70
PHP version 70 found
Unlinking old binaries...
Linking new binaries...
Linking /usr/local/Cellar/php70/7.0.14_7... 17 symlinks created
Linking new modphp addon...
Password:
/usr/local/lib/libphp7.so
Fixing LoadModule...
Updating version file...
Restarting homebrew Apache...
Done.

PHP 7.0.14 (cli) (built: Jan 25 2017 09:11:33) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

更新PHP和其他通过Brew安装的程序

  • 首先更新brew本身:

    $ brew update
  • 使用下面的命令进行更新:

    $ brew upgrade

使用具体的/最新的PHP版本

使用下面的命令来看一下PHP版本:

$ php -v

可以用下面的命令查看具体的可用PHP版本(一般是最新的版本):

$brew info php70
homebrew/php/php70: stable 7.0.14 (bottled), HEAD
PHP Version 7.0
https://php.net
Conflicts with: php53, php54, php55, php56, php71
/usr/local/Cellar/php70/7.0.14_7 (333 files, 49.9M) *
  Built from source on 2017-01-25 at 09:13:37 with: --with-httpd24
From: https://github.com/Homebrew/homebrew-php/blob/master/Formula/php70.rb

可以看到php7.0的版本只有一个可用的7.0.14。

然后可以用brew来切换到一个具体的版本:

$ brew switch php70 7.0.14

配置PhpStorm+Xdebug调试环境

配置过程非常简单。

$ brew install php70 --with-xdebug

配置php.ini:

brew安装后的xdebug位于/usr/local/etc/php/5.6/conf.d/ext-xdebug.ini

在该文件中添加下面的配置:

[xdebug]
zend_extension="/usr/local/opt/php56-xdebug/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_host="127.0.0.1"
xdebug.remote_port=9001
xdebug.profiler_enable=1
xdebug.idekey="PHPSTORM"
xdebug.remote_log = "/tmp/xdebug.log"
xdebug.profiler_output_dir="/Users/www/debug"

重启Apache服务即可。

在PhpStorm中的具体配置可以看这里

其中的IDEKEY为PHPSTORM。

可能遇到的问题就是配置正确,但无法调用xdebug。可以通过改变xdebug的端口来解决。

mac
最后由Lucifaer修改于2017-07-13 13:52

此处评论已关闭

已有 2 条评论
  1. 77ca1k1k1
    77ca1k1k1

    好的,学习了。我是最近几个月才知道Mac内置了apache和php。看着大佬的分析总是127001,搜了一下才知道。哦对,Xdebug以后就用它调试吧,还没做过php调试。以前都只是静态读源码。。。。怪不得分析不出来什么,方法没找对啊

  2. Lucifaer
    Lucifaer本文作者

    @77ca1k1k1 其实现在已经不怎么用apache了,php -S可以解决大部分问题。在phpstorm中,可以设置php-build-in-server来调用php -S

博客已萌萌哒运行
© 2018 由 Typecho 强力驱动.Theme by Yodu
PREVIOUS NEXT
雷姆
拉姆