なぜか今までまったく気づかなかった。
次のような .htaccess
をドキュメントルートに置きます。
.htaccess
SetEnv http_proxy http://192.0.2.123:8080
次のコードをドキュメントルートに置いて表示すると、コメントに記載した通りに出力されます。
<?php
var_dump(getenv('http_proxy')); // "http://192.0.2.123:8080"
var_dump(trim(`env|grep http_proxy`)); // ""
putenv('http_proxy=http://192.0.2.123:8080');
var_dump(getenv('http_proxy')); // "http://192.0.2.123:8080"
var_dump(trim(`env|grep http_proxy`)); // "http_proxy=http://192.0.2.123:8080"
putenv
より前の場合、.htaccess
の SetEnv
の値が getenv
なら取得できるにも関わらず /usr/bin/env
の結果に http_proxy
が含まれません。
putenv
の後の場合、/usr/bin/env
の結果にも http_proxy
が含まれます。
次のようなコードでも、1回目の curl_exec
はプロキシを経由しませんが、2回目の curl_exec
はプロキシを経由します。
<?php
var_dump(getenv('http_proxy')); // "http://192.0.2.123:8080"
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.yahoo.co.jp/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
var_dump(curl_exec($ch));
curl_close($ch);
putenv('http_proxy=http://192.0.2.123:8080');
var_dump(getenv('http_proxy')); // "http://192.0.2.123:8080"
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.yahoo.co.jp/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
var_dump(curl_exec($ch));
curl_close($ch);
PHP の getenv は getenv の単なるラッパーではなく、SAPI によって微妙に異なるようです。