2017-02-12 111 views
0

我正在用PHP为个人创建一个活动提要,并且我正在创建组提要。PHP调用外部脚本

所以我的表

表:组名称 1.组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数据库插入,whereelse正如你所看到的,对于组喂循环获取成倍放大,当成员数量的增加。

我正在考虑使用单独的PHP文件填充活动提要,并在活动发生时执行它。 如何调用单独的PHP文件?

有没有更好的主意来解决这个问题?

如果不是每次有人向该组发送消息,或者上传图像到该组,然后PHP文件需要一段时间才能执行,则必须经过该循环。

+0

我认为您要查找的是cron作业。另外,不要在foreach循环中准备查询。这违反了使用准备好的声明的一半目的。准备一次,执行很多次。 – miken32

+0

[如何在服务器端计划PHP脚本的执行?]可能的重复(http://stackoverflow.com/questions/1194857/how-to-schedule-the-execution-of-a-php-script在服务器端) – miken32

+0

@ miken32我了解cron工作,但cron工作意味着我无法在事件发生时立即通知成员。 –

回答

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 
} 
+0

确切地说,即时通讯寻找和感谢你的改进MySQL插入提示。 –