我有一个工具可以使用cURL检查游戏中的可用名称,它应该向运行检查的用户显示可用的名称,并且只是关闭所采用的名称。基本上,当您对名称列表运行测试时,它会检查所有名称,并将它们插入数据库并显示其可用性,0表示已获取,或1表示可用。
现在,在检查完成之前页面不会加载,然后它们全部作为整体插入到数据库中。我希望它能动态显示支票的状态(即“Checked name 405/4938”),并在检查名称时显示加载图像,同时在检查时显示可用名称。然后在最后,删除加载图像,并获得现在完整的可用名称列表。
我应该怎么做呢?我对jQuery / AJAX了解不多。现在它们并不理想,它们最终都被展示为质量。
这是名称检查线程上的代码。
<?php
$query = mysql_query("SELECT * FROM `lists` WHERE id = '$id'");
while($row = mysql_fetch_assoc($query)) {
$id = $row['id'];
$list = $row['list'];
foreach(explode("\n", $list) as $listItem) {
checkname_RS(trim($listItem));
}
}
这是支票的功能。
<?php
function checkname_RS($name) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://services.runescape.com/m=hiscore/compare.ws?user1=" . $name);
curl_setopt($ch, CURLOPT_HTTPGET, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$output = curl_exec($ch);
if (stristr($output,"Skill Stats")) {
mysql_query("INSERT INTO names (name, plat, status) VALUES ('$name', 'Runescape', '0')") or die(mysql_error());
}
if (stristr($output,"Member Rankings")) {
mysql_query("INSERT INTO names (name, plat, status) VALUES ('$name', 'Runescape', '1')") or die(mysql_error());
}
curl_close($ch);
}
答案 0 :(得分:0)
为了实现这一目标,你真的不需要做任何特别的事情。由于您已经只是保持连接打开并将数据转储到文档的底部,因此您应该能够在每个项目或每个n项之后将更多的javascript转储到客户端。
因此,您可以在文档中的某个位置转储一些html,如下所示:
<div id="progressMessage"></div>
<ul id="availableNames"></ul>
然后你的线程只需要输出js来更新视图,例如(jQuery用于简单):
$("#progressMessage").text("1 of 5999");
$("#availableNames").append("<li>matchedName</li>");
同样适用于加载/隐藏进度条,js在客户端收到它之前不会运行,所以净效果就像进度条。
答案 1 :(得分:0)
执行此操作的方法是使用作业队列服务器,使用工作人员(完成工作的任务)和客户端,向工作人员询问流程的完成情况。其中一个是Gearman。
另一种方法是使用cURL自己运行任务,但不要等待完成并使用set_time_limit(0),并自己查询状态,例如,通过在mysql表中保存作业的状态
这里有一些关于多线程的例子:
https://github.com/petewarden/ParallelCurl
http://semlabs.co.uk/journal/object-oriented-curl-class-with-multi-threading
隐式刷新并不总是有效。
希望,它适合你!
答案 2 :(得分:0)
一个天真的解决方案可能是在processed
表中维护一个数字list
列,您将在每次迭代时更新:
<?php
// user clicks on "run" (Ajax POST'ing of the input form)
// load whatever you need from $_SESSION here and then
session_write_close();
// so as to allow access to the session to the later Ajax polling
// reset counter
mysql_query("UPDATE lists SET processed = 0 WHERE id = $id");
// then the rest of your current script
function checkname_RS($name) {
// your current code here
// then increment the counter
mysql_query("UPDATE lists SET processed = processed + 1 WHERE id = $id");
}
然后有一个Ajax调用轮询数据库,以便检查当前作业的状态。 Ajax调用将从如下脚本中读取状态:
<?php
// script handling the Ajax call
// get the number of names already checked
mysql_query("SELECT processed FROM lists WHERE id = $id");
// proposed trick to count the number of names in this list
mysql_query("SELECT CHAR_LENGTH(names) - CHAR_LENGTH(REPLACE(names, '\n', '')) +1 AS cnt FROM lists WHERE id = $id");
// better computing this number once and for all at the beginning
// of the process and (eg.) store it in session
// generate the response to the Ajax call here
结果可以显示在div
中,也可以用于更新JQuery UI Progressbar,或以任何方式找到合适的结果。
关于你的结构只有一条建议。始终避免在列中存储非标量数据(例如“\ n” - 分隔的名称列表)。而是每个值存储一行(每个名称一行)。当您规范化数据时,即使对于小型项目,一切都变得更加简单(通常更有效)。