Apabila menggunakan gema untuk mengeluarkan rentetan binari yang besar kepada respons HTTP dalam PHP, pelayan mengembalikan respons yang tidak betul.
P粉328911308
2023-08-28 10:26:38
<p>Saya cuba mengeluarkan beberapa tatasusunan binari yang besar kepada respons HTTP menggunakan kod berikut: </p>
<pre class="brush:php;toolbar:false;">$bin = NULL;
$strLenToOutput = 8000;
untuk ($i=0; $i < $strLenToOutput; $i++) {
$bin .= pack("C", 1);
}
header('Perihalan-Kandungan: Pemindahan Fail');
header("Jenis Kandungan: aplikasi/strim oktet");
header("Pelupusan Kandungan: lampiran; nama fail=test.bin");
header("Content-Length: filesize=" . strlen($bin));
header("Cache-Control: no-cache");
echo $bin;</pre>
<p>Apabila rentetan yang akan dikeluarkan agak pendek, kurang daripada atau sama dengan 8000, kod di atas berfungsi dengan baik. Tetapi jika panjang rentetan dinaikkan kepada 8001, saya mendapat ralat berikut dalam Posmen: </p>
<pre class="brush:php;toolbar:false;">Ralat Parse: Pelayan mengembalikan respons yang salah</pre>
<p>Saya menjalankan PHP7.4 pada Apache V2.4.46, semua tetapan adalah lalai. </p>
<p>Apa yang saya buat salah di sini? Adakah kod PHP atau beberapa tetapan pada Apache2 yang perlu diubah? </p>
<p>Sila berikan panduan, terima kasih terlebih dahulu. </p>
<p>Kemas kini: Jika saya mengalih keluar baris berikut yang menetapkan panjang fail, kod PHP berfungsi dengan baik. Saya rasa masalahnya ialah saya harus membiarkan PHP mengendalikan bahagian ini sendiri. </p>
<pre class="brush:php;toolbar:false;">//header("Content-Length: filesize=" . strlen($bin));</pre></p>
Masalahnya terletak pada cara pengepala Kandungan-Panjang ditetapkan. Kod asal menetapkan pengepala
hendaklah ditetapkan seperti ini:
Teks tambahan "filesize=" dalam pengepala hanya akan mengelirukan penghuraian jawapan pelanggan. Apabila Panjang Kandungan kurang daripada atau sama dengan 8000, pelanggan mungkin mempunyai cara untuk pulih, tetapi ia tidak dapat menangani keadaan apabila Panjang Kandungan lebih besar daripada atau sama dengan 8001