为了账号安全,请及时绑定邮箱和手机立即绑定

在 PHP 中设置环境变量适用于一个用户,但不适用于另一个用户

在 PHP 中设置环境变量适用于一个用户,但不适用于另一个用户

PHP
慕容森 2022-07-09 16:09:18
一位用户一直在帮助我解决一个问题(如何强制 PHP 方法中的 curl 请求失败以进行单元测试)。他们建议这样做putenv('all_proxy=localhost:5678');,我可以强制curl在单元测试中动态失败(我将http_proxy/更改https_proxy为,all_proxy因为它执行所有协议)。这在他们的 Ubuntu 盒子上完美运行,但我无法让它在我的 Windows 10 盒子或 Ubuntu 盒子上运行。如果我all_proxy从命令提示符设置,curl请求总是失败,所以它会在找到变量时注意到它。我稍微更改了他们的脚本,这似乎让它在 Ubuntu 上运行。是否有一些设置php.ini可以控制是否putenv()可以覆盖环境中的变量?为什么动态环境变量在他们的设置上起作用,但在我的任何一个Ubuntu 上都不起作用,而在 Windows 上不起作用?测试脚本<?phpfunction 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 上,如果all_proxy未设置为 Windows 环境变量,则它两次都有效,如果设置,则两次都抛出异常all_proxy。窗户(不正确)========== first run without proxy<html><head></head><body>.</body></html>========== second run with proxy overridelocalhost:5678<html><head></head><body>.</body></html>Ubuntu(正确)========== first run without proxy<html><head></head><body>.</body></html>========== second run with proxy overridelocalhost:5678An error occurred while trying to process the request.
查看完整描述

2 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

重要的是要认识到 PHP 不会从用户环境中导入任何内容。RSHUTDOWN它有它自己的独立环境,它是每个请求的(即它被解释器中的每个事件清理)。您在 php (ie putenv()) 中所做的任何事情都严格遵守该请求。您在 shell 中所做的操作不会影响 PHP 的环境。

putenv

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


查看完整回答
反对 回复 2022-07-09
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

这是一个错误,已在 PHP 7.3.17 和 7.4.5(2020 年 3 月)中修复。早期版本没有已知的解决方法。


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

  1. 此错误仅存在于 Windows

  2. 我创建了一个PHP 错误报告

  3. 这个错误以前在 PHP 5 中被注意到并修复,但仅适用于非线程安全版本:

    • PHP 5.4.36 非线程安全(2014 年 12 月 17 日)

    • PHP 5.5.20 非线程安全(2014 年 11 月 26 日)

    • PHP 5.6.4 非线程安全(2014 年 11 月 27 日)

  4. 该错误被标记为“部分修复”,但还是被意外关闭,阻止了对该错误的进一步研究,因为它从人们的视线中消失了

  5. 有两种可能的内部调用来获取/设置环境变量:

    • SetEnvironmentVariable()GetEnvironmentVariable()(线程安全)

    • putenv()getenv()(非线程安全)

  6. cURL 使用getenv()无法看到由SetEnvironmentVariable()

  7. 现已创建cURL 错误报告

对 cURL 的修复已于 2020 年 2 月 12 日合并。此修复程序于 2020 年 3 月 4 日在 cURL 7.69 中发布。

我创建的关于 PHP 错误报告的注释说:

libcurl 7.69.1 已经发布,修复了这个问题,并将用于 PHP 7.3.17 和 7.4.5 Windows 版本,所以我要关闭这张票。


查看完整回答
反对 回复 2022-07-09
  • 2 回答
  • 0 关注
  • 177 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号