【发布时间】:2013-04-11 21:45:32
【问题描述】:
我有一个 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,虽然它并不理想,但它会比使用 @ 好得多987654329@ 在内存和 CPU 使用方面。
那么最好的方法是什么?任何帮助将不胜感激。
更新:
我意识到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 分钟一次
-
结果集有多大?以 kb 为单位?
-
客户应该多快收到数据更改?多少秒是可以接受的?
-
是的,我问的是数据更新的频率,因为每半秒轮询一次似乎相当极端。
标签: php ajax performance session