php消息发送者有延迟

时间:2013-01-29 11:42:41

标签: php mysql sender

此代码从我的数据库中提取用户ID并向其发送消息。问题是尝试将消息同时发送给所有用户并且我的数据库发生故障。如果我将它发送给许多用户,我会收到错误。有人可以帮我把它发送给1个用户或2个用户,并且可能会在消息之间延迟几秒钟吗?

$result = mysql_query("
        SELECT
            *
        FROM
            offline_access_users
    ");

    if($result){
        while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
            $msg['access_token'] = $row['access_token'];
            try {
                $facebook->api('/me/feed', 'POST', $msg);
                $output .= "<p>Posting message on '". $row['name'] . "' wall success</p>";
            } catch (FacebookApiException $e) {
                $output .= "<p>Posting message on '". $row['name'] . "' wall failed</p>";

            }
        }
    }

2 个答案:

答案 0 :(得分:0)

你需要稍微考虑一下。

首先,您需要在 cronjob 中执行此操作,例如,每5分钟运行一次。

在此之后,您需要了解如何限制邮件更频繁地每人每天发送一次(或您想要的任何限制) - 因此您需要创建一个额外的字段message_sent_date in你的桌子。

然后,您需要限制每个cronjob运行的用户数量。

// replace mysql with mysqli or PDO !!!
$result = mysqli_query($link, "
        SELECT *
        FROM offline_access_users
        ORDER BY message_sent_date ASC
        LIMIT 5
    "); // this takes the 5 users that received messages the longest time ago

接下来,在while循环内,执行此查询(在try块中)。

$updateQuery = "UPDATE offline_access_users SET message_sent_date = CURRENT_TIMESTAMP WHERE id = {$row[id]}";

那应该是它,让我知道它是怎么回事。

结果

此脚本将每5分钟运行一次,并选择5个尚未收到消息的用户(此处的逻辑取决于您的需求,因此您应该更清楚一点。)

答案 1 :(得分:-1)

尝试以下代码:

$offset = 0; //Starting Point
$limit = 2;  //Number of records to work with per loop
while(1)
{
    $result = mysql_query("
        SELECT * FROM offline_access_users LIMIT $offset,$limit
    ");

    if($result){
        while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
            $msg['access_token'] = $row['access_token'];
            try {
            $facebook->api('/me/feed', 'POST', $msg);
            $output .= "<p>Posting message on '". $row['name'] . "' wall success</p>";
            } catch (FacebookApiException $e) {
                $output .= "<p>Posting message on '". $row['name'] . "' wall failed</p>";

            }
        }
    }
    else
        break;
    $offset = $offset + $limit;
}