2011-12-22 32 views
1

我需要創建一個事件監聽器。我是一個新手,所以要友好:)在PHP中創建事件監聽器,等待XML內容

基本上我在page1.php(php文件);我想在一個循環內檢查page2.xml(xml文件)的某些信息,這些信息應該在某個時間點被接收。要麼一直檢查它,要麼等待,每隔5分鐘左右看看是否收到了一些信息。他們中的任何一個都適合我。

如果幾分鐘後沒有收到任何信息,那麼我想再次運行循環(直到它被接收到),否則,向前移動並用我新收到的信息做一些事情。這部分我沒有問題,只是事件監聽器本身。我無法在任何地方找到我應該使用的功能。 :(我只需要經常檢查和檢索xml文件的內容

我不太確定我應該如何去解決這個問題,如果不是隻有一個這樣做的函數,當我搜索「事件監聽器的php」時,找到很多東西。

任何幫助將不勝感激:參考教程/示例代碼/甚至只是告訴我什麼關鍵字我應該尋找或我需要先學習什麼要做到這一點。

謝謝!

+0

該文件如何更新?它是否在你的服務器上,其他腳本正在更新它,還是你從其他服務器上拉它?您是在談論服務器上長時間運行的PHP腳本還是關於網站/客戶端的輪詢? – deceze 2011-12-22 01:22:07

+0

這個xml文件正在被外部服務器更新,但它位於我的服務器上 - 與php文件一樣。 – 2011-12-22 01:36:52

+0

我不確定什麼是「長時間運行的PHP腳本」或「輪詢」,或者它們之間有什麼區別。這基本上是一個外部的API,它更新我的XML文件。我的PHP腳本應該運行,直到它收到這些信息並對它做了一些事情,然後它可以停止。此外,這不必在網站上提供輸出(儘管可以)。這可能只是在一個由頁面觸發的php頁面中,並且現在正在運行(如果甚至可以的話) – 2011-12-22 01:39:40

回答

1

我做了以下內容:

自動保存到數據庫中每一次新的東西進來

然後跑了PHP的循環,每隔幾分鐘檢查,看看是否存在符合該數據庫的一些新的東西。這個新事件的參數(包括它發生在過去幾分鐘的時間範圍內)。我在循環中使用了flush();,然後使用sleep(120);來讓循環每隔幾分鐘繼續運行,直到新信息進入,在這種情況下,它將會break();die();

1

哦,首先你要了解你所使用的術語。PHP是不是一個事件驅動語言,它是一種請求驅動的語言。一個請求進入Web服務器,PHP解析它並將響應發送回請求者。在任何時候都不會觸發您可以處理或處理的事件。你可以實現你自己的「事件系統」,但最終這比你的用例需要更多的工作。

您最好的選擇是使用AJAX並不斷向PHP腳本發出請求,直到您返回您正在查找的數據。最終,您需要了解JavaScript對象XMLHttpRequest。在瞭解如何利用JavaScript進行異步請求之後,您可以查看setInterval()方法以瞭解如何重複發出請求。

一旦您可以重複發出異步請求,它應該是一個相對簡單的創建網頁的過程,您可以在其中觸發要發送的AJAX請求。


在您的PHP代碼中不需要循環。循環在另一端有效完成。以下是您可能遵循的文本工作流程:

  1. 轉到旨在觸發您的AJAX調用並觸發它們的站點。
  2. 向您的PHP腳本發出異步請求。
  3. 在您的PHP腳本中打開XML文件並檢查必要的內容。
  4. 以JSON對象的形式返回響應。一個響應可能意味着數據未更新,另一個響應則意味着數據已更新。
  5. 如果未從步驟(2)重複更新數據,則解析響應。如果數據更新繼續步驟(6)。
  6. 顯示您的數據已更新的慶祝問候語或通知我們仍在等待數據更新。也許你也可以嘗試一些嘗試,偏離一邊。
+0

好酷我知道如何使用ajax,我在其他地方使用了jquery的ajax功能,我只是認爲,因爲這是php循環的一部分,它是不可能的?那麼我應該從php循環中間運行一個腳本? – 2011-12-22 02:09:21

0

我做了這樣的事情,在PHP中編寫收件箱解析器。你最好的選擇是:

代碼page1.php中,你只需要做兩件事情:從page2.xml和 讀取XML,如果有什麼「新」只是執行數據分析 代碼。

設置一個Cron工作(如果你在linux下)每5分鐘執行一次(Cron命令類似於:php /path/to/page1.php)。同樣,如果你正在運行Windows,你可以設置一個計劃任務並執行相同的命令。請注意,PHP安裝的完整路徑應該在PATH環境變量中。

+0

我可以設置cronjob作爲php環路的一部分在page1.php中運行嗎?我認爲這種情況並不像工作無限期運行的收件箱,我只需要用戶觸發此循環,然後運行1-5次,直到xml中出現新內容,然後完全停止。用cronjob可以嗎? – 2011-12-22 02:30:32

+0

@LucyWeatherford是的,我認爲應該可以使用'shell_exec'來管理cron作業(即創建並啓動一個作業,每五分鐘運行五次)。 – gremo 2011-12-22 02:45:15