如何在第一次收到 GET- 请求后 30 分钟发送一条推文?
How to send a Tweet 30 minutes after first received GET- request?
我想在收到 'open' GET 请求 30 分钟后发送一条推文。我的 Raspberry Pi 在冰箱门打开时发送 'open' 请求,在门关闭时发送 'close' 请求。时间范围应防止人们忘记冰箱的门是开着的。我如何在 PHP 中执行此操作?
<?php
require_once 'src/twitter.class.php';
$devicename = $_GET["devicename"];
$action = $_GET["action"];
// If device name and action is not empty
if (!empty($devicename) && !empty($action)) {
// Create database connection
require_once 'db_connect.php';
// Get all info related to received device name
$query = "SELECT * FROM devices WHERE devicename='$devicename'";
$result = mysqli_query($con, $query);
// If result is useful
if ($result) {
$row = mysqli_fetch_assoc($result);
$consumerkey = $row["consumerkey"];
$consumersecret = $row["consumersecret"];
$accesstoken = $row["accesstoken"];
$accesstokensecret = $row["accesstokensecret"];
$message = null;
// If GET parameter has value 'open'
if ($action == 'opened') {
// Get related message from database info and send tweet with related tokens
$message = $row["message1"];
send_tweet($consumerkey, $consumersecret, $accesstoken, $accesstokensecret, $message);
} else if ($action == 'closed') {
$message = $row["message2"];
send_tweet($consumerkey, $consumersecret, $accesstoken, $accesstokensecret, $message);
} else {
echo "<script type='text/javascript'> alert('Error at sending tweet! Check your GET parameters!'); </script>";
}
}
mysqli_close($con);
}
function send_tweet($consumerkey, $consumersecret, $accesstoken, $accesstokensecret, $message) {
$twitter = new Twitter($consumerkey, $consumersecret, $accesstoken, $accesstokensecret);
// Get local time and date
$datetime = date("d-m-Y H:i:s");
try {
// Send tweet with local time and date and message
$tweet = $twitter->send($datetime . ' ' . $message);
}
catch (TwitterException $e) {
echo '<script type="text/javascript">alert("Error:' . $e->getMessage() . '"); </script>';
//echo 'Error: ' . $e->getMessage();
}
}
?>
与其将其视为一个进程,不如将其视为两个进程。
进程仅检测到 open/close 个事件。
如果有超过 30 分钟的打开事件没有关闭事件,则其他进程发推文
您只需将日期和事件插入数据库并通过 GET 请求执行的第一个过程。
第二个进程检测是否需要发送推文,它可以通过 cronjob 每 5 分钟或每分钟执行一次。此过程仅检查数据库中是否存在没有关闭事件的打开事件,以及此打开事件是否已在 30 分钟或更长时间前创建。只需检查每个设备的最后一个事件是否为打开事件,您可以在一个名为例如推特的列中设置此事件已推特。
Table event:
id: INT autoincrement
event: ENUM(open, closed)
date_created: DATETIME
tweeted: INT
$sql = 'SELECT * FROM events WHERE device = $device ORDER BY date_created DESC LIMIT 1;'
$result = mysqli_query($con, $sql);
if ($result){
$row = mysqli_fetch_assoc($result);
if ($row['event'] == 'open' &&
$row['tweeted'] == 0 &&
$row['date_created'] < date("Y-m-d H:i:s", strtotime("-30 minutes"))){
// Send tweet
// Update row with tweeted = 1 to not tweet it twice
}
}
我想在收到 'open' GET 请求 30 分钟后发送一条推文。我的 Raspberry Pi 在冰箱门打开时发送 'open' 请求,在门关闭时发送 'close' 请求。时间范围应防止人们忘记冰箱的门是开着的。我如何在 PHP 中执行此操作?
<?php
require_once 'src/twitter.class.php';
$devicename = $_GET["devicename"];
$action = $_GET["action"];
// If device name and action is not empty
if (!empty($devicename) && !empty($action)) {
// Create database connection
require_once 'db_connect.php';
// Get all info related to received device name
$query = "SELECT * FROM devices WHERE devicename='$devicename'";
$result = mysqli_query($con, $query);
// If result is useful
if ($result) {
$row = mysqli_fetch_assoc($result);
$consumerkey = $row["consumerkey"];
$consumersecret = $row["consumersecret"];
$accesstoken = $row["accesstoken"];
$accesstokensecret = $row["accesstokensecret"];
$message = null;
// If GET parameter has value 'open'
if ($action == 'opened') {
// Get related message from database info and send tweet with related tokens
$message = $row["message1"];
send_tweet($consumerkey, $consumersecret, $accesstoken, $accesstokensecret, $message);
} else if ($action == 'closed') {
$message = $row["message2"];
send_tweet($consumerkey, $consumersecret, $accesstoken, $accesstokensecret, $message);
} else {
echo "<script type='text/javascript'> alert('Error at sending tweet! Check your GET parameters!'); </script>";
}
}
mysqli_close($con);
}
function send_tweet($consumerkey, $consumersecret, $accesstoken, $accesstokensecret, $message) {
$twitter = new Twitter($consumerkey, $consumersecret, $accesstoken, $accesstokensecret);
// Get local time and date
$datetime = date("d-m-Y H:i:s");
try {
// Send tweet with local time and date and message
$tweet = $twitter->send($datetime . ' ' . $message);
}
catch (TwitterException $e) {
echo '<script type="text/javascript">alert("Error:' . $e->getMessage() . '"); </script>';
//echo 'Error: ' . $e->getMessage();
}
}
?>
与其将其视为一个进程,不如将其视为两个进程。
进程仅检测到 open/close 个事件。
如果有超过 30 分钟的打开事件没有关闭事件,则其他进程发推文
您只需将日期和事件插入数据库并通过 GET 请求执行的第一个过程。
第二个进程检测是否需要发送推文,它可以通过 cronjob 每 5 分钟或每分钟执行一次。此过程仅检查数据库中是否存在没有关闭事件的打开事件,以及此打开事件是否已在 30 分钟或更长时间前创建。只需检查每个设备的最后一个事件是否为打开事件,您可以在一个名为例如推特的列中设置此事件已推特。
Table event:
id: INT autoincrement
event: ENUM(open, closed)
date_created: DATETIME
tweeted: INT
$sql = 'SELECT * FROM events WHERE device = $device ORDER BY date_created DESC LIMIT 1;'
$result = mysqli_query($con, $sql);
if ($result){
$row = mysqli_fetch_assoc($result);
if ($row['event'] == 'open' &&
$row['tweeted'] == 0 &&
$row['date_created'] < date("Y-m-d H:i:s", strtotime("-30 minutes"))){
// Send tweet
// Update row with tweeted = 1 to not tweet it twice
}
}