Compare as diferenças entre os métodos de envio do formulário POST e fsockopen.
Quando o formulário é enviado no modo POST,
$_POST e php://input podem obter o valor e $HTTP_RAW_POST_DATA fica vazio.
$_POST organiza os dados enviados em um array associativo e realiza processamento de codificação, como urldecode, e até mesmo conversão de codificação.
php://input pode obter dados brutos do POST não processados lendo arquivos por meio do fluxo de entrada.
php://input permite a leitura dos dados brutos do POST. Ele coloca menos pressão na memória do que $HTTP_RAW_POST_DATA e não requer nenhuma configuração especial do php.ini. php://input não pode ser usado com enctype="multipart/form-data".
Exemplo de fsockopen enviando dados POST:
$sock = fsockopen("localhost", 80, $errno, $errstr, 30);
if (!$sock) die("$errstr ($errno)n");
$data = "txt=" .urlencode("中") .
fwrite($sock, "POST /posttest/response.php HTTP/1.0rn");
fwrite($sock, "Host: localhostrn");
fwrite($sock, "Tipo de conteúdo: aplicação/x-www-form-urlencodedrn");
fwrite($sock, "Comprimento do conteúdo: " . strlen($data) . "rn");
fwrite($sock, "Aceitar: */*rn");
fwrite($meia, "rn");
fwrite($meia, "$dadosrn");
fwrite($meia, "rn");
$cabeçalhos = "";
while ($str = trim(fgets($sock, 4096)))
$cabeçalhos.= "$strn";
eco "n";
$corpo = "";
enquanto (!feof($sock))
$corpo .= fgets($meia, 4096);
fclose($meia);
echo $body;
é consistente com o resultado de (1)
:
1. Use php://input para obter facilmente os dados POST originais.
2.
$HTTP_RAW_POST_DATA só é válido quando o tipo Content-Type do POST não é reconhecido pelo PHP.
através de $ HTTP_RAW_POST_DATA é extraído. Seu atributo de tipo de codificação (atributo enctype) é application/x-www-form-urlencoded, multipart/form-data.
Nota: Mesmo que você altere explicitamente o atributo enctype na página para um tipo que não seja reconhecido pelo PHP, ele ainda será inválido.
Como o atributo de codificação de envio do formulário é limitado ao formulário, tipos irreconhecíveis serão considerados enviados na codificação padrão (ou seja, application/x-www-form-urlencoded)
3. $_POST somente quando os dados estiverem em application/x-www -form-urlencoded O tipo só pode ser obtido durante o envio.