Php 比较时间值以查找新记录需要花费很长时间
好的。所以我一直在绞尽脑汁想弄明白为什么我的脚本要花很长时间才能运行。我已经查明了一个潜在的原因,并想找出一种更有效的方法来执行以下功能:Php 比较时间值以查找新记录需要花费很长时间,php,Php,好的。所以我一直在绞尽脑汁想弄明白为什么我的脚本要花很长时间才能运行。我已经查明了一个潜在的原因,并想找出一种更有效的方法来执行以下功能: function getwrs($obj, $recs) { foreach ($obj as $key => $val) { for ($i=0; $i<count($recs); $i++) { $wr = array(); if ($recs[$i][0] === $k
function getwrs($obj, $recs) {
foreach ($obj as $key => $val) {
for ($i=0; $i<count($recs); $i++) {
$wr = array();
if ($recs[$i][0] === $key) {
$wr = $recs[$i];
break;
}
}
if (count($wr) > 0) {
for ($i=0; $i<count($val); $i++) {
if ($val[$i]["time"] < $wr[1] && abs($wr[1] - $val[$i]["time"]) < 30) {
$uwrs[] = array($val[$i], $wr);
}
}
}
}
return $uwrs;
}
其中,$top15[“pro”]
是具有以下结构的多维数组:
[MAP1NAME] => Array
(
[0] => Array
(
[authid] => XXXX
[name] => XXXX
[time] => XXXX
[date] => XXXX
...
)
)
[MAP2NAME] => Array
(
[0] => Array
(
[authid] => XXXX
[name] => XXXX
[time] => XXXX
[date] => XXXX
...
)
[1] => Array
(
[authid] => XXXX
[name] => XXXX
[time] => XXXX
[date] => XXXX
...
)
...
)
[0] => Array
(
[0] => MAP1NAME
[1] => TIMEVAL
[2] => USERNAME1
[3] => COUNTRY
)
...
包含1500多个条目,$recs是一个数组,包含可比较的值和大约3000个具有以下结构的条目:
[MAP1NAME] => Array
(
[0] => Array
(
[authid] => XXXX
[name] => XXXX
[time] => XXXX
[date] => XXXX
...
)
)
[MAP2NAME] => Array
(
[0] => Array
(
[authid] => XXXX
[name] => XXXX
[time] => XXXX
[date] => XXXX
...
)
[1] => Array
(
[authid] => XXXX
[name] => XXXX
[time] => XXXX
[date] => XXXX
...
)
...
)
[0] => Array
(
[0] => MAP1NAME
[1] => TIMEVAL
[2] => USERNAME1
[3] => COUNTRY
)
...
此函数的目的是通过比较我的数据库($top15
)中每个地图的时间值与官方世界记录数组($recs
)中的时间值来查找非官方世界记录
现在,我从数据库中获取每个地图名称,并从官方世界记录数组中找到相同的字符串,然后将地图的官方世界记录值存储在变量$wr
中(如果有官方记录)。接下来,我从数据库中循环查看完成时间的数组,找出哪些时间(如果有的话)少于官方记录的时间。每次这是真的,我都会将与数据库时间和官方记录时间(用户、时间等)相关的信息推送到一个新数组中。对于数据库中的每个键(映射名称),都会重复此操作。最后,函数返回我的非官方世界记录数组($uwrs
)
问题很简单:出于某种原因,这需要太长时间。我最初是用JavaScript编写脚本的,它响应速度很快,所以我可能认为我在这里做错了什么。有什么帮助吗
编辑:我使用xdebug来找出问题所在,当我添加对这个函数的调用时,我的输出文件从3MB变为超过30MB,脚本运行时间从大约1秒变为15-20秒。我对这个工具比较陌生,所以我不知道这些信息是否重要
编辑2:根据要求,我的数据库结构如下:
map | authid | name | time | date | weapon
例:
通过创建13000000个不同的变量并在执行循环之前将它们设置为每个数组的长度,解决了这个问题。通过阅读发现,每次使用for循环时,我都会数到1500/3000/等。我猜这会影响PHP的性能。在多次阅读您的问题之后,我假设您需要一种方法来比较两个不同表中的数据 为了便于演示和简化,假设您有两个表
official
和nonofficial
official
和nonofficial
表共享相同的结构,即-
------------+-------------+----------+----------+-----------
mapid | authid | name | time | date
------------+-------------+----------+----------+-----------
map1name | 1 | bob | 03:40:17 | 2013-08-25
------------+-------------+----------+----------+-----------
map2name | 2 | hop | 01:10:56 | 2012-04-12
------------+-------------+----------+----------+-----------
map3name | 3 | cherry | 11:08:14 | 2013-05-14
------------+-------------+----------+----------+-----------
map4name | 4 | adam | 09:16:43 | 2013-07-10
------------+-------------+----------+----------+-----------
map5name | 5 | zyl | 06:01:53 | 2012-09-30
------------+-------------+----------+----------+-----------
现在,您可以执行一些高级mysqlquery,从两个表中查找数据
SELECT * FROM `unofficial` JOIN `official` WHERE `official.mapid` = `unofficial.mapid` AND TIME_TO_SEC(`official.time`) > TIME_TO_SEC(`unofficial.time`) AND ABS( TIME_TO_SEC(`official.time`) - TIME_TO_SEC(`unofficial.time`) ) < 1800
从'unofficial'JOIN'official`WHERE`official.mapid`='unofficial.mapid`和TIME-TO-SEC('official.TIME`)>TIME-TO-SEC('unofficial.TIME`)和ABS(TIME-TO-SEC('nonofficial.TIME`)中选择*
这里要做的是:
在这里,我们执行了一个mysql查询,在执行了三个条件之后,将表和获取结果连接起来-
(i) 它们的地图ID必须相同。根据上面的代码,我认为您希望匹配两个表中的地图ID,以便找到非官方世界记录
(ii)从非官方
表格开始的时间必须小于官方
表格的时间。同样,我是根据上面的代码来假设的TIME\u TO_SEC
是一个将时间转换为秒的mysql
函数。就像时间到秒('01:01:06')返回3666
(iii)与第三个时间差小于30秒。同样,它在您的代码中
我的查询可能有一些错误,如拼写错误或选择错误的列等,因为我没有对真实的数据库进行测试。但想法基本相同。您可以搜索适当的查询或阅读文档
我希望这会对您有所帮助。您能提供一些有关数据库表的信息吗?有一次,我必须解决与您的非常相似的问题,最初我从我的数据库中获取所有记录,并在其中搜索一个键,然后再次根据这些结果查询我的数据库。当数据库变大时,这是一项相当缓慢的工作。然后我使用一些高级mysql查询一次获得我想要的东西。我假设您也应该这样做——使用数据库查询获取数据。问题是,我需要数据库中的所有行用于其他功能。例如,我还制作了一个积分系统,它需要数据库中的每个条目。无论如何,仅获取和存储行只需要大约600毫秒。只有当我迭代它们时,我的速度才会大大减慢,所以我知道问题在于我的PHP脚本而不是SQL查询。你在另一个循环中运行了两个循环,这使你的脚本减慢。由于服务器和PHP本身的性能,您的脚本实际上没有停止工作:Dgood指出了sql对于这个问题的存在性。但是,您正在将MAPID转换为秒:)现在我正在使用task/cronjob每天解析一次.txt文件(以保持官方记录最新),并将其以json格式存储在服务器上的文件中。当我运行脚本时,我的PHP当前正在读取这个json文件。将官方世界记录存储在我数据库的另一个表中,这样我就可以使用纯SQL测试您的方法,这样做是否有益?应该是这样的。数据库是用来存储和检索数据的,它们可以强大地完成这项工作。您应该直接为您的正式记录更新数据库表。您可以使用php脚本解析json文件并将其更新到数据库中,然后在json对象中从数据库反向返回数据。这样,您就可以使用php交付数据,并根据您喜欢的任何条件使用sql获取数据。我认为这更合适。