Andrew DeFaria
Andrew DeFaria

Reputation: 321

How to debug PHP CLI scripts from the CLI

Does anybody know how to debug CLI PHP scripts from the CLI?!? I don't want to debug a PHP web page - I don't have a PHP web page. I don't want to debug a remote script either - I'm running/debugging right here on this system. I don't want to (at this time) try to get some IDE (Eclipse, PhpStorm or whatever) to debug a CLI PHP rather I just want to debug some PHP CLI script at the Linux command line itself. In Perl this would be simply perl -d <script.pl> <options>. Debugging a script, to me, is not figuring out compile errors or other simple things. To me it's setting break points, running code, examine the contents of variables and being able to arbitrarily execute or eval ('<php code>') at the debugger.

Sure later I'd like to configure this into my IDE of choice (at this time this is Eclipse) but I have not managed to get that working. Debugging from the CLI a PHP CLI script would be a good start for me.

Thanks.

I don't know why I'm limited to a character count when posting a comment. Perhaps I can add more text here.

Here's what I have tried in order to use xdebug and/or Zend debugger with Eclipse:

Andromeda:sudo find / -xdev -name php.ini /etc/php5/cli/php.ini /etc/php5/apache2/php.in /opt/eclipse/plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.18.v20110322/resources/php53/php.ini /opt/eclipse/plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.18.v20110322/resources/php5/php.ini /opt/eclipse/plugins/com.zend.php.debug.debugger.php56.linux.x86_64_13.0.1.v20151112-2045/resources/php56/php.ini Andromeda:

Launching renameUser has encountered a problem. An internal error occurred during "Launching renameUser" java.lang.NullPointerException.

Oh goodie...

zend_extension=/usr/lib/php5/20121212/ZendDebugger.so zend_debugger.allow_hosts=127.0.0.1/32, 192.168.0.0/16 zend_debugger.expose_remotely=always

Error launching 'renameUser' The debug session could not be started. Please make sure that the debugger is properly configured as a php.ini directive.

Andromeda:/opt/eclipse/plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.18.v20110322/resources/php5/php-cgi /opt/eclipse/plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.18.v20110322/resources/php5/php-cgi: error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory

Other odd stuff:

Upvotes: 21

Views: 39700

Answers (5)

NVRM
NVRM

Reputation: 13077

There is an "official" xdebug Command Line Debug Client: https://xdebug.org/download#dbgpClient

In my opinion, it could be made way better, but it does help:

  1. Install PHP xdebug (https://www.youtube.com/watch?v=MmyxWy8jl7U) with default port 9003
  2. Link dbgpClient to PATH
  3. run dbgpClient
  4. Add at least one xdebug_break(); in your PHP to mark a break-point
  5. Run your PHP CLI script in another shell
  6. Pass in commands into dbgpClient: (step_into, context_get, ...)
Command Description
breakpoint_set -t line -f file:///xdebug-test-2.php -n 5    Sets a breakpoint on line 5 of file:///xdebug-test-2.php
step_into   Steps to the next executable line in the code
run         Runs the script until the next breakpoint, or when the script ends
context_get Lists the variables and their values in the current scope
property_get -n $a  Retrieves the value of the property $a

https://xdebug.org/download#dbgpClient

https://xdebug.org/docs/dbgpClient

Upvotes: 0

Mr. S
Mr. S

Reputation: 126

What worked for me was using dephpugger. I found the steps to get CLI debugging working here:

https://hackernoon.com/how-debug-php-applications-with-dephpugger-98cc234d917c

I had previously installed xdebug and tried out exussum's answer.

The steps I followed are included here for completeness.

Install dephpugger:

composer global require “tacnoman/dephpugger”:”dev-master”

Put dephpugger on the path:

export PATH=$PATH:$HOME/.composer/vendor/bin

make sure to include in the php file at the breakpoint:

xdebug_break();

open up 2 terminal instances. In one run:

dephpugger debug

In the other run

dephpugger cli /path/file.php

replacing /path/file.php with the path to your file. if you need command line arguments to the php script put the path and arguments in quotes. It still seems a little hacky. I think the real trick is to write in a language that has a better debugger built in.

Upvotes: 3

jm009
jm009

Reputation: 71

exussums answer works for me.

In addition I have the following in /etc/php/7.0/cli/conf.d/20-xdebug.ini

zend_extension=xdebug.so

xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp

xdebug.remote_enable=true
#xdebug.remote_enable=false

And I had to do this: https://github.com/vim-vdebug/vdebug/issues/363

Upvotes: 2

exussum
exussum

Reputation: 18550

When debugging on the command line you need to tell PHP you want to debug also

http://xdebug.org/docs/remote

says

export XDEBUG_CONFIG="idekey=session_name"
php myscript.php

assuming xdebug is enabled (it doesnt matter which .ini file its in, but there is a standard place per OS for this, usually in a conf.d folder called xdebug.ini which is auto included)

This allows you to debug a cmdline script.

Personally I use Vim with Vdebug extention (xdebug for vim) to debug and nothing other than a command line is needed

Upvotes: 19

Sven
Sven

Reputation: 70863

Being able to set break points in a PHP script requires some kind of debugger extension being loaded, either XDebug or Zend Debugger.

And then you need some kind of interface to this debugger to make your wishes about break points known. I am unfamiliar with the Perl debugging, but I haven't heard about any PHP CLI based debugging - it is always taking place in an IDE that is able to handle the debugging protocol of one of the extensions.

Of course there is the good old var_dump();die('hi'); debugging, but this does not include continuing code execution after the script ended. ;)

Upvotes: 0

Related Questions