我正在为个人创建一个PHP活动源,我正在继续创建组源。
所以我有
表表:组名 1.第1组 2.第2组 3.第3组
表:成员 1.第1组>会员1,会员2,会员3,会员4,会员5 2.第2组>会员3,会员4,会员5,会员5 ....
有些团体有数千名成员。 因此,当我发布一个feed时,我会做类似以下的事情。
$result = $this->db->query('SELECT member_id FROM members WHERE group_id = 1');
$members = $result->fetchAll();
foreach ($members as $member) {
$query = $this->db->prepare('INSERT INTO activity_feed (user_id, activity) VALUES(:user_id, :activity);
if ($result = $query->execute(array(
':user_id' => $member['member_id'],
':activity' => $activity
))) {
//do something
$pusher->push(activity) //socket push notification
}
}
插入个人订阅源只需要一个mysql数据库插入,其中如您所见,对于组订阅源,当成员数量增加时,循环会呈指数级增长。
我在考虑使用单独的PHP文件填充活动源,并在活动发生时执行它。 如何调用单独的PHP文件?
有没有更好的办法解决这个问题?
如果不是,每当有人向群组发帖子,或者将图片上传到群组,然后PHP文件需要花时间执行时,我必须经历循环。
答案 0 :(得分:3)
您可以将PHP代码放入单独的文件中,例如dbnotify.php
,然后使用exec()
调用它:
<?php
$group = 1;
$activity = "foo";
exec("/path/to/dbnotify.php $group $activity &");
请注意命令后的&
,这会将其置于后台并立即返回。
现在,在外部脚本中,您希望读取在命令行上传递的值并将它们放入查询中。此外,通过使插入成为单个查询,您可以大大提高此数据库性能:
#!/usr/bin/php
<?php
$groupid = $argv[1];
$activity = $argv[2];
$query = $this->db->prepare("INSERT INTO activity_feed (user_id, activity) SELECT member_id, :activity FROM members WHERE group_id = :group_id");
$result = $query->execute(array(":activity"=>$activity, ":group_id"=>$groupid));
$result = $this->db->query('SELECT member_id FROM members WHERE group_id = 1');
$members = $result->fetchAll();
foreach ($members as $member) {
$pusher->push(activity); //socket push notification
}