【发布时间】:2020-04-20 06:56:47
【问题描述】:
一位用户一直在帮助我解决问题 (How to force a curl request in a PHP method to fail for a unit test)。他们建议使用putenv('all_proxy=localhost:5678');,这样我就可以强制curl 在单元测试中动态失败(我将http_proxy / https_proxy 更改为all_proxy,因为它执行所有协议)。
这在他们的 Ubuntu 机器上完美运行,但我无法让它在 either 我的 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,则两次都抛出异常。
Windows(不正确)
========== 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.
【问题讨论】:
-
localhost:5678你设置好你的本地代理了吗?
-
@Popeye 没有。关键是它应该失败,因为
localhost:5678没有这样的服务。
标签: php windows environment-variables command-line-interface