Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中设置环境变量对一个用户有效,但对另一个用户无效_Php_Windows_Environment Variables_Command Line Interface - Fatal编程技术网

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

在PHP中设置环境变量对一个用户有效,但对另一个用户无效,php,windows,environment-variables,command-line-interface,Php,Windows,Environment Variables,Command Line Interface,一个用户一直在帮我解决一个问题()。他们建议做putenv('all_proxy=localhost:5678')因此我可以强制curl在单元测试中动态失败(我将http\u proxy/https\u proxy更改为all\u proxy,因为它执行所有协议) 这在他们的UbuntuBox上运行得非常好,但我无法让它在我的Windows10或UbuntuBox上运行。如果我在命令提示符下设置all\u proxy,则curl请求总是失败,因此它会在找到变量时注意到它。我稍微改变了他们的脚本,

一个用户一直在帮我解决一个问题()。他们建议做
putenv('all_proxy=localhost:5678')
因此我可以强制
curl
在单元测试中动态失败(我将
http\u proxy
/
https\u proxy
更改为
all\u proxy
,因为它执行所有协议)

这在他们的UbuntuBox上运行得非常好,但我无法让它在我的Windows10或UbuntuBox上运行。如果我在命令提示符下设置
all\u proxy
,则
curl
请求总是失败,因此它会在找到变量时注意到它。我稍微改变了他们的脚本,这似乎使它在Ubuntu上工作

php.ini
中是否有一些设置控制
putenv()
是否可以覆盖环境中的变量?为什么动态环境变量在他们的设置上工作,但在我的Ubuntu和Windows上都不工作

测试脚本
必须认识到PHP不会从用户环境导入任何内容。它有自己的独立环境,每个请求都有一个(即,解释器中的每个
RSHUTDOWN
事件都会清理它)。在php中所做的任何事情(例如,
putenv()
)都严格遵守该请求。您在shell中所做的操作对PHP环境没有影响

设置添加到服务器环境中。环境变量仅在当前请求期间存在。在请求结束时,环境将恢复到其原始状态

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


你坐得舒服吗?那我们开始吧

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

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

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


    如果我在命令提示符下设置了all_proxy,curl请求总是会失败,因此它会在找到变量时注意到该变量。
    您的答案与我可以通过实验验证的结果相反。我向您保证,事实并非如此。如果真是这样,那将是一个巨大的安全问题。PHP的环境在设计上是独立的。我建议您尝试设置环境变量并运行其他用户给我的脚本,好吗?这里讨论的PHP代码不是问题所在。事实上,您相信可以从命令提示符设置环境变量,PHP将神奇地导入该环境变量。不会的。必须使用
    putenv()
    在PHP内部设置该环境变量。请解释如何通过在命令提示符下设置环境变量来更改PHP的行为。(这不是假设,但当你重新运行脚本时,现实生活中的行为实际上是如何变化的)localhost:5678你设置了localhost代理吗?@Popeye否。关键是它应该失败,因为
    localhost:5678
    没有这样的服务。
    ========== first run without proxy
    
    
    <html>
    <head></head>
    <body>.</body>
    </html>
    
    ========== second run with proxy override
    localhost:5678
    
    <html>
    <head></head>
    <body>.</body>
    </html>
    
    ========== 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.