2016-05-26 4 views
0

У нас есть 2 сервера, dev и live. Они оба используют LAMP (Debian), но dev-сервер является обычным http, а live-сервер - https. Этот код работает отлично на нашем Dev сервере:file_get_contents + stream_context_create работает на 1 сервере, заблокирован на другом

$all_data = array(...); 
$eol = "\r\n"; 

$headers = array(
    'Content-Type: application/json', 
    'Content-Length: ' . strlen(json_encode($all_data)), 
    'connection: close' 
); 
$headers = implode($eol, $headers); 

$opts = array(
    'http'=>array(
     'method' => 'POST', 
     'header' => $headers, 
     'content' => json_encode($all_data) 
    ) 
); 
$context = stream_context_create($opts); 


$update_data = file_get_contents($_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $system_file, null, $context); 

На живом сервере, то file_get_contents дает эту ошибку:

Warning: file_get_contents(https://...): failed to open stream: Connection timed out in ....php on line 1086 

Я смотрел на журналы апача подсказки относительно того, что является причиной его сбой на реальном сервере, но я вижу только ошибку выше. Он не говорит, что блокирует вызов. У меня allow_url_include и allow_url_fopen установлено значение On на реальном сервере.

Я не знаю, что-то в конфигурации Apache или в конфигурации SSL или что-то еще, и я не знаю, где искать. Сегодня я провел несколько часов, исследуя эту проблему, и попытался добавить разные заголовки в массив заголовков (User-Agent, Accept-Language, Accept-Encoding, Cookie и т. Д.), Но ничего не получилось. Я в основном пытался воспроизвести то, что было на dev, но жить просто не понравилось.

Я также подтвердил, что если я скопирую и вставляю URL-адрес, который создается непосредственно в браузере, он работает, поэтому я знаю, что имя файла верное.

dev server: 
php: 5.6.14-0+deb8u1 
apache: Apache/2.4.10 
debian: 8.2 

live server: 
php: 5.5.12 
apache: Apache/2.4.10 
debian: 7.9 
+1

Тайм-аут соединения звучит как вопрос брандмауэра. Вы пинговали пункт назначения с живого сервера или лучше запускали nmap на порту 443? –

+2

Попробуйте сделать запрос https вручную из командной строки через 'curl' на сервере, где он не работает. Просто: 'curl https: // ...' – Will

+0

@JeffPuckettII, я пробовал это: nmap -p 443 ourdomain.com и получил следующее: ПОРТОВАЯ ГОСУДАРСТВЕННАЯ СЛУЖБА 443/tcp отфильтрована https – raphael75

ответ

0

Можете ли вы использовать прокси-сервер и попробуйте

$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;

+0

Я пробовал, и это не сработало. Я получил ту же самую ошибку, что истекло. – raphael75

+0

Есть ли проблемы межсетевого экрана между обоими серверами? Если у вас есть эти проблемы, откройте порт и повторите попытку с помощью прокси-сервера .. попробуйте с помощью команды ** telnet ** или ** ping ** – sasikaran