So greifen Sie auf den Entitätstext einer POST- oder PUT-Anforderung (oder einer anderen HTTP-Methode) zu:
$entityBody = file_get_contents('php://input');
Außerdem ist die STDIN
Konstante ein bereits geöffneter Stream php://input
, sodass Sie alternativ Folgendes tun können:
$entityBody = stream_get_contents(STDIN);
Von der PHP manuellen Eingabe auf I / O - Streams docs :
php: // input ist ein schreibgeschützter Stream, mit dem Sie Rohdaten aus dem Anforderungshauptteil lesen können. Im Fall von Anfragen POST, ist es vorzuziehen, Gebrauch php: // input statt , $HTTP_RAW_POST_DATA
da es hängt nicht von speziellen php.ini Einstellungen. Darüber hinaus ist es in Fällen, in denen
$HTTP_RAW_POST_DATA
es nicht standardmäßig ausgefüllt ist, eine möglicherweise weniger speicherintensive Alternative zur Aktivierung von always_populate_raw_post_data. php: // Eingabe ist nicht verfügbar mit enctype = "multipart / form-data".
Insbesondere sollten Sie beachten, dass der php://input
Stream unabhängig davon, wie Sie in einem Web-SAPI darauf zugreifen, nicht durchsuchbar ist . Dies bedeutet, dass es nur einmal gelesen werden kann. Wenn Sie in einer Umgebung arbeiten, in der routinemäßig große HTTP-Entitätskörper hochgeladen werden, möchten Sie die Eingabe möglicherweise in ihrer Stream-Form beibehalten (anstatt sie wie im ersten Beispiel oben zu puffern).
So etwas kann hilfreich sein, um die Stream-Ressource zu pflegen:
<?php
function detectRequestBody() {
$rawInput = fopen('php://input', 'r');
$tempStream = fopen('php://temp', 'r+');
stream_copy_to_stream($rawInput, $tempStream);
rewind($tempStream);
return $tempStream;
}
php://temp
Mit dieser Option können Sie den Speicherverbrauch verwalten, da nach dem Speichern einer bestimmten Datenmenge (standardmäßig 2 MB) transparent auf den Dateisystemspeicher umgeschaltet wird. Diese Größe kann in den php.ini oder durch Anfügen manipuliert werden /maxmemory:NN
, wobei NN
die maximale Menge an Daten im Speicher zu halten , bevor eine temporäre Datei, in Bytes verwenden.
Natürlich sollten Sie diese Funktionalität in einer Webanwendung nicht benötigen, es sei denn, Sie haben einen wirklich guten Grund, nach dem Eingabestream zu suchen. Normalerweise reicht es aus, den Hauptteil der HTTP-Anforderungsentität einmal zu lesen. Lassen Sie Clients nicht den ganzen Tag warten, während Ihre App herausfindet, was zu tun ist.
Beachten Sie, dass die Eingabe php: // nicht für Anforderungen verfügbar ist, die einen Content-Type: multipart/form-data
Header angeben ( enctype="multipart/form-data"
in HTML-Formularen). Dies resultiert daraus, dass PHP die Formulardaten bereits in das $_POST
Superglobale analysiert hat.
$_POST
gesendet wurden, da diese nicht über die Superglobale verfügbar sind. Dies gilt (insbesondere) auch für PUT-Anfragen, da PHP kein entsprechendes Superglobal hat.