インターネットへの直接接続を許可しないプロキシサーバーの背後にいます。すべての私のPHPアプリケーションは、更新チェックなどのためにインターネットに接続できません。
PHPプロキシ設定はどうすればわかりますか?
コードにプロキシ設定を入力したくありません。PHP自体がグローバル設定設定または同様のものを介してそれを使用します。
ほとんどすべてのインターネットアクセスにプロキシが必要な場合は、このようにすることをお勧めします。
//add this as the first line of the entry file may it is the index.php or config.php
stream_context_set_default(['http'=>['proxy'=>'proxy-Host:proxy-port']]);
プロキシはfile_get_contents
だがしかし curl_exec
これは、PHPアプリケーションがインターネットに接続する方法によって異なります。
PHP cUrlを使用して最も可能性の高い状況をとる場合。
curl_setopt($handle, CURLOPT_PROXY, $proxy_url);
curl_setopt($handle, CURLOPT_PROXYUSERPWD, "[username]:[password]");
サンプルコード:
function getUrl($url)
{
$ch = curl_init();
$timeout = 5; // set to zero for no timeout
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, "http://proxy.example.com"); //your proxy url
curl_setopt($ch, CURLOPT_PROXYPORT, "8080"); // your proxy port number
curl_setopt($ch, CURLOPT_PROXYUSERPWD, "username:pass"); //username:pass
$file_contents = curl_exec($ch);
curl_close($ch);
return $file_contents;
}
echo getUrl("http://www.google.com");
PEAR HTTP_Request2 モジュールを使用します。
これが私のUrlOpen()関数の簡易版です:
function UrlOpen($url)
{
$request = new HTTP_Request2($url);
$request->setConfig(array(
'proxy_Host' => '192.168.1.6',
'proxy_port' => 8080,
'proxy_user' => 'MYUSER',
'proxy_password' => 'MYPASS',
'ssl_verify_peer' => False,
'connect_timeout' => 3,
);
return $request;
}
$req = UrlOpen($url);
$res = $req->send();
if ($res->getStatus() == '200')
$data = $request->getBody();
はい、可能です!
stream_context_set_default
php.iniプロパティを使用して、ファイルでauto_prepend_file
を構成し、このファイルをすべてのPhpプログラムに含めることができます。
私は以下について小さな要点を書きました:
https://Gist.github.com/ebuildy/381f116e9cd18216a69188ce0230708d
フランス語の記事:
これは、システム管理者がホストを構成できるため、開発者がコードを変更する必要がないため、「クール」です。
一部のスクリプトでは、環境変数HTTP_PROXY
。それは両方のcomposer.phar
およびメディアウィキのメンテナンス/ update.php
スクリプト。
例えば。:
setenv HTTP_PROXY http://1.2.3.4:3934
プロキシがポート3934でリッスンしている1.2.3.4である場合。
インターネットで検索しましたが、stream_context_set_default()password protectedについて何も見つかりませんでしたプロキシサーバー。
次に、基本認証のパスワードはヘッダーで送信されると考えました。そこで、CURLリクエストから抽出したパスワードでヘッダーを変更しましたが、完璧に機能しました!!!
これがあなたのやり方です:
以下のように、最初にこのリクエストを任意のドメイン(example.com)に送信します。
curl -v -U user:pass -x your_proxy_ip:port --url https://example.com
Curlが送信したヘッダーを参照して、後で使用するこれらのプロキシ行を取得しました。
> Trying XXX.XXX.XXX.XXX...
> Connected to XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX) port YYYY (#0)
> Establish HTTP proxy tunnel to example.com:443
> Proxy auth using Basic with user 'your_username_here'
> CONNECT example.com:443 HTTP/1.1
> Host: example.com:443
> Proxy-Authorization: Basic YW1hem9uOnXXXXXXXXXXXXXXX25SMg
> User-Agent: curl/7.47.0
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 Connection established
<
< Proxy replied OK to CONNECT request
では、カスタムヘッダーを作成します。
$default_opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Proxy-Authorization: Basic YW1hem9uOnXXXXXXXXXXXXXXX25SMg\r\n" .
"Proxy-Connection: Keep-Alive",
'proxy'=>"XXX.XXX.XXX.XXX:YYYY"
)
);
$default = stream_context_set_default($default_opts);
$result = file_get_contents("https://ipleak.net/json/");
print_r(json_decode($result));
そして、それは完璧に動作し、あなたはそれに応じてプロキシサーバーのIPを取得します!