2017-02-12 397 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插入提示。 –