Voici une manière très simple d'envoyer une requête vers un serveur HTTP sans vous soucier de la réponse : en écrivant dans un socket.
Faire un push HTTP en PHP
function httpRequestAsynchronous($url, array $params = []) {
$urlParts = parse_url($url);
if (!isset($urlParts['host'])) {
return false;
}
$host = $urlParts['host'];
/* /!\ Notez qu'on ne peut pas envoyer de données en clair sur le port HTTPS 443 */
$port = isset($urlParts['port']) ? $urlParts['port'] : 80;
if (!($fp = fsockopen($host, $port, $errno, $errstr, 5))) {
/* Amélioration: utiliser les variables errno et errstr */
return false;
}
$builtParams = http_build_query($params);
$builtParamsLength = strlen($builtParams);
$pathAndQuery = $urlParts['path'] . (isset($urlParts['query']) ? '/?' . $urlParts['query'] : '');
$query = "POST " . $pathAndQuery . " HTTP/1.1\r\n";
$query .= "Host: " . $host . "\r\n";
$query .= "Content-Type: application/x-www-form-urlencoded\r\n";
$query .= "Content-Length: " . $builtParamsLength . "\r\n";
$query .= "Connection: Close\r\n\r\n";
if ($builtParamsLength > 0) {
$query .= $builtParams;
}
if (!fwrite($fp, $query)) {
return false;
}
fclose($fp);
return true;
}
$urlParts = parse_url($url);
if (!isset($urlParts['host'])) {
return false;
}
$host = $urlParts['host'];
/* /!\ Notez qu'on ne peut pas envoyer de données en clair sur le port HTTPS 443 */
$port = isset($urlParts['port']) ? $urlParts['port'] : 80;
if (!($fp = fsockopen($host, $port, $errno, $errstr, 5))) {
/* Amélioration: utiliser les variables errno et errstr */
return false;
}
$builtParams = http_build_query($params);
$builtParamsLength = strlen($builtParams);
$pathAndQuery = $urlParts['path'] . (isset($urlParts['query']) ? '/?' . $urlParts['query'] : '');
$query = "POST " . $pathAndQuery . " HTTP/1.1\r\n";
$query .= "Host: " . $host . "\r\n";
$query .= "Content-Type: application/x-www-form-urlencoded\r\n";
$query .= "Content-Length: " . $builtParamsLength . "\r\n";
$query .= "Connection: Close\r\n\r\n";
if ($builtParamsLength > 0) {
$query .= $builtParams;
}
if (!fwrite($fp, $query)) {
return false;
}
fclose($fp);
return true;
}
Comme vous pouvez le constater, cette fonction ne fait que du POST mais elle est très facilement adaptable pour les autres méthodes HTTP.
A bientôt !
Commentaire(s)