我正在尝试构建一个将查询数据库的应用程序,并在数据进入数据库时将数据发送到某个地方。
我可以使用以下代码从数据库中获取我想要的数据:
$sql="SELECT * FROM `signals` order by `time` DESC LIMIT 100";
$result = mysqli_query($DatabasePointer,$sql)
or die(mysqli_error($DatabasePointer));
$row_cnt = mysqli_num_rows($result);
if($row_cnt>0)
{
$array = array();
$i=0;
while($row = mysqli_fetch_array($result))
{
$i++;
//$a = array();
$epoch = $row['time'];
// convert UNIX timestamp to PHP DateTime
$dt = new DateTime("@$epoch");
if(
($row['symbol'] === 'USDJPYecn')
|| ($row['symbol'] === 'USDCADecn')
|| ($row['symbol'] === 'EURUSDecn')
)
{
if(
($row['timeframe'] === 'M5')
|| ($row['timeframe'] === 'M15')
)
{
$a = array(
"time" => $dt->format('Y-m-d H:i:s'),
"signal" => $row['signal'],
"symbol" => $row['symbol'],
"price" => $row['price'],
"timeframe" => $row['timeframe'],
"epoch" => $row['time'],
"candel" => $row['candel']
);
$array[] = $a;
}
}
} // while
echo json_encode($array, JSON_UNESCAPED_SLASHES);
}
但是,我不知道如何修改代码以检查数据是否是新的,或者是否已经发送到其他来源。我也不确定如何修改代码只发送新数据,因为它命中数据库,而不是像我现在调用的整个数据数组。
有人可以指出我正确的方向吗?
编辑:
$sql="SELECT * FROM `tdisignals` order by `time` DESC LIMIT 100";
$result = mysqli_query($DatabasePointer,$sql)
or die(mysqli_error($DatabasePointer));
$row_cnt = mysqli_num_rows($result);
if($row_cnt>0)
{
$array = array();
$i=0;
while($row = mysqli_fetch_array($result))
{
$i++;
//$a = array();
$epoch = $row['time'];
// convert UNIX timestamp to PHP DateTime
$dt = new DateTime("@$epoch");
if(
$row['symbol'] === 'USDJPYecn'
|| ($row['symbol'] === 'USDCADecn')
|| ($row['symbol'] === 'GBPUSDecn'))
{
if(
$row['timeframe'] === 'M5')
|| ($row['timeframe'] === 'M15'))
{
$a = array(
"time" => $dt->format('Y-m-d H:i:s'),
"signal" => $row['signal'],
"symbol" => $row['symbol'],
"price" => $row['price'],
"timeframe" => $row['timeframe'],
"epoch" => $row['time'],
"candel" => $row['candel'],
);
$array[] = $a;
}
}
}
// echo json_encode($array, JSON_UNESCAPED_SLASHES);
$fuegostore = json_encode($array, JSON_UNESCAPED_SLASHES);
// $sql2 = "INSERT INTO fuegosync (time, lastsync) ".
// "VALUES ('$date', '$fuegostore')";
// $result2 = mysqli_query($DatabasePointer,$sql2)
// or die(mysqli_error($DatabasePointer));
$sql3="SELECT lastsync, MAX(CAST(time AS CHAR)) FROM `fuegosync`";
$result3 = mysqli_query($DatabasePointer,$sql3)
or die(mysqli_error($DatabasePointer));
$row2 = mysqli_fetch_row($result3);
if($row2[0] === $fuegostore)
echo 'No New Signals';
else
echo 'New Signals';
///OPTION 1:
//print_r (json_encode($array[0], JSON_UNESCAPED_SLASHES));
//OPTION 2:
foreach($array as $x) {
if(strtotime($array[0]['time']) >= $row2[1]) {
echo '<br /><span>'.$x['signal'].' - '.$x['symbol'].' - '.$x['price'].'<br />';
} else {
echo 'No New Signals';
}
}
echo $row2[0];
}
此代码成功检测到数据库中的新数据。我现在正在努力的是修改代码只显示新检测到的数据,而不是你看到的整个数组。
新编辑: 我得到的代码只显示最新的数据,但现在我有一个难题。 如果我每分钟轮询一次数据库,并且新的数据点击数据库,则脚本会将其拾取 - 但是如果另一个新数据在第一个新部分发送到目标后的第二个数据点击,则第二个新作品将完全被忽略,因为民意调查将是每一分钟。我基本上每隔几秒就要对数据库进行轮询......这听起来像是一场表演噩梦...
灰显的选项1显示最新数据,但会在基于分钟的轮询之前跳过较新的部分,除非每秒轮询数据库。 选项2有效,但显示整个数组...所以我不确定如何修改代码只显示最新的部分,而不是整个部分。
有什么建议吗?
答案 0 :(得分:3)
执行此类操作的最安全方法之一是:
循序渐进,源头驱动
id
id
知道id
,从源代码获取所有新记录,并使用这些数据查询目标上的插入页面替代,目标驱动
id
id
并向新来源询问数据你可以再次进入第一步。如果你小心插入(使用回滚,在一次失败时打破完整批处理),每当源/目标链路出现故障时,你应该有一个完美的目标,并且带宽尽可能低。
这允许从源发送批量数据而无需回答或目标操作。
这不关心数据是否在途中丢失,只发送一次。
send
<强>步骤一步强>
send
位于0
send ==0
send = -1
-1
并将其发送到目标-1
更新为1
回到第一步。
这样就可以让你获得大批量而无需让lock write
等待发送脚本,并确保你不能在发送脚本之间放置一些线路。
这看起来很像前一个,但是我们只是使用一个新表来保持上一次同步,而不是每一行都有一个字段:
<强>步骤一步强>
timestampOfPost <= timestamp-1
和timestampOfPost > timestampLastSync
timestamp - 1
更新上次同步时间戳。如果你没有及时使用&#34;去1seconde,那么时间戳可能会很棘手&#34;并将其保存在变量中,因为您可能会丢失一些更新:
如果你发送***754
(。1)s,***754
(。2)s到(.9)s的每一行都将被视为发送,因为我们已经完成了时间戳{{ 1}}并将在***754
开始下一次发送。