【发布时间】:2019-02-11 19:42:54
【问题描述】:
我一直在为游戏制作成员列表并从他的分数中获取一些数据。首先,我得到一个名称列表,然后将它们插入到我的数据库中,然后将它们提供给 cURL 以从 hiscores 中获取统计信息,然后将它们更新到我的数据库中。
问题似乎是当我发出 cURL 请求时,我设法在主机显示 503 错误(可能是由于最长执行时间)之前更新了大约 30 个名称。但是,我必须能够更新更多。我会说 100 是最低要求。
我已尝试优化代码,使其运行得更快并取得一些成功。我一次查询最多可以更新 30 人。
代码本身是否有问题,为什么需要这么长时间?下面是代码的 cURL 部分,它可能不是你见过的最漂亮的。我会假设 cURL 能够一次处理更多的数据,并且我之前有类似的解决方案,但数据库无法正常工作。原因可能是https吗?以前不需要,但现在需要。
<?php
$ch = curl_init();
if(isset($_POST['submit'])){ //check if form was submitted
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
//get users
$stmt = $conn->prepare("SELECT m.name, m.id, m.group_id, p.field_1, g.prefix, g.suffix FROM members m INNER JOIN pfields_content p ON m.id = p.id INNER JOIN groups g ON g.g_id = m.group_id WHERE
m.group_id = 1
");
$stmt->execute();
$result = $stmt->get_result();
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
// add new member ID to database
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$stmt = $conn->prepare("INSERT IGNORE INTO `table` (`member_id`, `name`, `dname`) VALUES ('".$row['member_id']."', '".$row['name']."', '".$row['field_1']."')");
$stmt->execute();
// dname
if($row['field_1'] != '' || $row['field_1'] != NULL) {
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($ch, CURLOPT_URL, "https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?player=".$row['field_1']);
curl_setopt($ch, CURLOPT_HEADER, 0);
// grab HTML
$data = curl_exec($ch);
$array = array();
$array = explode(',', $data);
//formula
if (!empty($array[15]) && (is_numeric($array[15]))) {
$level = ((round($array[13]/2, 0, PHP_ROUND_HALF_DOWN)+$array[9]+$array[7])/4) + (($array[3]+$array[5])*0.325);
$level = number_format($level, 2);
// if valid name, update
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$stmt = $conn->prepare("UPDATE table SET
member_id = '".$row['id']."',
name = '".$row['name']."',
cb = '".$level."' WHERE member_id = ".$row['id']."");
$stmt->execute();
$conn->close();
}}}}
【问题讨论】:
-
那是一些看起来很疯狂的代码 - 新的数据库连接,循环中的准备好的语句......真的吗?
-
您查看日志了吗?也许错误就在你身边,例如 max-executiontime/memory 等。
-
@RamRaider 就像我说的,绝不是漂亮。我只是在空闲时间编写代码,所以如果您有建议该怎么做,我会全力以赴
-
@johnSmith 我还没有这样做,但我想我需要看看