根据代码内容加载不同的 php.ini 文件
Different php.ini file loaded dependant upon the code content
我真的对发生的事情一头雾水 - 这一切都始于尝试 运行 测试覆盖率报告时的 Error: No code coverage driver is available
PHPUnit 错误,并以我调试到如下所述的可复制集结束.但为了做好准备 - 我正在使用 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\Temp98.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
我们已将其追溯到 vendor\composer\composer\src\Composer\XdebugHandler.php
.
中 Composer 的 XdebugHandler.php::writeTmpIni
函数的问题
显然在 App 初始化期间,一个单独的 php
进程产生了临时的 php.ini
,并且 php 进程是测试传递给的,但是 为什么 完成了,目前我无法做到。
将在 Laravel 的错误跟踪器上标记它以了解如何处理此问题。
添加 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
此问题现已在 larapack/hooks:v1.0.3
中修复
我以前遇到过一些其他问题,这对我来说很奇怪。
看来您正在使用 Windows 机器作为您的开发者。
我不确定您的 php 安装。但是发生在我身上的是,我有很多不同的 apache 实例,php、phpunit、nginx、mysql 位于不同的文件夹中。
我的观点是您的计算机上似乎安装了很多 php。
出于某种原因,不同的 php 解释器用于 OP 中描述的 2 个案例。
我可能是错的,但我对您用于执行这两个测试的命令和文件夹的评论仍然没有回应。
但是你可以只输出
echo PHP_BINDIR;
在两个测试中确保在两种情况下都使用相同的 php 解释器。
我真的对发生的事情一头雾水 - 这一切都始于尝试 运行 测试覆盖率报告时的 Error: No code coverage driver is available
PHPUnit 错误,并以我调试到如下所述的可复制集结束.但为了做好准备 - 我正在使用 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\Temp98.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
我们已将其追溯到 vendor\composer\composer\src\Composer\XdebugHandler.php
.
XdebugHandler.php::writeTmpIni
函数的问题
显然在 App 初始化期间,一个单独的 php
进程产生了临时的 php.ini
,并且 php 进程是测试传递给的,但是 为什么 完成了,目前我无法做到。
将在 Laravel 的错误跟踪器上标记它以了解如何处理此问题。
添加 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
此问题现已在 larapack/hooks:v1.0.3
我以前遇到过一些其他问题,这对我来说很奇怪。 看来您正在使用 Windows 机器作为您的开发者。 我不确定您的 php 安装。但是发生在我身上的是,我有很多不同的 apache 实例,php、phpunit、nginx、mysql 位于不同的文件夹中。
我的观点是您的计算机上似乎安装了很多 php。 出于某种原因,不同的 php 解释器用于 OP 中描述的 2 个案例。
我可能是错的,但我对您用于执行这两个测试的命令和文件夹的评论仍然没有回应。
但是你可以只输出
echo PHP_BINDIR;
在两个测试中确保在两种情况下都使用相同的 php 解释器。