猿问

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

一位用户一直在帮助我解决一个问题(如何强制 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 上不起作用?


测试脚本

<?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 上,如果all_proxy未设置为 Windows 环境变量,则它两次都有效,如果设置,则两次都抛出异常all_proxy。


窗户(不正确)

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


慕容森
浏览 178回答 2
2回答

心有法竹

重要的是要认识到 PHP 不会从用户环境中导入任何内容。RSHUTDOWN它有它自己的独立环境,它是每个请求的(即它被解释器中的每个事件清理)。您在 php (ie&nbsp;putenv()) 中所做的任何事情都严格遵守该请求。您在 shell 中所做的操作不会影响 PHP 的环境。putenv将设置添加到服务器环境。环境变量仅在当前请求期间存在。在请求结束时,环境将恢复到其原始状态。

MMMHUHU

这是一个错误,已在 PHP 7.3.17 和 7.4.5(2020 年 3 月)中修复。早期版本没有已知的解决方法。你坐得舒服吗?那么让我们开始吧!此错误仅存在于 Windows我创建了一个PHP 错误报告这个错误以前在 PHP 5 中被注意到并修复,但仅适用于非线程安全版本:PHP 5.4.36 非线程安全(2014 年 12 月 17 日)PHP 5.5.20 非线程安全(2014 年 11 月 26 日)PHP 5.6.4 非线程安全(2014 年 11 月 27 日)该错误被标记为“部分修复”,但还是被意外关闭,阻止了对该错误的进一步研究,因为它从人们的视线中消失了有两种可能的内部调用来获取/设置环境变量:SetEnvironmentVariable()/&nbsp;GetEnvironmentVariable()(线程安全)putenv()/&nbsp;getenv()(非线程安全)cURL 使用getenv()无法看到由SetEnvironmentVariable()现已创建cURL 错误报告对 cURL 的修复已于 2020 年 2 月 12 日合并。此修复程序于 2020 年 3 月 4 日在 cURL 7.69 中发布。我创建的关于 PHP 错误报告的注释说:libcurl 7.69.1 已经发布,修复了这个问题,并将用于 PHP 7.3.17 和 7.4.5 Windows 版本,所以我要关闭这张票。
随时随地看视频慕课网APP
我要回答