代码之家  ›  专栏  ›  技术社区  ›  CJ Dennis

在PHP中设置环境变量对一个用户有效,但对另一个用户无效

  •  0
  • CJ Dennis  · 技术社区  · 6 年前

    一个用户一直在帮我解决一个问题( How to force a curl request in a PHP method to fail for a unit test ). 他们建议这样做 putenv('all_proxy=localhost:5678'); 所以我可以强迫你 curl 在单元测试中动态失败(我改变了 http_proxy / https_proxy 到 all_proxy 因为它执行所有协议)。

    任何一个 我的Windows 10机箱 或者Ubuntu盒 . 如果我设定 卷曲

    php.ini 这就决定了 putenv() 是否可以覆盖环境中的变量?为什么动态环境变量可以工作 他们的设置,但不是我的 不是Windows而是Ubuntu?

    测试脚本

    <?php
    
    function search() {
      $url = 'x3m.dev';
    
      $curl = curl_init();
      curl_setopt_array($curl, [
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_URL => $url,
      ]);
      $data = curl_exec($curl);
    
      if (!$data) {
        throw new Exception('An error occurred while trying to process the request.');
      }
      return $data;
    }
    
    function do_curl_request() {
      echo getenv('all_proxy') . "\n\n";
      try {
        echo search();
      }
      catch (Exception $e) {
        echo $e->getMessage();
      }
      echo "\n\n";
    }
    
    echo "========== first run without proxy\n";
    do_curl_request();
    
    putenv('all_proxy=localhost:5678');
    echo "========== second run with proxy override\n";
    do_curl_request();
    

    所有代理 未设置为Windows环境变量,如果 一切就绪。

    窗口(不正确)

    ========== first run without proxy
    
    
    <html>
    <head></head>
    <body>.</body>
    </html>
    
    ========== second run with proxy override
    localhost:5678
    
    <html>
    <head></head>
    <body>.</body>
    </html>
    

    Ubuntu(正确)

    ========== first run without proxy
    
    
    <html>
    <head></head>
    <body>.</body>
    </html>
    
    ========== second run with proxy override
    localhost:5678
    
    An error occurred while trying to process the request.
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Sherif    6 年前

    必须认识到PHP不会从用户环境导入任何内容。它有自己的独立环境,每个请求都有一个独立的环境(也就是说,每个请求都会清理它) RSHUTDOWN 事件)。在php中执行的任何操作(例如。 putenv()

    putenv

    加上 背景

        2
  •  0
  •   CJ Dennis    6 年前

    TL;博士

    这是一个bug,在PHP7.3.17和7.4.5(2020年3月)中进行了修补。早期版本没有已知的解决方法。


    1. 此错误仅存在于Windows上
    2. 我创造了一个 PHP bug report
    3. 此错误以前已被注意到,并且 fixed in PHP 5 ,但仅适用于非线程安全版本:
      • PHP 5.4.36非线程安全(2014年12月17日)
      • PHP 5.6.4非线程安全(2014年11月27日)
    4. 该漏洞被标记为“部分修复”,但无论如何都被意外关闭,因为它从人们的雷达上脱落,阻止了进一步的工作
    5. 获取/设置环境变量有两种可能的内部调用:
      • SetEnvironmentVariable() GetEnvironmentVariable() (线程安全)
      • putenv() / getenv() (非线程安全)
    6. getenv() 无法看到由所做的更改
    7. A. cURL bug report 现在已经创建了

    A fix for cURL

    我创建的PHP bug报告中有一条说明:

    libcurl 7.69.1已经发布,它修复了这个问题,并且将 用于PHP7.3.17和7.4.5Windows版本,因此

    推荐文章