Xdebug 2.6.1 / PHP 7.2.13, выход из выполнения в PhpStorm 2019.1 EAP при итерации объекта Traversable - PullRequest
0 голосов
/ 26 февраля 2019

Моя конфигурация:

  • Версия CakePHP: 3.6.13
  • Платформа и цель: PHP 7.2, MySQL 5.7, Ubuntu 16.04.5 LTS, Vagrant, Apache, php-fpm, PhpStorm 2019.1 EAP

выход php -v

PHP 7.2.13-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Dec  7 2018 08:07:08) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.13-1+ubuntu16.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v2.6.1, Copyright (c) 2002-2018, by Derick Rethans

xdebug config

/etc/php/7.2/cli/conf.d/99-xdebug.ini,
xdebug
xdebug support => enabled
xdebug.auto_trace => Off => Off
xdebug.cli_color => 0 => 0
xdebug.collect_assignments => Off => Off
xdebug.collect_includes => On => On
xdebug.collect_params => 0 => 0
xdebug.collect_return => Off => Off
xdebug.collect_vars => Off => Off
xdebug.coverage_enable => On => On
xdebug.default_enable => On => On
xdebug.dump.COOKIE => no value => no value
xdebug.dump.ENV => no value => no value
xdebug.dump.FILES => no value => no value
xdebug.dump.GET => no value => no value
xdebug.dump.POST => no value => no value
xdebug.dump.REQUEST => no value => no value
xdebug.dump.SERVER => no value => no value
xdebug.dump.SESSION => no value => no value
xdebug.dump_globals => On => On
xdebug.dump_once => On => On
xdebug.dump_undefined => Off => Off
xdebug.extended_info => On => On
xdebug.file_link_format => no value => no value
xdebug.filename_format => no value => no value
xdebug.force_display_errors => Off => Off
xdebug.force_error_reporting => 0 => 0
xdebug.gc_stats_enable => Off => Off
xdebug.gc_stats_output_dir => /tmp => /tmp
xdebug.gc_stats_output_name => gcstats.%p => gcstats.%p
xdebug.halt_level => 0 => 0
xdebug.idekey => PHPSTORM => PHPSTORM
xdebug.max_nesting_level => 256 => 256
xdebug.max_stack_frames => -1 => -1
xdebug.overload_var_dump => 2 => 2
xdebug.profiler_aggregate => Off => Off
xdebug.profiler_append => Off => Off
xdebug.profiler_enable => Off => Off
xdebug.profiler_enable_trigger => On => On
xdebug.profiler_enable_trigger_value => no value => no value
xdebug.profiler_output_dir => /tmp => /tmp
xdebug.profiler_output_name => cachegrind.out.%p => cachegrind.out.%p
xdebug.remote_addr_header => no value => no value
xdebug.remote_autostart => On => On
xdebug.remote_connect_back => Off => Off
xdebug.remote_cookie_expire_time => 3600 => 3600
xdebug.remote_enable => On => On
xdebug.remote_handler => dbgp => dbgp
xdebug.remote_host => 10.0.2.2 => 10.0.2.2
xdebug.remote_log => no value => no value
xdebug.remote_mode => req => req
xdebug.remote_port => 9000 => 9000
xdebug.remote_timeout => 200 => 200
xdebug.scream => Off => Off
xdebug.show_error_trace => Off => Off
xdebug.show_exception_trace => Off => Off
xdebug.show_local_vars => Off => Off
xdebug.show_mem_delta => Off => Off
xdebug.trace_enable_trigger => Off => Off
xdebug.trace_enable_trigger_value => no value => no value
xdebug.trace_format => 0 => 0
xdebug.trace_options => 0 => 0
xdebug.trace_output_dir => /tmp => /tmp
xdebug.trace_output_name => trace.%c => trace.%c
xdebug.var_display_max_children => 128 => 128
xdebug.var_display_max_data => 512 => 512
xdebug.var_display_max_depth => 3 => 3

Первоначально я опубликовал сообщение о том, что, как мне показалось, была ошибка в cakephp на GitHub.

См. https://github.com/cakephp/cakephp/issues/13020

В итоге оказалось, что foreach не перебирает объект Traversableсодержащий результаты запроса БД.Я подтвердил, что есть результаты для итерации, сначала преобразовав объект в массив, и проверка объекта в отладчике показывает, что есть элементы для итерации.После преобразования в массив foreach перебирает элементы, как и ожидалось.

Когда я отключил прослушивание xdebug, foreach будет перебирать объект Traversable, как и ожидалось, без предварительногопреобразование в массив .


Я попытался установить xdebug.collect_params=1, как @Asgraf предложил в моем исходном посте, но это ничего не исправило.


КогдаЯ пытаюсь оценить первый элемент в объекте Traversable в отладчике, перед циклом foreach, приведенным ниже, выполнение немедленно завершается.

        $mapper = $this->_mapper;

        foreach ($this->_data as $key => $val) {
            $mapper($val, $key, $this);
        }

Example of foreach loop with failing execution in debugger

Ниже приведена иерархия ResultSet, если она помогает обеспечить некоторую ясность.

Class hierarchy of ResultSet

Любое понимание того, что происходит или как исправить это странное поведение, будетс благодарностью.


ОБНОВЛЕНИЕ с ведением журнала

PhpStorm Log

2019-02-26 12:13:21,241 [ 967833]  DEBUG - il.connection.ServerConnection - Incoming connection on port 9000 from 127.0.0.1 
2019-02-26 12:13:21,247 [ 967839]  DEBUG - .connection.PhpDebugConnection - 1709495916#----connection started 
2019-02-26 12:13:21,332 [ 967924]  DEBUG - ains.php.run.filters.PhpFilter - Path mapper: com.jetbrains.php.util.pathmapper.PhpIdenticalPathMapper@294dfd25 
2019-02-26 12:13:21,332 [ 967924]  DEBUG - ains.php.run.filters.PhpFilter - Path mapper: com.jetbrains.php.util.pathmapper.PhpIdenticalPathMapper@1d499b6f 
2019-02-26 12:13:21,336 [ 967928]  DEBUG - ains.php.run.filters.PhpFilter - Path mapper: com.jetbrains.php.util.pathmapper.PhpRemotePathMapper@25da7f64 
2019-02-26 12:13:21,336 [ 967928]  DEBUG - .php.run.filters.PhpUnitFilter - Path mapper: com.jetbrains.php.util.pathmapper.PhpRemotePathMapper@25da7f64 
2019-02-26 12:13:21,336 [ 967928]  DEBUG - ains.php.run.filters.PhpFilter - Path mapper: com.jetbrains.php.util.pathmapper.PhpRemotePathMapper@25da7f64 
2019-02-26 12:13:21,482 [ 968074]  DEBUG - p.debug.common.PhpDebugProcess - 1947777361# Stop at ('file:///var/www/at/vendor/cakephp/cakephp/src/Collection/Iterator/MapReduce.php':177) 
2019-02-26 12:13:21,482 [ 968074]  DEBUG - p.debug.common.PhpDebugProcess - 1947777361# remote: 'file:///var/www/at/vendor/cakephp/cakephp/src/Collection/Iterator/MapReduce.php' <-> local: '/Users/myorkgitis/Documents/phpstorm-workspace/at/vendor/cakephp/cakephp/src/Collection/Iterator/MapReduce.php' 
2019-02-26 12:13:21,483 [ 968075]  DEBUG - p.debug.common.PhpDebugProcess - 1947777361# remote: 'file:///var/www/at/vendor/cakephp/cakephp/src/Collection/Iterator/MapReduce.php' <-> extracted: '/var/www/at/vendor/cakephp/cakephp/src/Collection/Iterator/MapReduce.php' 
2019-02-26 12:13:21,509 [ 968101]  DEBUG - ains.php.run.filters.PhpFilter - Path mapper: com.jetbrains.php.util.pathmapper.PhpIdenticalPathMapper@2f1cc1ce 
2019-02-26 12:13:21,510 [ 968102]  DEBUG - ains.php.run.filters.PhpFilter - Path mapper: com.jetbrains.php.util.pathmapper.PhpIdenticalPathMapper@484b8985 
2019-02-26 12:13:30,780 [ 977372]  DEBUG - p.debug.common.PhpDebugProcess - 1947777361# Stop at ('file:///var/www/at/vendor/cakephp/cakephp/src/Collection/Iterator/MapReduce.php':178) 
2019-02-26 12:13:30,780 [ 977372]  DEBUG - p.debug.common.PhpDebugProcess - 1947777361# remote: 'file:///var/www/at/vendor/cakephp/cakephp/src/Collection/Iterator/MapReduce.php' <-> local: '/Users/myorkgitis/Documents/phpstorm-workspace/at/vendor/cakephp/cakephp/src/Collection/Iterator/MapReduce.php' 
2019-02-26 12:13:30,780 [ 977372]  DEBUG - p.debug.common.PhpDebugProcess - 1947777361# remote: 'file:///var/www/at/vendor/cakephp/cakephp/src/Collection/Iterator/MapReduce.php' <-> extracted: '/var/www/at/vendor/cakephp/cakephp/src/Collection/Iterator/MapReduce.php' 
2019-02-26 12:13:37,262 [ 983854]  DEBUG - .connection.PhpDebugConnection - 1709495916#---input stream is finished 
2019-02-26 12:13:37,262 [ 983854]  DEBUG - .connection.PhpDebugConnection - 1709495916#---stop reading 
2019-02-26 12:13:37,262 [ 983854]  DEBUG - .connection.PhpDebugConnection - 1709495916#---stop writing 
2019-02-26 12:13:37,262 [ 983854]  DEBUG - .connection.PhpDebugConnection - 1709495916#----connection stopped 
2019-02-26 12:13:37,263 [ 983855]  DEBUG - il.connection.ServerConnection - ----socket closed 

xdebug log

В журнале xdebug нет ничего интересного.Нет ссылок на исключение или ошибку.

Вот несколько последних записей, которые выглядят безвредными, за исключением того факта, что журнал закрывается сразу после команды run ...

-> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="run" transaction_id="22" status="stopping" reason="ok"></response>

<- run -i 23
Log closed at 2019-02-26 17:27:27

Некоторые другие вещи дляnote

Сценарий выполняет итерацию по первому элементу, но сразу после него выходит из цикла foreach и продолжает оставшуюся часть запроса, возвращая данные в представление (ноконечно, только с одним результатом, вместо ожидаемого 10)

Я также проверил на PhpStorm 2018.3 и 2018.4, и поведение сохраняется.

...