オフィスオートメーションを実現するために、学生テーブルをデータベースにインポートする小さなものを作成しましたが、問題なく動作しますが、Baidu でインターネットを検索しても解決策が見つかりませんでした。 。
実現したい機能は次のとおりです。 1. インポート中の表示。処理結果を表示したい場合、スクロールバーが常に下に表示され、最新の処理結果が表示されます。以下では、コード内でアンカーポイントの配置を使用しましたが、これは非常に愚かに感じられました~~~ この要件を満たすより良い方法はありますか?
2. インポートするとき、最初の 1500 項目は非常に速くインポートされ、スクロール バーは下までスクロールしました (非常にプロフェッショナルな外観) が、約 1500 項目を過ぎると動かなくなりました。データベースを選択し、stutable からカウント (*) を選択すると、レコードが増加していることがわかりましたが、ページがスタックしているようで、どの接続をクリックしても応答がありません。同時に、データベース内の行数が表示されません。まだまだ成長中~~~。ここ 2 日間、Baidu はこの問題に直面し、InnoDB には行ロックとトランザクションがあるため、MyIsam よりも効率が低いと述べています (ただし、トランザクションが必要であり、複数のプロジェクトが 1 つのサーバー上にあり、mysql エンジンを変更できません)。ストアドプロシージャやイベントを使えばいいという人もいますが、ストレージやイベントを使った場合、リアルタイム処理の効果は現れません。それを解決したい場合は、my.cnf などの設定ファイルを変更できないため、現在のページで解決できることを願っています~~~~
主に 2 番目の問題で、2 日間私を苦しめました、解決してくださいそれ~ ~~~この質問をこのバージョンで投稿するのが良いのか、データベース バージョンで投稿する方が良いのかまだわかりません~~~
コードから始めましょう:
<?phpinclude("conn.php");?><!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>批量导入</title></head><body><table> <thead> <tr><th colspan=2>批量导入学生信息</th></tr> <tr><td>姓名</td><td>导入结果</td></tr> </thead> <tbody><?php//因为导入数据可能占用较长时间,因此设置超时时间为0set_time_limit(0);//将信息写入数据库function addstu($stuname){ global $db; if($db->exec("insert into stutable(stuname) values('".$stuname."')")=="1") { return "导入成功!"; } else { return "导入失败!"; }}//上传部分不写了,只写插入过程if($_POST){ //文件导入 if($_FILES["stuinfo"]["error"]>0) { echo "<tr><td colspan='3'>上传文件出错,错误信息:".$_FILES["stuinfo"]["error"]."</td></tr>"; } else { $extension=pathinfo($_FILES["stuinfo"]["name"],PATHINFO_EXTENSION);//获取上传文件的扩展名 $filename="upload/".time().".".$extension;//上传后的文件名 move_uploaded_file($_FILES["stuinfo"]["tmp_name"],$filename);//将上传的临时文件移动到指定目录 $file=fopen($filename,"r");//打开文件,然后读取信息 $stuinfo=array(); while($data=fgetcsv($file)) { array_push($stuinfo,implode($data)); } fclose($file); } //遍历数组,向数据库insert数据 print str_repeat(" ",4096);//想实现导入的同时显示进度,先输出一堆空字符 foreach($stuinfo as $rs) { $addresult=""; $addresult="<tr><td><a name='".$rs."'></a>".$rs."</td><td>".addstu($rs)."</td><tr>";//直接调用addstu方法向数据库写数据 $addresult.="<script type='text/javascript'>location.href='#".$rs."';</script>";//想实现导入的同时滚动条始终在最下方,想不到别的方法,只得用锚点定位。请问有更好的方法吗? echo $addresult;//输出当前的操作 ob_flush(); flush(); usleep(1000);//当时无论如何都实现不了边导入边显示,后来加了个sleep就行了,百思不解,请指点 }}?> </tbody></table></body></html>
ディスカッションへの返信 (解決策)
InnoDB であろうと MyIsam であろうと、テーブル タイプはテーブル用です
リアルタイム表示メソッドは Web システムの欠陥に基づいて構築されています。別の環境ではまったく効果がない可能性があります
出力したデータ内の tr タグ。が閉じられていない場合でも、問題が発生します。
テーブルの行は table タグ内に出力されますか、それともタグ外に出力されますか?
外だったら明らかに間違ってるよ
ループによる
モデレータのおかげで、より良いものがあります瞬時に表示する方法は?ループ内で「<script>$.get()</script>」をエコーする必要がありますか?これは、PHP ループ内で jq を使用して別のページからデータを送信し、テーブルにレシートを書き込むことを意味しますか?
最も重要な問題はインポート効率です。インポートされたアイテムの数が約 1,500 に達すると、ページは完全にスタックしますが、データベース内の行数は依然として増加しています。ページがフリーズするのは PHP が原因なのか、それともデータベースへのデータの挿入がページをフリーズさせるのかわかりません。
疑問を解決します
一般的に、マークが閉じられていない場合、マークの内容は表示されません
そのため、内容を表示するには table の代わりに div を使用する必要があり、IE の table は読み取り専用です
別の方法 (ajax など) は、現在使用している方法よりも明らかに優れています。少なくとも、項目が挿入されるたびにプログラムを人為的に 1 ミリ秒間ハングさせる必要はありません
解決策はありますか?
このようなニーズの場合、私は通常、フロントエンドの ajax ループリクエストを使用し、毎回 n 回処理し、成功が返された後にページに表示し、再度リクエストします
個人的には、Web は小規模な用途に適していると思いますGPU が CPU を処理できないのと同じように、同時実行性の高いタスク 動作は同じです
このようなニーズには、通常、フロントエンドの ajax ループリクエストを使用し、毎回 n を処理し、正常に返された後にページに表示します、そして再度リクエストします
大量のデータがある場合にこれをテストしました。 、処理されたデータを取得するために jquery を使用し、データが多すぎるとブラウザがフリーズします
フロントエンドのAjaxループリクエストを使用し、毎回nを処理し、正常に返された後にページに表示し、再度リクエストします
個人的には、WebはGPUと同じように、小規模なタスクと高い同時実行性に適していると思いますCPU の計算を処理できません
これをテストしました。大量のデータがある場合、jquery を使用して処理されたデータを取得し、$.append が情報表示を返します。データが多すぎるとフリーズします
有2个需要注意的地方:
不要连续发请求,采用回调的方式,当第一组数据处理+显示完成后,再发起第二组数据的请求
如果数据量太大,就给显示数据条数定个上限,当达到上限时,再有新数据,就先删掉等量的最老的数据
这样做之后肯定不会卡的
如果你的需求就是把上万的数据一并显示在窗口中的话,就要考虑js缓存然后动态变化显示内容了
首先把全部数据保存在js变量中,把前100条打印出来,然后绑定个页面滚动事件,到底了自动刷出来新的100条,把老的删除
归根到底就是不要创建过多DOM元素
估计浏览器把内存都占了。所以后面解释就慢,你创建了太多dom了。
定位到最底可以不用描点实现,可以用js,修改scrolltop=scrollheight来实现。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title></title></head><body><script type="text/javascript">function add(){var now = new Date();var div = document.getElementById('scrolldIV');div.innerHTML = div.innerHTML + 'time_' + now.getTime() + '<br />';div.scrollTop = div.scrollHeight;}</script><span class="notice">请点击“插入一行”按钮,插入最新信息,当出现滚动条时,滚动条将自动保持在底部。</span><br /><div id="scrolldIV" style="overflow:auto; height: 100px; width: 400px; border: 1px solid #999;"></div><input type="button" value="插入一行" onclick="add();"></div></div></body></html>
回复楼上版主,为什么变慢我还是不清楚原因,不知道是因为创建的DOM太多缘故还是PHP代码缘故。
不过我现在的方案是:使用jquery的$().append()方法回显,效果不错。
感谢大家热心回复,结贴

如何用Python编写求解最小公倍数的算法?最小公倍数是指两个数中能够整除这两个数的最小整数。在数学中,求解最小公倍数是一项基本的数学任务,而在计算机编程中,我们可以使用Python来编写一个求解最小公倍数的算法。下面将介绍基本的最小公倍数算法,并给出具体的代码示例。最小公倍数的数学定义是:如果a能被n整除且b能被n整除,则n是a和b的最小公倍数。要求解最小

Numpy是Python中著名的科学计算库,为处理大型多维数组和矩阵提供了丰富的功能和高效的计算方法。在数据科学和机器学习领域,矩阵的逆运算是一项常见的任务。在本文中,我将介绍使用Numpy库快速求解矩阵逆的方法,并提供具体的代码示例。首先,让我们通过安装Numpy库引入它到我们的Python环境中。可以使用以下命令在终端中安装Numpy:pipinsta

标题:用C语言编程实现最大公约数求解最大公约数(GreatestCommonDivisor,简称GCD)是指能够同时整除两个或多个整数的最大正整数。求解最大公约数对于一些算法和问题解决非常有帮助。在本文中,将通过C语言编程来实现求解最大公约数的功能,并提供具体的代码示例。在C语言中,可以使用欧几里得算法(EuclideanAlgorithm)来求解最大

如何使用Python实现求解阶乘的算法?阶乘是数学中的重要概念,指的是一个数乘上其自身减一,再乘上自身减一减一,以此类推,直到乘到1为止。阶乘通常用符号"!"来表示,例如5的阶乘表示为5!,计算公式为:5!=5×4×3×2×1=120。在Python中,我们可以使用循环来实现一个简单的阶乘算法。下面给出一个示例代码:deffacto

学习C语言如何求解最大公约数,需要具体代码示例最大公约数(GreatestCommonDivisor,简称GCD)是指两个或多个整数中能够整除它们的最大正整数。在计算机编程中经常会用到最大公约数,特别是在处理分数、化简分数以及求解最简整数比例等问题时。本篇文章将介绍如何使用C语言来求解最大公约数,并给出具体的代码示例。求解最大公约数的方法有很多种,例如欧

在这里,我们将看到一个与模方程相关的有趣问题。假设我们有两个值A和B。我们必须找到变量X可以取的可能值的数量,使得(AmodX)=B成立。假设A为26,B为2。所以X的首选值将是{3,4,6,8,12,24},因此计数为6。这就是答案。让我们看一下算法以更好地理解。算法possibleWayCount(a,b)−begin ifa=b,thenthereareinfinitesolutions ifa

斐波那契数列是一个数列,其中下一项是前两项之和。斐波那契数列的前两项是0后跟1。在这个问题中,我们会发现斐波那契数列中的第n个数字。为此,我们将计算所有数字并打印n项。Input:8Output:011235813说明0+1=11+1=21+2=32+3=5使用For循环将前两项求和作为下一项示例#include<iostream>usingnamespacestd;intmain(){ intt1=0,t2=1,n,i,nextTerm;&am

标题:PHP中如何求解2的乘方?具体代码示例分享在PHP编程中,求解数的乘方是一个常见的需求,特别是在一些算法和数学计算中。本文将详细探讨如何在PHP中求解2的乘方,并提供具体的代码示例供大家参考。在PHP中,可以使用幂运算符**来计算乘方。对于2的乘方,即计算$2^n$,其中$n$是乘方的指数。下面我们将通过几种不同的方法来实现这个计算。方法一:使用**运


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

SublimeText3 中国語版
中国語版、とても使いやすい

WebStorm Mac版
便利なJavaScript開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

ホットトピック



