我正在使用 PHP 为个人创建一个事件源,然后我将继续创建组源。
所以我有表格
表:组名 1. 第一组 2. 第 2 组 3.第3组
表:成员 1. 第1组 > 成员1、成员2、成员3、成员4、成员5 2.第2组>成员3、成员4、成员5、成员5....
有些群组有数千名成员。 因此,每当我发布提要时,我都会执行以下操作。
$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 文件需要花费时间来执行。
最佳答案
您可以将您的 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
}
关于PHP调用外部脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42193476/