iT邦幫忙

0

定時執行PHP,UPDATE資料庫

請問各位前輩:

目前有個定時更新資料庫的需求,小的我測試許多方法都無法實現,懇請各位前輩給小弟指點一下,大致上的需求如下(PHP & MSSQL):

'設定凍結日期' 為UPDATE 某個TABLE的欄位。
'設定執行日期及時間' 為要執行的日期及時間。

原本執行的日期及時間只有一個,我是用PHP的ignore_user_abort(TRUE)、SLEEP函數讓他倒數秒數 ('設定執行日期及時間' 減掉 '現在時間秒數')。
但目前有多個'設定執行日期及時間',請問各位前輩該如何修改會比較好?

https://ithelp.ithome.com.tw/upload/images/20201221/20095751FaQtD9iuUX.png

看更多先前的討論...收起先前的討論...
那就把多個日期欄位時間取出來計算後更新

也許你該使用 windows 排程或 linux cron
小吳 iT邦新手 5 級 ‧ 2020-12-21 10:20:10 檢舉
你好 我也想過排程,但是考慮到一般使用者輸入以及每次都輸入不同日期及時間,覺得還是使用網頁讓使用者輸入比較方便,不過還是謝謝你的建議。
方便請教一下這些日期時間欄位是用在什麼情境下嗎
我是用C#寫CONSOLE編譯成EXE放在排程跑,半小時跑一次,已跑好幾年沒出差錯
小吳 iT邦新手 5 級 ‧ 2020-12-21 10:29:42 檢舉
ERP的凍結日期,因為常常需要半夜凍結日期然後再跑報表,所以才希望能讓使用者白天自行輸入執行時間,讓他晚上自動跑。
小吳 iT邦新手 5 級 ‧ 2020-12-21 10:39:24 檢舉
To :japhenchen  感謝您的回覆,因為跑排程對於使用者來說比較難,所以我才想讓她們自行輸入日期及時間。
了解,但如果是這情境使用排程,使用者也不會接觸到才對,他們輸入指定日期後(這邊應該有將資料存入某個地方吧?),只要讓排程指定時間或反覆執行就可以達到目的了
小吳 iT邦新手 5 級 ‧ 2020-12-21 11:07:44 檢舉
不使用排程是因為,有時每天要設定、有時一兩個禮拜才設定一次,而且跑的時間也不一定,有時需要晚上跑、有時需要半夜跑(因為要在跑報表之前執行)。
使用者輸入的資料我有儲存在一個暫存的TABLE。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
4
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2020-12-21 11:16:53
最佳解答

我將我目前的自定義排程的做法給你。
基本上,我會建立一個排程用的物件出來。
然後設定排程每分去運行一次這個排程物件。

該物件的資料規劃如下
物件的運行位置或是指定命令、cron的設定值、最後運行時間值、下一次的運行時間值。

排程會每分去檢查是否有需要運行的指令或是物件。
會依據「下一次的運行時間值」來判斷是否要執行命令。
並在執行成功完成後。依照cron的設定值換算下一次的運行時間。
並將當下的時間值儲存為最後運行時間

這樣子你就可以做到讓user能自定義時間去跑排程了。
也可以自由的選擇要用何種物件開發定義你需要的值處理。

我目前的crontab只有一個設定。就是只跑該排程的物件。
由它來處理我實際要跑的排程。

小吳 iT邦新手 5 級 ‧ 2020-12-21 11:41:24 檢舉

看了您的解說,我好像知道該如何做了。

0
混水摸魚
iT邦研究生 2 級 ‧ 2020-12-21 10:14:39

https://www.webteach.tw/?p=114

你要不要試看看用 mysql event

小吳 iT邦新手 5 級 ‧ 2020-12-21 11:00:51 檢舉

感謝您的回覆
但是這個對於使用者來說太麻煩,所以才考慮網頁讓他自己輸入。

混水摸魚 iT邦研究生 2 級 ‧ 2020-12-21 13:35:19 檢舉

mysql event 就是 sql 語法,你可以接前端進來的日期再跑 sql語法就可以囉!完全不會麻煩哦。

0
leeihsing0127
iT邦新手 5 級 ‧ 2020-12-21 10:43:54

我的方法有二:

  1. 透過mysql procedure方式,每次使用者輸入完之後,就觸發執行。只是我不太清楚你要更新資料的複雜度

  2. 透過排程方式,紀錄多筆並執行。你可以將排程設定成10分鐘執行一次,也可以紀錄使用者異動資料去紀錄更新時間,再透過排程去判斷是否執行資料更新

小吳 iT邦新手 5 級 ‧ 2020-12-21 10:59:39 檢舉

leeihsing0127
1.不好意思,我不太懂procedure的用法,我google一下 這個是不是要讓他寫個迴圈,然後每幾分鐘跑一次這個迴圈,直到判斷值成立時才跳出。另外我資料庫只需要UPDATE一個欄位的日期而已。
2.排程我也想過,但是如果沒有排程內容時,排程還會一直跑除非我關閉,因為有時我每天要跑、有時一兩個禮拜要跑一次。

我剛剛看了一下你的回應,你不需要去關閉排程啊。
如果沒有人去執行凍結或執行時間,頂多這排程沒做事而已。

如果只是更新某欄位,排程跑多或跑少,並不會影響效能。

0
ckp6250
iT邦好手 1 級 ‧ 2020-12-21 11:11:16

樓主可能誤解了許多邦友提的 event 事件了,
您的需求,以 event 來處理最方便了,這是由您來寫,不是叫使用者來寫。
完全不必動到 C#、CONSOLE、EXE、php

您去研究一下吧。

的確有一種不像是在討論同一件事情的感覺XD

0
耿直小伙
iT邦新手 1 級 ‧ 2020-12-21 11:22:51

不管是 ignore_user_abort() 或者排程,都是為了達到「監聽某件事」這個目的,所以先撇除要用 php ignore_user_abort() 或者排程執行

目前已知條件

  1. 使用者需自行輸入日期
  2. 該日期會存入暫存表

處理方式

  1. 使用者輸入完畢或者排程執行程式
  2. 取出需要執行的資料(暫存表)

其實不管怎麼樣使用者都不需要碰到程式或排程設定,你只要寫好邏輯【讓他倒數秒數 ('設定執行日期及時間' 減掉 '現在時間秒數')】就好了,不過是單筆與多筆資料的區別

如果我的回答還是不符合你的需求,那...不好意思了XD

我要發表回答

立即登入回答