我有一個php服務器文件和一個HTML客戶端文件,HTML文件向服務器發送ajax請求以檢索每個500 ms
的數據,雖然按預期工作,但會導致客戶端設備上的內存和CPU使用率高。從服務器發送數據到客戶端?
PHP
if(isset($_POST['id']) && $_POST['id'] != '')
{
$id = $_POST['id'];
$select = $con->prepare("SELECT * FROM data WHERE id=?");
$select->bind_param('s', $id);
$select->execute();
$result = $select->get_result();
while($row = $result->fetch_assoc())
{
echo $row['column 1'] . "\t" . $row['column 2'] . "\n";
}
}
AJAX
function send(){
var formdata = new FormData(),
id = document.getElementById('id').value;
formdata.append('id', id);
var xhr = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
xhr.open('post', 'server.php', true);
xhr.send(formdata);
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
console.log(xhr.responseText);
}
}
}
setInterval(function(){send()}, 500);
我想找到的,而不是發送大量請求到服務器並獲取大部分的時間相同數據的替代解決方案AJAX,它會如果服務器可以在數據更改或更新時與客戶端進行交互,則效率會更高。
我不能使用PHP Socket
或HttpRequest
方法,因爲它們沒有安裝在我的託管服務器上,我不確定後面的方法是否正常。我能想到的唯一方法是使用SESSIONS
。
根據this PHP服務器將所有用戶會話存儲在服務器上的同一目錄中,因此可能直接在文件上更改特定用戶的會話變量。但問題是這些文件中的數據是序列化的,我不確定如何反序列化數據並重新序列化它們,然後保存新數據!
即使我能找到一種方法來存儲會話文件的更新,我仍然需要用setInterval來聽會話的變量變化每500ms
雖然它不是理想的,但它會比使用XMLHttpRequest
好得多內存和CPU使用情況。
那麼最好的辦法是什麼?任何幫助將非常感激。
UPDATE:
我意識到SESSION
不會工作,因爲它可以通過服務器而不是客戶端只讀的,所以我要送AJAX請求到服務器來獲取變量,我試圖避免。
我嘗試了很長時間的投票,但是我有很多問題,flush
和ob_flush()
在我的服務器上無法正常工作,我無法更改ini
設置。當試圖無限循環,我不能得到它的數據變化打破:
if(isset($_GET['size']) && $_GET['size'] != '')
{
$size = (int)$_GET['size'];
$txt = "logs/logs.txt";
$newsize = (int)filesize($txt);
while(true) {
if($newsize !== $size) {
$data = array("size" => filesize($txt), "content" => file_get_contents($txt));
echo json_encode($data);
break;
}
else{
$newsize = (int)filesize($txt);
usleep(400000);
}
}
}
它一直走下去,即使logs.txt
尺寸增加它不會破!我如何使它在尺寸增加時斷開並回顯數據?
更新2:
它調用filesize()
方法因此,上述循環將無限期地運行時原來PHP的高速緩存中的文件大小,對於該解決方案是使用clearstatcache()
方法至極將清除的所存儲的高速緩存文件大小允許循環在文件大小更改上斷開。
多久你希望你的響應數據的改變? –
它有所不同,可能是每10秒一次或每10分鐘一次 – razzak
結果集有多大?在kb? – hek2mgl