На работе мы должны использовать прокси для доступа к порту 80, например, у нас есть собственные пользовательские логины для каждого пользователя.
Мое временное обходное решение использует завиток, чтобы входить в систему как пользователь через прокси и получать доступ к внешним данным, которые мне нужны.
Есть ли какая-то расширенная настройка php, которую я могу установить так, чтобы внутри, когда она пытается вызвать что-то вроде file_get_contents()
она всегда проходит через прокси? Я нахожусь в банкомате Windows, так что было бы больно перекомпилировать, если это единственный способ.
Причина моего временного решения заключается в том, что мне нужно решение, которое является общим и работает для нескольких пользователей, вместо использования учетных данных одного пользователя (Ive считал, что запрашивает отдельную учетную запись пользователя исключительно для этого, но пароли часто меняются, и этот метод необходимо развернуть на протяжении всего десяток или более сайтов). Я не хочу использовать жесткие коды в основном для использования обходного пути.
Чтобы использовать 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 😉
Теперь вы передаете прокси-авторизацию в прокси-сервер, содержащий ваш логин и пароль.
И … Страница должна отображаться 😉
Надеюсь это поможет ! Повеселись !
Используйте функцию 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); ?>
В зависимости от того, как работает прокси-сервер, stream_context_set_default может вам помочь.
$context = stream_context_set_default( array( 'http'=>array( 'header'=>'Authorization: Basic ' . base64_encode('username'.':'.'userpass') ) ) ); $result = file_get_contents('http://..../...');
Здесь есть аналогичная статья: 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; }