php - test - ¿Cómo hacer que file_get_contents() funcione con HTTPS?
print file_get_contents (11)
Estoy trabajando en la configuración del procesamiento de la tarjeta de crédito y necesitaba usar una solución temporal para CURL. El siguiente código funcionaba bien cuando estaba usando el servidor de prueba (que no llamaba a una URL SSL), pero ahora cuando lo estoy probando en el servidor en funcionamiento con HTTPS, está fallando con el mensaje de error "no se pudo abrir la transmisión".
function send($packet, $url) {
$ctx = stream_context_create(
array(
''http''=>array(
''header''=>"Content-type: application/x-www-form-urlencoded",
''method''=>''POST'',
''content''=>$packet
)
)
);
return file_get_contents($url, 0, $ctx);
}
A veces, un servidor elegirá no responder en función de lo que ve o no ve en los encabezados de solicitud http (como un agente de usuario apropiado). Si puede conectarse con un navegador, tome los encabezados que envía y métalos en el contexto de su secuencia.
En mi caso, el problema se debía a que WAMP usaba un php.ini diferente para CLI que Apache, por lo que las configuraciones realizadas a través del menú de WAMP no se aplican a CLI. Simplemente modifique el CLI php.ini y funciona.
Esto probablemente se deba a que su servidor de destino no tiene un certificado SSL válido.
HTTPS es compatible a partir de PHP 4.3.0, si ha compilado en soporte para OpenSSL. Además, asegúrese de que el servidor de destino tenga un certificado válido, el cortafuegos permita las conexiones salientes y allow_url_fopen
en php.ini esté establecido en verdadero.
Para permitir https wrapper:
- la extensión
php_openssl
debe existir y estar habilitada -
allow_url_fopen
debe estar configuradoon
En el archivo php.ini debe agregar estas líneas si no existe:
extension=php_openssl.dll
allow_url_fopen = On
Prueba lo siguiente.
function getSslPage($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
Nota: Esto deshabilita la verificación de SSL, lo que significa que la seguridad ofrecida por HTTPS se pierde . Solo use este código para pruebas / desarrollo local, nunca en Internet u otras redes públicas. Si este código funciona, significa que el certificado SSL no es de confianza o no se puede verificar, lo que debe considerar solucionar como un problema aparte.
Pruebe la siguiente secuencia de comandos para ver si hay un contenedor https disponible para sus scripts php.
$w = stream_get_wrappers();
echo ''openssl: '', extension_loaded (''openssl'') ? ''yes'':''no'', "/n";
echo ''http wrapper: '', in_array(''http'', $w) ? ''yes'':''no'', "/n";
echo ''https wrapper: '', in_array(''https'', $w) ? ''yes'':''no'', "/n";
echo ''wrappers: '', var_export($w);
la salida debería ser algo así como
openssl: yes
http wrapper: yes
https wrapper: yes
wrappers: array(11) {
[...]
}
Simplemente agregue dos líneas en su archivo php.ini.
extension=php_openssl.dll
allow_url_include = On
está funcionando para mí.
Yo tenía el mismo error. Configuración allow_url_include = On
en php.ini
corregido por mí.
PARA VERIFICAR SI UNA URL ESTÁ ARRIBA O NO
El código en su pregunta se puede reescribir en cuanto a una versión de trabajo:
function send($packet=NULL, $url) {
// Do whatever you wanted to do with $packet
// The below two lines of code will let you know if https url is up or not
$command = ''curl -k ''.$url;
return exec($command, $output, $retValue);
}
$url= ''https://example.com'';
$arrContextOptions=array(
"ssl"=>array(
"verify_peer"=>false,
"verify_peer_name"=>false,
),
);
$response = file_get_contents($url, false, stream_context_create($arrContextOptions));
Esto le permitirá obtener el contenido de la url ya sea un HTTPS