PCOV - CodeCoverage compatible driver for PHP

Last update: May 6, 2022

PCOV

Build Status Build status

A self contained CodeCoverage compatible driver for PHP

Requirements and Installation

See INSTALL.md

API

/**
 * Shall start recording coverage information
 */
function \pcov\start() : void;

/**
 * Shall stop recording coverage information
 */
function \pcov\stop() : void;

/**
 * Shall collect coverage information
 *
 * @param integer $type define witch type of information should be collected
 *		 \pcov\all        shall collect coverage information for all files
 *		 \pcov\inclusive  shall collect coverage information for the specified files
 *		 \pcov\exclusive  shall collect coverage information for all but the specified files
 * @param array $filter path of files (realpath) that should be filtered
 *
 * @return array
 */
function \pcov\collect(int $type = \pcov\all, array $filter = []) : array;

/**
 * Shall clear stored information
 *
 * @param bool $files set true to clear file tables
 *
 * Note: clearing the file tables may have surprising consequences
 */
function \pcov\clear(bool $files = false) : void;

/**
 * Shall return list of files waiting to be collected
 */
function \pcov\waiting() : array;

/**
 * Shall return the current size of the trace and cfg arena
 */
function \pcov\memory() : int;

Configuration

PCOV is configured using PHP.ini:

Option Default Changeable Description
pcov.enabled 1 SYSTEM enable or disable zend hooks for pcov
pcov.directory auto SYSTEM,PERDIR restrict collection to files under this path
pcov.exclude unused SYSTEM,PERDIR exclude files under pcov.directory matching this PCRE
pcov.initial.memory 65536 SYSTEM,PERDIR shall set initial size of arena
pcov.initial.files 64 SYSTEM,PERDIR shall set initial size of tables

Notes

The recommended defaults for production should be:

  • pcov.enabled = 0

The recommended defaults for development should be:

  • pcov.enabled = 1
  • pcov.directory = /path/to/your/source/directory

When pcov.directory is left unset, PCOV will attempt to find src, lib or, app in the current working directory, in that order; If none are found the current directory will be used, which may waste resources storing coverage information for the test suite.

If pcov.directory contains test code, it's recommended to set pcov.exclude to avoid wasting resources.

To avoid unnecessary allocation of additional arenas for traces and control flow graphs, pcov.initial.memory should be set according to the memory required by the test suite, which may be discovered with \pcov\memory().

To avoid reallocation of tables, pcov.initial.files should be set to a number higher than the number of files that will be loaded during testing, inclusive of test files.

Note that arenas are allocated in chunks: If the chunk size is set to 65536 and pcov require 65537 bytes, the system will allocate two chunks, each 65536 bytes. When setting arena space therefore, be generous in your estimates.

Interoperability

When PCOV is enabled by configuration pcov.enabled=1:

  • interoperability with Xdebug is not possible
  • interoperability with phpdbg is not possible
  • interoperability with Blackfire profiler is not possible

At an internals level, the executor function is overriden by pcov, so any extension or SAPI which does the same will be broken.

When PCOV is disabled by configuration pcov.enabled=0:

  • PCOV is zero cost - code runs at full speed
  • Xdebug may be loaded
  • phpdbg may be executed
  • Blackfire probe may be loaded

At an internals level, the executor function is untouched, and pcov allocates no memory.

Differences in Reporting

There are subtle differences between Xdebug and PCOV in reporting: Both Xdebug and PCOV perform branch analysis in order to detect executable code. Xdebug has custom written (very mature, proven) analysis, while PCOV uses the very well proven control flow graph from Optimizer. They generate comparably accurate reports, while phpdbg uses less robust detection of executable code and generates reports with known defects. One such defect in phpdbg is this:

/* 2 */ function foo($bar) {
/* 3 */ 	if ($bar) {
/* 4 */			return true;
/* 5 */		}
/* 6 */	}

phpdbg will detect that this function is 100% covered when the first control path is taken, if ($bar), because it cannot correctly detect which implicit return paths inserted by Zend at compile time are executable, and so chooses to ignore them all. While this may seem like a trivial difference to some, it means that the reports generated by phpdbg are not completely trustworthy.

While the accuracy of Xdebug and PCOV are comparable, the reports they generate are not precisely the same, one such example is the switch construct:

/* 2 */ switch ($condition) {
/* 3 */		case 1:
/* 4 */			return "PHP rox!";
/* 5 */	}

From PHP 7.2.15 and PCOV 1.0, PCOV will detect the executability of the cases inside the switch body correctly, but will not detect line 2 (with the switch statement) as executable because Zend didn't output an executable opcode on that line. Xdebug's custom analysis doesn't use the same method and so will show an extra executable line on 2. Pre 7.2.15 and PCOV 1.0, the coverage of some switches is questionable as a result of the way Zend constructs the opcodes in the body of the switch - it may not execute them depending on a jump table optimization.

While Xdebug and PCOV both do the same kind of analysis of code, Xdebug is currently able to do more with that information than just generate accurate line coverage reports, it has path coverage and PCOV does not, although path coverage is not yet implemented (and probably won't be) by CodeCoverage.

Differences in Performance

The differences in performance of Xdebug and PCOV are not slight. Xdebug is first and foremost a debugging extension, and when you load it, you incur the overhead of a debugger even when it's disabled. PCOV is less than 1000 lines of code (not including CFG) and doesn't have anything like the overhead of a debugger.

GitHub

https://github.com/krakjoe/pcov
Comments
  • 1. Lines not covered when more tests are run

    Hello,

    I've spot an issue that some lines are not covered when tests are run together with other ones.

    Easiest way to reproduce is to clone this repository: git clone [email protected]:kubawerlos/php-cs-fixer-custom-fixers.git.

    When running vendor/bin/phpunit tests/Fixer all fixers get covered, which is expected.

    But when running vendor/bin/phpunit tests some fixers don't get covered fully (but only some) and always the problematic is function isRisky, e.g. InternalClassCasingFixer::isRisky.

    I've tested with PCOV v1.0.3 and phpunit/php-code-coverage 7.0.4.

    Reviewed by kubawerlos at 2019-06-02 14:49
  • 2. Segmentation fault on 7.4 on macOS with anonymous class

    On PHP 7.4 (tested with 7.4.2 and 7.4.3) on macOS collecting code coverage for code that contains an anonymous class segfaults. The same code on Linux doesn't have any problems.

    Test script:

    <?php
    \pcov\start();
    $a = new class() {};
    \pcov\stop();
    var_dump(\pcov\collect());
    

    Expected result (at least that's what one receives with PHP 7.3):

    array(1) {
      ["[...redacted...]src/foo.php"]=>
      array(5) {
        [2]=>
        int(-1)
        [3]=>
        int(1)
        [4]=>
        int(1)
        [5]=>
        int(-1)
        [6]=>
        int(-1)
      }
    }
    

    Actual result:

    [1]    63456 segmentation fault  php src/foo.php
    
    Reviewed by mikey179 at 2020-02-21 10:43
  • 3. Empty results

    Tests run and report is generated as normal, however, the coverage report shows 0% all the way through.

    If I run the same config using phpdbg or Xdebug, it takes a lot longer, but it yields correct results.

    I suspect it may be related to processIsolation? Here is my config

    <?xml version="1.0" encoding="UTF-8"?>
    <phpunit bootstrap                   = "tests/bootstrap.php"
             backupGlobals               = "false"
             backupStaticAttributes      = "false"
             colors                      = "true"
             convertErrorsToExceptions   = "true"
             convertNoticesToExceptions  = "true"
             convertWarningsToExceptions = "true"
             processIsolation            = "true"
             stopOnFailure               = "false">
        <php>
            <env name="APP_ENV" value="test"/>
        </php>
        
        <testsuites>
            <testsuite name="Unit Tests">
                <directory>tests/unit</directory>
            </testsuite>
        </testsuites>
    
        <logging>
            <log type="coverage-html" target=".output/report" />
        </logging>
        <filter>
            <whitelist processUncoveredFilesFromWhitelist="true">
                <directory suffix=".php">./app</directory>
            </whitelist>
        </filter>
    </phpunit>
    
    Reviewed by ext-pewa at 2019-12-19 09:39
  • 4. Problem with installation PCOV on php 7.3.8

    git clone .... git checkout release (not develop)

    -rw-r--r--   1 pvsaintpe  staff     0B  8 окт 14:35 missing
    -rw-r--r--   1 pvsaintpe  staff     0B  8 окт 14:35 mkinstalldirs
    drwxr-xr-x   2 pvsaintpe  staff    64B  8 окт 14:10 modules
    -rw-r--r--   1 pvsaintpe  staff   5,1K  8 окт 14:35 package.xml
    -rw-r--r--   1 pvsaintpe  staff    21K  8 окт 14:35 pcov.c
    -rw-r--r--   1 root       staff   221B  8 окт 14:38 pcov.loT
    -rw-r--r--   1 pvsaintpe  staff   2,5K  8 окт 14:35 php_pcov.h
    -rw-r--r--   1 pvsaintpe  staff    85K  8 окт 14:35 run-tests.php
    drwxr-xr-x   6 pvsaintpe  staff   192B  8 окт 14:09 tests
    
    [email protected] pcov % make 
    /bin/sh /Users/pvsaintpe/pcov/libtool --mode=compile cc -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 -I. -I/Users/pvsaintpe/pcov -DPHP_ATOM_INC -I/Users/pvsaintpe/pcov/include -I/Users/pvsaintpe/pcov/main -I/Users/pvsaintpe/pcov -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -I/Users/pvsaintpe/pcov/cfg/703  -DHAVE_CONFIG_H  -g -O2   -c /Users/pvsaintpe/pcov/pcov.c -o pcov.lo 
     cc -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 -I. -I/Users/pvsaintpe/pcov -DPHP_ATOM_INC -I/Users/pvsaintpe/pcov/include -I/Users/pvsaintpe/pcov/main -I/Users/pvsaintpe/pcov -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -I/Users/pvsaintpe/pcov/cfg/703 -DHAVE_CONFIG_H -g -O2 -c /Users/pvsaintpe/pcov/pcov.c  -fno-common -DPIC -o .libs/pcov.o
    /Users/pvsaintpe/pcov/pcov.c:25:10: fatal error: 'php.h' file not found
    #include "php.h"
             ^~~~~~~
    1 error generated.
    make: *** [pcov.lo] Error 1
    

    OS: MacOS Catalina (official release) 10.15 PEAR Version: 1.10.9 PHP Version: 7.3.8 Zend Engine Version: 3.3.8

    Installation via pecl also got errors.

    What am I doing wrong?

    Reviewed by pvsaintpe at 2019-10-08 11:41
  • 5. Pcov using almost 14 GB of memory to generate coverage

    Hi,

    While running code coverage on a recent project I discovered that pcov consumed nearly 14 GB of memory and I can't figure out why exactly. I tried code coverage using xdebug and it only used 68 MB of memory to generate coverage for the same code. This was using PHP 7.4.20 on WSL2/Ubuntu 20.04. Please let me know if I can provide any additional information.

    Steps to reproduce:

    1. Clone https://github.com/TRowbotham/Encoding
    2. Run composer install
    3. Run php -dextension=<path-to-pcov> vendor/phpunit/phpunit/phpunit --coverage-html build/coverage

    These are the results of running pcov vs xdebug on my PC:

    $ php -dextension=/home/trevor/.phpbrew/php/php-7.4.20/lib/php/extensions/no-debug-non-zts-20190902/pcov.so vendor/phpunit/phpunit/phpunit --coverage-html build/coverage
    
    PHPUnit 9.5.4 by Sebastian Bergmann and contributors.
    
    Runtime:       PHP 7.4.20 with PCOV 1.0.8
    Configuration: /home/trevor/GitHub/Encoding/phpunit.xml
    
    .............................................................   61 / 1375 (  4%)
    .............................................................  122 / 1375 (  8%)
    .............................................................  183 / 1375 ( 13%)
    .............................................................  244 / 1375 ( 17%)
    .............................................................  305 / 1375 ( 22%)
    .............................................................  366 / 1375 ( 26%)
    .............................................................  427 / 1375 ( 31%)
    .............................................................  488 / 1375 ( 35%)
    .............................................................  549 / 1375 ( 39%)
    .............................................................  610 / 1375 ( 44%)
    .............................................................  671 / 1375 ( 48%)
    .............................................................  732 / 1375 ( 53%)
    .............................................................  793 / 1375 ( 57%)
    .............................................................  854 / 1375 ( 62%)
    .............................................................  915 / 1375 ( 66%)
    .............................................................  976 / 1375 ( 70%)
    ............................................................. 1037 / 1375 ( 75%)
    ............................................................. 1098 / 1375 ( 79%)
    ............................................................. 1159 / 1375 ( 84%)
    ............................................................. 1220 / 1375 ( 88%)
    ............................................................. 1281 / 1375 ( 93%)
    ............................................................. 1342 / 1375 ( 97%)
    .................................                             1375 / 1375 (100%)
    
    Time: 01:37.026, Memory: 13.84 GB
    
    OK (1375 tests, 427415 assertions)
    
    $ php -dzend_extension=/home/trevor/.phpbrew/php/php-7.4.20/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so -dxdebug.mode=coverage vendor/phpunit/phpunit/phpunit --coverage-html build/coverage
    
    PHPUnit 9.5.4 by Sebastian Bergmann and contributors.
    
    Runtime:       PHP 7.4.20 with Xdebug 3.0.4
    Configuration: /home/trevor/GitHub/Encoding/phpunit.xml
    
    .............................................................   61 / 1375 (  4%)
    .............................................................  122 / 1375 (  8%)
    .............................................................  183 / 1375 ( 13%)
    .............................................................  244 / 1375 ( 17%)
    .............................................................  305 / 1375 ( 22%)
    .............................................................  366 / 1375 ( 26%)
    .............................................................  427 / 1375 ( 31%)
    .............................................................  488 / 1375 ( 35%)
    .............................................................  549 / 1375 ( 39%)
    .............................................................  610 / 1375 ( 44%)
    .............................................................  671 / 1375 ( 48%)
    .............................................................  732 / 1375 ( 53%)
    .............................................................  793 / 1375 ( 57%)
    .............................................................  854 / 1375 ( 62%)
    .............................................................  915 / 1375 ( 66%)
    .............................................................  976 / 1375 ( 70%)
    ............................................................. 1037 / 1375 ( 75%)
    ............................................................. 1098 / 1375 ( 79%)
    ............................................................. 1159 / 1375 ( 84%)
    ............................................................. 1220 / 1375 ( 88%)
    ............................................................. 1281 / 1375 ( 93%)
    ............................................................. 1342 / 1375 ( 97%)
    .................................                             1375 / 1375 (100%)
    
    Time: 02:04.912, Memory: 68.00 MB
    
    OK (1375 tests, 427415 assertions)
    
    Reviewed by TRowbotham at 2021-06-06 04:47
  • 6. Undefined variable: argv when running

    Running PHPUnit on https://github.com/vimeo/psalm I get

    > vendor/bin/phpunit
    PHPUnit 8.1.6 by Sebastian Bergmann and contributors.
    
    Runtime:       PHP 7.3.5 with PCOV 1.0.5
    Configuration: /xxx/psalm/phpunit.xml.dist
    
    Undefined variable: argv
    

    It works just fine without pcov enabled. Unsure how to proceed.

    register_argc_argv = Off
    

    in my php.ini (but setting it to On doesn't help either).

    Reviewed by muglug at 2019-06-11 17:42
  • 7. Code that is not executed is reported as being executed

    When I run the tests for the diff test suite with code coverage reporting based on PCOV then I get two tests marked as risky:

    There were 2 risky tests:
    
    1) SebastianBergmann\Diff\DifferTest::testArrayRepresentationOfDiffCanBeRenderedUsingTimeEfficientLcsImplementation with data set #0 (array(array('a', 2), array('b', 1)), 'a', 'b')
    This test executed code that is not listed as code to be covered or used:
    - SebastianBergmann\Diff\Chunk::__construct
    - SebastianBergmann\Diff\Diff::__construct
    - SebastianBergmann\Diff\Diff::getChunks
    - SebastianBergmann\Diff\Diff::setChunks
    
    2) SebastianBergmann\Diff\MemoryEfficientImplementationTest::testBothEmpty
    This test executed code that is not listed as code to be covered or used:
    - SebastianBergmann\Diff\Line::__construct
    - SebastianBergmann\Diff\Line::getContent
    

    These tests are not marked as risky when code coverage is reported using Xdebug or PHPDBG.

    When I add an exit statement to the constructor of Chunk like so

    diff --git a/src/Chunk.php b/src/Chunk.php
    index d030954..21f3367 100644
    --- a/src/Chunk.php
    +++ b/src/Chunk.php
    @@ -39,6 +39,7 @@ final class Chunk
     
         public function __construct(int $start = 0, int $startRange = 1, int $end = 0, int $endRange = 1, array $lines = [])
         {
    +        exit;
             $this->start      = $start;
             $this->startRange = $startRange;
             $this->end        = $end;
    

    and run the testArrayRepresentationOfDiffCanBeRenderedUsingTimeEfficientLcsImplementation test (./vendor/bin/phpunit --filter testArrayRepresentationOfDiffCanBeRenderedUsingTimeEfficientLcsImplementation) then it works, meaning the exit statement is not reached, meaning that Chunk is not used.

    When I add an exit statement to the constructor of Diff like so

    diff --git a/src/Diff.php b/src/Diff.php
    index 3029e59..ea5c15d 100644
    --- a/src/Diff.php
    +++ b/src/Diff.php
    @@ -34,6 +34,7 @@ final class Diff
          */
         public function __construct(string $from, string $to, array $chunks = [])
         {
    +        exit;
             $this->from   = $from;
             $this->to     = $to;
             $this->chunks = $chunks;
    

    and run the testArrayRepresentationOfDiffCanBeRenderedUsingTimeEfficientLcsImplementation test (./vendor/bin/phpunit --filter testArrayRepresentationOfDiffCanBeRenderedUsingTimeEfficientLcsImplementation) then it works, meaning the exit statement is not reached, meaning that Diff is not used.

    When I add an exit statement to the constructor of Line like so

    diff --git a/src/Line.php b/src/Line.php
    index 125bafd..0ec4266 100644
    --- a/src/Line.php
    +++ b/src/Line.php
    @@ -28,6 +28,7 @@ final class Line
     
         public function __construct(int $type = self::UNCHANGED, string $content = '')
         {
    +        exit;
             $this->type    = $type;
             $this->content = $content;
         }
    

    and run the testBothEmpty test (./vendor/bin/phpunit --filter testBothEmpty) then it works, meaning the exit statement is not reached, meaning that Line is not used.

    How to run the tests where I see the problem

    git clone https://github.com/sebastianbergmann/diff.git
    cd diff
    composer install
    ./vendor/bin/phpunit
    
    Reviewed by sebastianbergmann at 2019-05-29 06:07
  • 8. Release v1.0.4

    • Fix #17 Lines not covered when more tests are run
    • Improve perf of clear routine
    • Merge upstream cfg updates (switch block change)
    • Omit ignored opcodes from internal coverage data completely (doesn't effect users, except less memory used)

    over to you @remicollet, thanks :)

    Reviewed by krakjoe at 2019-06-02 19:22
  • 9. cfg/800 missing

    At least when building with PHP 8.0 on Windows, I get

    ext\pcov\pcov.c(32): fatal error C1083: Datei (Include) kann nicht geöffnet werden: "zend_cfg.h": No such file or directory
    
    Reviewed by cmb69 at 2021-03-19 13:01
  • 10. [WIP] Lines marked as red or white but never green

    Hi, I'm having issues on how PCOV reports some lines.

    This is a WIP since I know all the following details still aren't enough for you to help me, I need to dig deeper and isolate better where the problem lies, but still I prefer to open an Issue now, maybe you can help me find it.

    Env details

    1. Codeception 3.0
    2. PHPUnit 8.3.3
    3. php-code-coverage 7.0.7
    4. PHP 7.3.8
    5. PCOV 1.0.6
    6. OS: Docker, see https://github.com/Slamdunk/docker-php/blob/master/7.3.Dockerfile#L53

    1) Executed lines may differ depending on the run

    Two different runs, the only change was removing every @covers annotations from unit and functional tests.

    Without @covers: pcov-full

    With @covers: pcov-part

    All 3 lines 60, 61 and 62 are executed for sure, as lines 62 is green, but the output differs.

    1. How can lines 60 and 61 marked as red?
    2. How is that executed lines differ?

    2) Function parameters may be signed as executed or not

    pcov-wut

    1. How can lines 990 and 991 not marked as executed?
    Reviewed by Slamdunk at 2019-08-19 13:51
  • 11. Release 1.0.0

    Hi Remi :)

    I know you're afk at the moment ... whenever you've time ...

    Release v1.0.0 is ready for PECL ... I know I said the API was stable, but I changed it, hence version bump.

    I think I've removed all the unused stuff, but if you could cast your eye over it, that'd be good.

    The changelog should be brief, just "Import Zend CFG" or something. Probably still go with beta, even though the CFG is probably some of the best tested code in the ecosystem, let us be cautious ...

    Thanks in advance, hope you're enjoying conference :)

    Reviewed by krakjoe at 2019-01-25 13:34
  • 12. Weird coverage on match statements

    I'm seeing some weird results in code coverage for match statements: image

    Note that this sample code is intentionally broken so that we're 100% sure that PHP is not executing the lines pcov claims are covered.

    Reviewed by SamMousa at 2022-05-18 12:23
  • 13. Feature request : make pcov.directory load from coverage list in phpunit or a config file

    So far this is the only thing which it's not that great to work with in your extension, adding dpcov.directory manually is a little troublesome you see for instance I use Intellij Idea which let's you run tests with its ui, adding this option every time manually not only is time consuming but it causes a lot of errors by different members of the team.

    I'm not really familiar with how php extensions are written but if it is possible to read phpunit.xml config directly in your plugin, using the coverage array of includes could easily get the highest root and that could be set as default, that way we can have a better default directory, don't you think so? Xdebug doesn't have this problem as I tested so it's doing something like that.

    Example : https://github.com/krakjoe/pcov/issues/37 https://github.com/krakjoe/pcov/issues/34

    and many more like one of mine :

        <coverage processUncoveredFiles="true" includeUncoveredFiles="true">
            <include>
                <directory suffix=".php">./app/Http/Controllers</directory>
                <directory suffix=".php">./../../../dir/plugins/store_management</directory>
            </include>
            <exclude>
            </exclude>
        </coverage>
    
    Reviewed by Stevemoretz at 2022-04-15 15:30
  • 14. Pcov shows less covered files than xDebug in coverage results

    For a few tests pcov shows a 0% coverage result instead of xDebug, which reports more files covered. XDebug results are more accurate in that manner.

    How to tune up pcov so that results would be more similar to xDebug and it would include all actually covered files?

    where could be an issue?

    Reviewed by theKosmoss at 2022-03-23 13:32
  • 15. pcov core dump issue in php 8.1 with phpunit @runInSeparateProcess

    We have issue in DoctrineBundle with following test in PHP 8.1

    https://github.com/doctrine/DoctrineBundle/blob/4fd840eb3c6469619be34d473af3dbc3a6b2a957/Tests/DependencyInjection/ConfigurationTest.php, see https://github.com/doctrine/DoctrineBundle/commits/test-failure-experiment and one of its CI failures

    Above is reduced version of the file after troubleshooting it to shrink down the reproducer, original version was https://github.com/doctrine/DoctrineBundle/blob/2.5.x/Tests/DependencyInjection/ConfigurationTest.php

    This issue happens most of the times, but not always. When it doesn't result in failure, I just rerun the build and then it fails.

    As you can see in commit history, looks like issue doesn't happen if I remove other dependecies that we use (I've ensured that's the case by rerunning this successful build several times), so it's probably also related to number of files that's loaded?

    After experimentation, what I can say is that it looks like all 3 things you can see in file: assertFalse() class_exists() loading class in separate file (new Configuration()) - inlining the class via anonymous class doesn't reproduce the issue

    are required to reproduce issue.

    Reviewed by ostrolucky at 2021-12-29 12:12
  • 16. Github actions CI on Windows

    See #81. For now this just builds the extension and runs the tests like on AppVeyor. However, packaging for download is not yet done, but that appears to be acceptable for now.

    PS: https://github.com/cmb69/pcov/actions/runs/1606525383

    Reviewed by cmb69 at 2021-12-21 11:22
Handle PHP errors, dump variables, execute PHP code remotely in Google Chrome

PHP Console server library PHP Console allows you to handle PHP errors & exceptions, dump variables, execute PHP code remotely and many other things u

May 19, 2022
PHP APM (Alternative PHP Monitor)

APM (Alternative PHP Monitor) APM (Alternative PHP Monitor) is a monitoring extension enabling native Application Performance Management (APM) for PHP

May 19, 2022
Zipkin PHP is the official PHP Tracer implementation for Zipkin

Zipkin PHP is the official PHP Tracer implementation for Zipkin, supported by the OpenZipkin community. Installation composer require openz

May 14, 2022
Debug bar for PHP
Debug bar for PHP

PHP Debug Bar Displays a debug bar in the browser with information from php. No more var_dump() in your code! Features: Generic debug bar Easy to inte

May 11, 2022
Xdebug — Step Debugger and Debugging Aid for PHP

Xdebug Xdebug is a debugging tool for PHP. It provides step-debugging and a whole range of development aids, such as stack traces, a code profiler, fe

May 13, 2022
Kint - a powerful and modern PHP debugging tool.
Kint - a powerful and modern PHP debugging tool.

Kint - debugging helper for PHP developers What am I looking at? At first glance Kint is just a pretty replacement for var_dump(), print_r() and debug

May 14, 2022
😎 Tracy: the addictive tool to ease debugging PHP code for cool developers. Friendly design, logging, profiler, advanced features like debugging AJAX calls or CLI support. You will love it.
😎 Tracy: the addictive tool to ease debugging PHP code for cool developers. Friendly design, logging, profiler, advanced features like debugging AJAX calls or CLI support. You will love it.

Tracy - PHP debugger Introduction Tracy library is a useful helper for everyday PHP programmers. It helps you to: quickly detect and correct errors lo

May 20, 2022
PHP Benchmarking framework
PHP Benchmarking framework

PHPBench is a benchmark runner for PHP analogous to PHPUnit but for performance rather than correctness. Features include: Revolutions: Repeat your co

May 22, 2022
The Interactive PHP Debugger

The interactive PHP debugger Implemented as a SAPI module, phpdbg can exert complete control over the environment without impacting the functionality

Apr 26, 2022
Dontbug is a reverse debugger for PHP
Dontbug is a reverse debugger for PHP

Dontbug Debugger Dontbug is a reverse debugger (aka time travel debugger) for PHP. It allows you to record the execution of PHP scripts (in command li

May 8, 2022
PHP Debug Console
PHP Debug Console

PHP Console A web console to try your PHP code into Creating a test file or using php's interactive mode can be a bit cumbersome to try random php sni

May 14, 2022
Php Debugger to run in terminal to debug your code easily.
Php Debugger to run in terminal to debug your code easily.

What is Dephpugger? Dephpugger (read depugger) is an open source lib to make a debug in php direct in terminal, without necessary configure an IDE. Th

Jan 12, 2022
Low-overhead sampling profiler for PHP 7+
Low-overhead sampling profiler for PHP 7+

phpspy phpspy is a low-overhead sampling profiler for PHP. For now, it works with Linux 3.2+ x86_64 non-ZTS PHP 7.0+ with CLI, Apache, and FPM SAPIs.

May 14, 2022
The VarDumper component provides mechanisms for walking through any arbitrary PHP variable. It provides a better dump() function that you can use instead of var_dump().

VarDumper Component The VarDumper component provides mechanisms for walking through any arbitrary PHP variable. It provides a better dump() function t

May 18, 2022
PHP errors for cool kids
PHP errors for cool kids

whoops PHP errors for cool kids whoops is an error handler framework for PHP. Out-of-the-box, it provides a pretty error interface that helps you debu

May 18, 2022
Clockwork - php dev tools in your browser - server-side component
Clockwork - php dev tools in your browser - server-side component

Clockwork is a development tool for PHP available right in your browser. Clockwork gives you an insight into your application runtime - including requ

May 18, 2022
Laravel Debugbar (Integrates PHP Debug Bar)
Laravel Debugbar (Integrates PHP Debug Bar)

Laravel Debugbar This is a package to integrate PHP Debug Bar with Laravel. It includes a ServiceProvider to register the debugbar and attach it to th

May 24, 2022
This package connects a Laravel Octance application with Tideways for PHP Monitoring, Profiling and Exception Tracking.

Tideways Middleware for Laravel Octane This package connects a Laravel Octance application with Tideways for PHP Monitoring, Profiling and Exception T

Jan 6, 2022
A tool to profile mysql queries in php env.
A tool to profile mysql queries in php env.

MysqlQueryProfiler This tool helps you to quickly profile a mysql query in a PHP 7.4+ environnement. You can also compare 2 queries. This image shows

Jul 30, 2021