亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 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 關注
  • 162 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號