2016-03-14 68 views
0

我有多個運行24/7的PHP腳本,每個腳本都在不同的機器上,從Internet獲取有關用戶的信息。如何讓PHP腳本實時響應數據庫插入?

這些用戶是在一個表中(PostgreSQL的)數據庫。每當新用戶在應用程序中註冊時,表中就會插入一條新記錄,將其分配給當前正在運行的PHP腳本之一(均勻分配負載)。

有沒有一種方法,以便它已分配給能實時反應的PHP腳本,以便開始獲取關於立即將用戶信息?

(當前設置我的是,每個PHP腳本查詢表每隔1分鐘,並檢查是否新用戶被分配給它......但更頻繁的查詢增加數據庫負載,並在1分鐘的窗口,我我不取出由新添加的用戶信息)

+0

簡短的回答 「沒有」。長的答案,開始看Node.js。 – jjwdesign

+0

檢查'LISTEN'和'NOTIFY'的postgres手冊。 –

+0

順便說一句你爲什麼用'mysql'標記問題? –

回答

1
+0

但我仍然需要調用'pg_get_notify()'每1分鐘來查看是否有新的通知已發佈,是不是?我認爲這比查詢表更輕量級,我可以增加輪詢頻率? – hallaplay835

+0

@ hallaplay835不,你不需要每分鐘都打電話給它。它會阻止腳本執行,直到收到通知。如果你不想讓腳本被阻塞,那麼就有需要輪詢套接字的解決方法。無論如何,只是谷歌的例子。 'LISTEN/NOTIFY'絕對是PostgreSQL實時事件的一種方式。 – AlexM

0

觸發從sys_exec()發射的HTTP請求從SQL觸發器?但它似乎矯枉過正。

DELIMITER $$ 

CREATE TRIGGER `test_after_insert` AFTER INSERT ON `test` 
FOR EACH ROW BEGIN 

SET @exec_var = sys_exec('/usr/bin/php /myApp/after_insert.php') 
END; 
$$ 

DELIMITER ; 

我知道這不是一個postgres腳本,但它應該工作。

---編輯---

和之後after_insert.php

function httpPost($url, $data) 
{ 
    $curl = curl_init($url); 
    curl_setopt($curl, CURLOPT_POST, true); 
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data)); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    $response = curl_exec($curl); 
    curl_close($curl); 
    return $response; 
} 

來源: How to make an HTTP Post

+0

這將啓動'after_insert.php' ...這將發出一個HTTP請求?所以HTTP請求被髮送到最初運行的PHP腳本所在的機器......並且它將如何被警告? – hallaplay835

+0

嗯,是的,爲什麼不呢? SQL觸發器 - > sys_exec - > after_insert.php - > http post到您的遠程腳本。我將更新我的答案 –

+0

我的PHP腳本'A.php'運行在沒有Web服務器的機器上。如果我安裝了一個,請求將由另一個PHP腳本'B.php'處理,該腳本必須以某種方式與'A'進行通信。怎麼樣? [進程間通信](http://php.net/manual/en/function.stream-socket-pair.php)?也許[tick處理程序](http://php.net/manual/en/control-structures.declare.php)?你確定這比連續查詢表更有效嗎? – hallaplay835