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