php – 从服务器向客户端发送数据?

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 从服务器向客户端发送数据?脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个PHP服务器文件一个 HTML客户端文件,HTML文件发送ajax请求到服务器每500毫秒检索一次数据,这虽然按预期工作,但它会导致客户端设备上的内存和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使用率.

那么最好的方法是什么?任何帮助将非常感激.

更新:

我意识到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缓存filesize,因此上面的循环将无限期地运行,解决方法是使用clearstatcache()方法,它将清除文件大小的存储缓存,允许循环中断文件大小变化.

在我们有能力在浏览器中使用套接字之前,我们使用了Long轮询.基本的想法是,浏览器不是定期发出请求,而是向服务器发出请求,但服务器不会响应,直到有值得共享回浏览器.这意味着请求可以保持打开10毫秒或数小时.

在服务器响应之后,浏览器的工作就是创建一个新的ajax请求.这样,始终有一条线路对服务器开放.

有关更多信息,请参阅this question.

脚本宝典总结

以上是脚本宝典为你收集整理的php – 从服务器向客户端发送数据?全部内容,希望文章能够帮你解决php – 从服务器向客户端发送数据?所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。