一位用户一直在帮助我解决一个问题(如何强制 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.
慕容森
心有法竹
MMMHUHU
随时随地看视频慕课网APP