如何在第一次收到 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
    }
}