2016-09-04 109 views
1

我有一個PHP腳本來從第三方源拉取用戶特定的數據並將其轉儲到本地表中,我想在用戶登錄時執行每個X分鐘,但它大約需要30秒的時間來運行,我不希望用戶體驗。我認爲這樣做的最好方法是爲每個成功拉取時間戳,然後在每個頁腳中放置一些代碼,檢查最後一次拉取,並在後臺執行PHP腳本(如果超過X分鐘前)。PHP頁面執行後臺進程

我不想使用cron作業來執行此操作,因爲在執行拉動腳本時,我需要特定於用戶的全局和會話變量。

我可以看到,popen()允許我運行PHP腳本,但我似乎無法找到任何有關這是否會作爲訪問者在其會話中運行的信息(因此可以訪問用戶特定的全局或會話變量)或完全作爲單獨的會話。

  1. 請問popen()能解決我的問題嗎?
  2. 我是否正在以正確的方式進行操作,或者是否有更好的方法在用戶登錄時按間隔執行腳本?

任何幫助或建議非常感謝,一如既往!

乾杯

安迪

+0

單獨的過程總是一個單獨的過程。在腳本中加載會話可能更容易(完全取決於代碼以及如何管理會話),或者僅將JSON(或序列化數組)與作爲參數的信息一起傳遞給進程。 –

+0

當用戶登錄時,每X分鐘需要執行一次該代碼的原因是什麼?代碼是做什麼的? – Sherif

回答

0

我會使用JavaScript和Ajax請求調用從前端腳本和處理結果。 然後,您可以在JavaScript中設置時間間隔,併發送一個AJAX-Request每個間隔刻度。

+1

如果您使用標準會話處理程序(使用文件),則無法發出新請求,因爲它必須等到ajax調用完成。 ajax調用正在鎖定會話文件,因此新的請求無法訪問它,從而導致它們掛起。 – MarcHoH

+0

這隻適用於他想要同時提出請求的情況。 –

2

也許一個想法把會話數據也放在一個表中。 通過這種方式,您可以輕鬆地從後臺進程訪問它。您只需要通過session_id()user id作爲參數,以便過程知道它當前正在處理哪個用戶。

2
  1. 沒有,因爲PHP仍然需要等待由popen()啓動的進程,纔可以退出
  2. 大概不會,因爲該解決方案不符合系統

的結構限制你不使用cron作業的推理實際上並不健全。你可能已經放棄了快速探索這條特定路徑,並且試圖將一個方形釘子安裝在一個圓孔中,將自己拉到一個角落裏。

您遇到的真正問題是搞清楚如何在web請求和從crontab運行的PHP之間進行進程間通信。這可以通過多種方式解決,並且更容易嘗試針對PHP的體系結構約束。

例如,您可以將會話標識存儲在數據庫或其他存儲中,並可以從運行在crontab中的PHP腳本訪問會話文件,而不受Web請求的限制。

假設您通過將某些數據存儲中的此信息作爲時間戳與用戶表中的當前會話ID一起存儲,根據他們對服務器發出的最後一個請求確定用戶已登錄。

cron作業可以每隔X分鐘啓動一次,查看數據庫或持久性存儲區中的活動時間戳記在給定範圍內的任何記錄,然後將這些會話標識符並執行所需的操作。

現在,如果處理時間超過30秒,如何真正有效地擴展這個問題,也可以單獨解決。 See this answer for more details on how to deal with distributed job managers/queues from PHP