baru -baru ini menemui masalah dengan ajax
permintaan asynchronous. $.post
$.get
$.ajax
Selepas banyak ujian, kami mendapati:
– penyemak imbas berbeza, meminta nama domain berbeza - tiada sekatan: tiada percubaan diperlukan – penyemak imbas berbeza, meminta yang sama nama domain - Tidak menyekat: mengembalikan berbeza
– penyemak imbas yang sama, meminta nama domain yang berbeza - Tidak menyekat:
mengembalikan berbeza session_id()
– penyemak imbas yang sama, meminta nama domain yang sama - Menyekat:
mengembalikan yang sama session_id
session_id()
Mendapati masalah:
1 Tutup2
KunciXDEBUG
3 Kosongkan penimbal outputSESSION
1 Tutup
XDEBUG
ialah penyahpepijatan masa nyata. Apabila menyahpepijat, ia akan kekal untuk memastikan urutan berfungsi untuk mengelakkan pencemaran data.
Kaedah ujian biasa ialah membuka penyemak imbas lain dan melawati tapak apabila menggunakan XDEBUG
untuk menyahpepijat Tapak ini tidak boleh diakses pada masa ini. FPM
Ini mempunyai kesan ketara pada respons selari, iaitu walaupun bahagian hadapan menghantar berbilang permintaan, ia dikawal oleh XDEBUG
dan hanya boleh membalas satu demi satu.
bergantung pada XDEBUG
, anda perlu mematikan penguncian sesi walaupun anda menggunakan
(lihat di bawah). XDEBUG
masih akan dibuka secara automatik. SESSION
session_write_close()
XDEBUG
2
Gunakan SESSION
untuk menutup kunci tulis , yang sesuai untuk kes di mana
disimpan sebagai session_write_close()
. Tidak diperlukan jika SESSION
disimpan dalam SESSION
. File
SESSION
Redis
3 Kosongkan penimbal output
Menggunakan mungkin tidak menutup kunci serta-merta, jadi tambah:
sebelum kaedah ini. Biarkan session_write_close()
berkuat kuasa serta-merta. SESSION
ob_end_flush()
session_write_close()
4 Contoh
Terdapat contoh berikut Apabila butang [Serah] diklik, bahagian hadapan akan menghantar dua permintaan ke pelayan bahagian belakang. Salah satunya adalah permintaan, yang diminta setiap 1 saat.
Salah satunya ialah permintaan
, yang dihantar sekali pada permulaan dan kemudian menunggu penyelesaian yang sepadan. get
Lihat kod HTMLpost
kod php
<form> <input type="submit" value="提交" /> </form> <script src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script> <script type="text/javascript"> $('form').on('submit', function(e) { e.preventDefault(); // 每隔一秒请求一次服务器 var id = setInterval(function() { $.get( 'save.php?action=get', {}, function(data) { console.log(data); }, 'json' ); }, 1000); $.post( 'save.php?action=post', {}, function(data) { console.log(data); // 停止定时循环 clearInterval(id); }, 'json' ); }); </script>
<?php session_start();$action = $_GET['action']; if ($action == 'post') { $_SESSION['time'] = 0; session_write_close(); while ($_SESSION['time'] < 5) { session_start(); $_SESSION['time'] = $_SESSION['time'] + 1; // 将SESSION数据写入文件中,并关闭写锁 session_write_close(); // sleep()模拟花费时间较长的程序,这样在关闭写锁之后, // 服务器就能够相应别的请求,如下的$action=get, sleep(1); } echo json_encode([session_id() => $_SESSION['time']]); exit();}if ($action == 'get') { echo json_encode([session_id() => $_SESSION['time']]); exit();}
Atas ialah kandungan terperinci Permintaan tak segerak ke pelayan PHP tanpa mengembalikan data? (Lampiran penyelesaiannya). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!