Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有延迟的php消息发送器_Php_Mysql_Sender - Fatal编程技术网

带有延迟的php消息发送器

带有延迟的php消息发送器,php,mysql,sender,Php,Mysql,Sender,这段代码从我的数据库中提取用户ID并向他们发送消息。问题是,试图同时向所有用户发送消息时,my db出现故障。如果我把它发送给许多用户,就会出错。有人能帮我让它发送消息给一个或两个用户的时间,也许几秒钟延迟之间的消息 $result = mysql_query(" SELECT * FROM offline_access_users "); if($result){ while($r

这段代码从我的数据库中提取用户ID并向他们发送消息。问题是,试图同时向所有用户发送消息时,my db出现故障。如果我把它发送给许多用户,就会出错。有人能帮我让它发送消息给一个或两个用户的时间,也许几秒钟延迟之间的消息

$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>";

            }
        }
    }
$result=mysql\u查询(“
挑选
*
从…起
脱机访问用户
");
如果($结果){
而($row=mysql\u fetch\u array($result,mysql\u ASSOC)){
$msg['access_token']=$row['access_token'];
试一试{
$facebook->api('/me/feed',POST',$msg);
$output.=“在”.$row['name']。“'wall success

”; }捕获(FacebookApiException$e){ $output.=“在”.$row['name']。“'wall failed

”; } } }
你需要仔细考虑一下

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

在此之后,您需要了解如何限制消息的发送频率,使其不超过每人每天发送一次(或任何您想要的限制),因此您需要在表中创建一个额外字段
message\u sent\u date

然后,您需要限制每个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块中)

应该是这样,让我知道进展如何

结果

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

请尝试以下代码:

$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;
}
$offset=0//起点
$limit=2//每个循环要处理的记录数
而(1)
{
$result=mysql\u查询(“
选择*从脱机访问用户限制$offset,$LIMIT
");
如果($结果){
而($row=mysql\u fetch\u array($result,mysql\u ASSOC)){
$msg['access_token']=$row['access_token'];
试一试{
$facebook->api('/me/feed',POST',$msg);
$output.=“在”.$row['name']。“'wall success

”; }捕获(FacebookApiException$e){ $output.=“在”.$row['name']。“'wall failed

”; } } } 其他的 打破 $offset=$offset+$limit; }
这与此完全相同,但并不能解决问题,因为这不会增加发送消息之间的延迟。这个概念也是有缺陷的,因为即使您添加了
睡眠
,脚本也必须不断运行,但大部分时间它将等待
睡眠
结束。
$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;
}