Подтвердить что ты не робот

Различные файлы php.ini загружаются в зависимости от содержимого кода

Я действительно теряю то, что происходит - все началось с ошибки PHPUnit Error: No code coverage driver is available при попытке запустить отчет по охвату тестирования и закончилась тем, что я отлаживаю реплицируемый набор, описанный ниже. Но чтобы создать сцену - я использую Laravel 5.5, Xdebug 2.5.5, PHPUnit 6.5.5. Мой тестовый код, который иллюстрирует проблему:

<?php

use Tests\TestCase;

class A extends TestCase
{
    public function testA()
    {
        echo( get_cfg_var('cfg_file_path')); exit;
    }
}

выходы C:\Users\xxx\AppData\Local\Temp\7598.tmp

сравните его с этим кодом, который выводит правильный путь php.ini:

<?php

use PHPUnit\Framework\TestCase;

class A extends TestCase
{
    public function testA()
    {
        echo( get_cfg_var('cfg_file_path')); exit;
    }
}

выходы: C:\server\php\php.ini

Как это может быть? Как файл загруженного файла php.ini зависит от исполняемого кода? Еще лучше - как может быть загружен мой правильный файл php.ini(с поддержкой xdebug) вместо этого самозванца?

В обоих случаях тесты запускаются с использованием phpunit tests\unit\a

Структура папок:

Laravel Project
└───tests
    └───Unit
        └───A.php
4b9b3361

Ответ 1

Мы отследили его до проблемы с функцией Composer XdebugHandler.php::writeTmpIni, расположенной в vendor\composer\composer\src\Composer\XdebugHandler.php.

Очевидно, что во время инициализации приложения отдельный процесс php генерируется с временным php.ini, и к этому процессу php передается тест, но почему он выполняется, поэтому в настоящее время меня нет.

Будет отмечать это на Laurvel bugtracker в отношении того, что с этим делать.

Зависимость, которая добавляет Composer, как пакет (в моем случае), это larapack/hooks, что само по себе является зависимостью для larapack/voyager-hooks, которая сама по себе является зависимостью для Voyager.

Насколько я знаю, во время инициализации приложения Laravel это поведение не должно запускаться (зачем инициализировать зависимость, которая не требуется, по крайней мере, явно). Почему Composer запускается сам на этом этапе, также превосходит меня.

Мы применили следующее решение:

<php>
    <env name="COMPOSER_ALLOW_XDEBUG" value="1"/>
</php>

в файле phpunit.xml


Теперь я представил это как проблему: https://github.com/laravel/framework/issues/22782


За обсуждение GitHub это вызвано изменением в Laravel 5.5 в отношении обработки поставщиков услуг (https://laravel.com/docs/5.5/packages#package-discovery). Как он обновляется, я не знаю - для меня это изменение между 5.4 и 5.5, которое заслуживает внимания в обновлениях (но, пожалуйста, прочитайте дискуссию, которая произошла в Github, и сделайте свое собственное решение по этому вопросу); честно говоря, сообщение об этом вопросе оставило кислый вкус во рту, и я не буду продолжать его дальше.


Я также открыл проблему на larapack/voyager-hooks в отношении обнаружения поставщиков сервисных услуг, введенных в 5.5 - https://github.com/larapack/voyager-hooks/issues/16 p >

Теперь это исправлено в larapack/hooks:v1.0.3

Ответ 2

У меня были некоторые другие проблемы, которые раньше казались мне странными. Кажется, вы используете Windows-машину как ваш dev. Я не уверен в вашей установке php. Но что со мной произошло, у меня было много разных экземпляров apache, php, phpunit, nginx, mysql, расположенных по разным папкам.

Моя точка зрения заключается в том, что на вашем компьютере установлено много php. И по некоторым причинам разные интерпретаторы php используются для двух случаев, описанных в OP.

Я могу ошибаться и до сих пор не ответил на мои комментарии о командах и папках, которые вы используете для выполнения обоих тестов.

Но вы можете просто выводить

echo PHP_BINDIR;

в обоих тестах, чтобы убедиться, что один и тот же интерпретатор php используется в обоих случаях.