File_get_contents за прокси?
На работе мы должны использовать прокси для доступа к порту 80, например, у нас есть собственные пользовательские логины для каждого пользователя.
Мое временное обходное решение использует curl для входа в систему как пользователь через прокси и доступ к внешним данным, которые мне нужны.
Есть ли какой-то расширенный php-параметр, который я могу установить так, чтобы внутри, когда он пытался вызвать что-то вроде file_get_contents()
, он всегда проходит через прокси-сервер? Я нахожусь в банкомате Windows, поэтому было бы больно перекомпилировать, если это единственный способ.
Причина моего временного решения заключается в том, что мне нужно решение, которое является общим и работает для нескольких пользователей, вместо использования одного пользовательского мандата (Ive считал, что запрашивает отдельную учетную запись пользователя исключительно для этого, но пароли часто меняются, и этот метод должен быть развернуты на протяжении десятка или более сайтов). Я не хочу жестко кодировать учетные данные в основном для использования обходного пути.
Ответы
Ответ 1
Чтобы использовать file_get_content через прокси-сервер, который не требует аутентификации, что-то вроде этого:
(я не могу проверить это: мой прокси требует аутентификации)
$aContext = array(
'http' => array(
'proxy' => 'tcp://192.168.0.2:3128',
'request_fulluri' => true,
),
);
$cxContext = stream_context_create($aContext);
$sFile = file_get_contents("http://www.google.com", False, $cxContext);
echo $sFile;
Конечно, заменяя IP-адрес и порт моего прокси-сервера теми, которые подходят для вас; -)
Если вы получаете такую ошибку:
Warning: file_get_contents(http://www.google.com) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 407 Proxy Authentication Required
Это означает, что ваш прокси требует аутентификации.
Если прокси требует аутентификации, вам нужно добавить пару строк, например:
$auth = base64_encode('LOGIN:PASSWORD');
$aContext = array(
'http' => array(
'proxy' => 'tcp://192.168.0.2:3128',
'request_fulluri' => true,
'header' => "Proxy-Authorization: Basic $auth",
),
);
$cxContext = stream_context_create($aContext);
$sFile = file_get_contents("http://www.google.com", False, $cxContext);
echo $sFile;
То же самое касается IP и порта, и, на этот раз, также LOGIN и PASSWORD; -)
Теперь вы передаете заголовок Proxy-Authorization в прокси-сервер, содержащий ваш логин и пароль.
И... Страница должна отображаться; -)
Надеюсь это поможет! Получайте удовольствие!
Ответ 2
Используйте функцию stream_context_set_default
. Его гораздо проще использовать, поскольку вы можете напрямую использовать функции file_get_contents или аналогичные функции без передачи каких-либо дополнительных параметров
В этом блоге объясняется, как его использовать. Вот код с этой страницы.
<?php
// Edit the four values below
$PROXY_HOST = "proxy.example.com"; // Proxy server address
$PROXY_PORT = "1234"; // Proxy server port
$PROXY_USER = "LOGIN"; // Username
$PROXY_PASS = "PASSWORD"; // Password
// Username and Password are required only if your proxy server needs basic authentication
$auth = base64_encode("$PROXY_USER:$PROXY_PASS");
stream_context_set_default(
array(
'http' => array(
'proxy' => "tcp://$PROXY_HOST:$PROXY_PORT",
'request_fulluri' => true,
'header' => "Proxy-Authorization: Basic $auth"
// Remove the 'header' option if proxy authentication is not required
)
)
);
$url = "http://www.pirob.com/";
print_r( get_headers($url) );
echo file_get_contents($url);
?>
Ответ 3
В зависимости от того, как работает прокси-сервер, stream_context_set_default может помочь вам.
$context = stream_context_set_default(
array(
'http'=>array(
'header'=>'Authorization: Basic ' . base64_encode('username'.':'.'userpass')
)
)
);
$result = file_get_contents('http://..../...');
Ответ 4
Здесь есть аналогичный пост: http://techpad.co.uk/content.php?sid=137, в котором объясняется, как это сделать.
function file_get_contents_proxy($url,$proxy){
// Create context stream
$context_array = array('http'=>array('proxy'=>$proxy,'request_fulluri'=>true));
$context = stream_context_create($context_array);
// Use context stream with file_get_contents
$data = file_get_contents($url,false,$context);
// Return data via proxy
return $data;
}