根据代码内容加载不同的 php.ini文件

2022-08-30 23:39:09

我真的不知道发生了什么 - 这一切都始于PHPUnit错误,当试图运行测试覆盖率报告时,并以我调试到下面描述的可复制集结束。但是为了设置舞台 - 我使用的是Laravel 5.5,Xdebug 2.5.5,PHPUnit 6.5.5。我的测试代码说明了这个问题:Error: No code coverage driver is available

<?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

答案 1

我们已将其追溯到 位于 中的 Composer 函数的问题。XdebugHandler.php::writeTmpInivendor\composer\composer\src\Composer\XdebugHandler.php

显然,在应用程序初始化期间,一个单独的进程会生成临时,并且该php进程是传递到的测试,但是为什么这样做目前超出了我的范围。phpphp.ini

将在Laravel的错误跟踪器上标记它,以便如何处理它。

将 Composer 添加为包的依赖性(在我的情况下)是 ,它本身就是 的依赖性,这本身就是 Voyager 的依赖性。larapack/hookslarapack/voyager-hooks

据我所知,在 Laravel 应用程序的初始化过程中,不应该触发此行为(为什么要初始化不需要的依赖项,至少是显式初始化)。为什么作曲家在那个阶段触发自己也超出了我的范围。

我们应用的解决方案是添加:

<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上发生的讨论,并就此事做出自己的决定);说实话,报道这个问题在我的嘴里留下了酸味,我不会再追究它了。


我还提出了一个关于处理5.5 - https://github.com/larapack/voyager-hooks/issues/16 中引入的服务提供商发现的问题larapack/voyager-hooks

此问题现已在larapack/hooks:v1.0.3


答案 2

我以前遇到过一些其他问题,对我来说似乎很奇怪。看起来你正在使用Windows机器作为你的开发人员。我不确定你的php安装。但是发生在我身上的事情是,我有很多不同的apache,phpunit,nginx,mysql实例,它们都位于不同的文件夹周围。

我的观点是,看起来你的机器上安装了很多php。由于某种原因,不同的php解释器被用于OP中描述的2种情况。

我可能是错的,并且仍然对我关于用于执行两个测试的命令和文件夹的评论没有响应。

但你可以只输出

echo PHP_BINDIR;

在两个测试中,以确保在这两种情况下都使用相同的php解释器。


推荐