代码之家  ›  专栏  ›  技术社区  ›  eithed

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

  •  17
  • eithed  · 技术社区  · 7 年前

    我真的不知道发生了什么事——这一切都是从 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
    
    2 回复  |  直到 7 年前
        1
  •  11
  •   eithed    7 年前

    我们找到了一个关于作曲家的问题 XdebugHandler.php::writeTmpIni 功能位于 vendor\composer\composer\src\Composer\XdebugHandler.php .

    显然,在应用程序初始化期间 php 进程派生为临时 php.ini ,php进程的测试传递给,但是 为什么? 我目前无法做到这一点。

    将在Laravel的bugtracker上标记该如何处理。

    作为一个包(在我的例子中),添加Composer的依赖性是 larapack/hooks ,这本身就是 larapack/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上发生的讨论,并自行决定);老实说,报道这个问题让我吃了一口苦头,我不会再追问下去了。


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

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

        2
  •  1
  •   Alex    7 年前

    我以前还有一些奇怪的问题。 似乎您正在使用Windows计算机作为开发工具。 我不确定您的php安装情况。但发生在我身上的事情是,我有很多不同的apache、php、phpunit、nginx和mysql实例,它们都位于不同的文件夹中。

    我的观点是,您的机器上似乎安装了许多php。 出于某种原因,OP中描述的2个案例使用了不同的php解释器。

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

    但您可以只输出

    echo PHP_BINDIR;
    

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