J’ai récemment joué avec l’API de YouTube pour pouvoir récupérer diverses informations sur les vidéos afin d’ajouter au site les données structurées idoines.
Il se trouve qu’en local, lorsque l’on utilise file_get_contents(), on peut obtenir une erreur de ce type lorsque le serveur n’est pas configuré avec le bundle de certificats OpenSSL:
Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in ...php on line 2
Warning: file_get_contents(): Failed to enable crypto in ...php on line 2
Warning: file_get_contents(https://........f=json): failed to open stream: operation failed in ...php on line 2
Code language: JavaScript (javascript)
Si cela vous arrive, plusieurs solutions s’offrent à vous.
Méthode 1: configuration de PHP côté machine/serveur
1. Vérifiez qu’OpenSSL est bien installé sur votre machine (il devrait l’être sur le serveur!).
2. Ajoutez cette ligne à la configuration de PHP, dans votre php.ini
:
openssl.cafile=/usr/local/etc/openssl/cert.pem
Code language: JavaScript (javascript)
3. Redémarrez le service PHP.
Méthode 2 : une fonction qui utilise curl au lieu de file_get_contents()
Au lieu de m’embêter à configurer OpenSSL ou à toucher à PHP dans un conteneur docker (Local), il se trouve que l’on peut réécrire la fonction file_get_contents()
avec une fonction maison qui utilise curl
.
Voici la fonction en question:
/*
Custom CURL function that mimicks file_get_contents()
@returns false if no content is fetched
Matt Biscay (https://mattbiscay.com)
*/
function sky_curl_get_file_contents( $URL ){
$c = curl_init();
curl_setopt( $c, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $c, CURLOPT_URL, $URL );
$contents = curl_exec( $c );
curl_close( $c );
if( $contents ) :
return $contents;
else:
return false;
endif;
}
Code language: PHP (php)
La fonction retourne false
si la requête échoue, ce qui est très utile pour éviter de faire des appels à des valeurs d’un tableau qui n’existe pas.
On peut alors réfléchir à un autre moyen de peupler les champs de données structurées (mais c’est un sujet à aborder une autre fois).