在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.