docker中的php7代码调试

docker中的php7代码调试

前言

  • 最近想好好看看PHP反序列化POP链的构造,加上之前遇到的laravel的题,想把挖的坑埋了,于是开始漫长的环境搭建之旅。。。
  • 由于laravel是在PHP7环境下的框架,我在物理机上使用的phpstudy怎么都无法成功调试,最近又迷上docker的一次搭建万年使用并且随时还原的方便(使用爽,构建火葬场);使用docker可以做到php版本灵活切换,在这里把遇到的坑和一些产物记录下来。

搭建过程

  • 本文的搭建方法主要参考自http://ramkulkarni.com/blog/setting-up-and-debugging-php7-in-docker/

  • 国内环境下原Dockerfile不能成功下载程序
  • 原文中的VScode配置过时,需要更改为新的模式
  • PHPstorm在配好环境后仍然不能正常debug,只能停在第一行的断点处,并且继续执行下一行时失去连接。抓包后可以看到双方都有通讯,从而不是服务器端的问题。
  • 吹爆VScode!

踩完坑后的搭建过程

Docker服务器端

  • Dockerfile已上传:https://github.com/HACHp1/docker_php7_apache_xdebug
  • 首先,修改php.ini文件使之与你的环境一致:
    1
    2
    3
    4
    5
    6
    [xdebug]
    zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so #(此处如果要更改php7的版本,则需要进一步操作,操作在后文中出现)
    xdebug.remote_enable=1
    xdebug.remote_autostart=1
    xdebug.remote_host=192.168.153.1 #(此处修改为你VScode所在的主机)
    xdebug.remote_port=9000

然后,build Dockerfile:

1
docker build -t php7_xdebug .

记下返回的id。

  • 然后运行container:
    1
    docker run -d -p 10086:80 --name php7_xdebug --restart=always 刚刚返回的id

VScode端

  • 在插件中直接搜索安装 PHP Debug
  • 在配置中设置,其中的pathMappings后面设置VScode端的项目路径,此处设置了本地到远程的文件目录映射:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
    "name": "Listen for XDebug",
    "type": "php",
    "request": "launch",
    "stopOnEntry": true,
    "pathMappings": {
    "/var/www/html":"C:\\Users\\...\\php7_docker"
    },
    "port": 9000
    }

  • 至此,就可以打好断点愉快地debug了:

更改php7版本

  • 首先修改Dockerfile中的php7版本
  • 构建并运行container后,输入:
1
find / -name xdebug.so
  • 将返回结果替换到php.ini中的zend_extension=之后
  • 重新启动container中的服务器
  • 继续后续操作即可(换版本时主要是需要把php.ini中的路径重新设置好)

参考资料

  • http://ramkulkarni.com/blog/setting-up-and-debugging-php7-in-docker/
  • https://jonathansblog.co.uk/remote-debugging-php-in-visual-studio-code-with-xdebug