iT邦幫忙

0

用PHP寫排程

  • 分享至 

  • xImage

目前我有個抽獎程式
使用者希望 他設定抽獎時間(type:datetime)之後
只要到那個時間點
就自動抽獎

主機目前不能使用排程功能(不給用)
所以要自己寫一隻

這個問題我爬了不少文章
我有看到ignore_user_abort()這個方法
我的想法是
開啟ignore_user_abort()後
裡面的迴圈去判斷目前時間是否跟資料庫中的開獎時間一樣
一樣就執行開獎
每分鐘執行一次
直到開完獎
這隻程式並不會被外部連到

想問一下這樣的寫法 各位大大 這會不會有什麼風險
像是耗費太多內存 或是會讓主機變慢甚至當機
若會我應該怎麼調整呢?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2019-12-17 18:24:47
最佳解答

只要你先做好一個機制。
不會有重覆運行的可能性就比較沒問題。
你可以加個運行時間來判斷。

不過你要知道這樣子做其實還是有風險的。
雖然他也算是一種變相使用crontab。

這我早期有用過類似的,且我是寫文件檔非使用資料庫。

看更多先前的回應...收起先前的回應...
WQ iT邦新手 2 級 ‧ 2019-12-18 09:05:40 檢舉

我想應先了解ignore_user_abort()函數的作業模式。參考如下網址(感覺好像是長駐在WEB Server的一支程式)。如果同述說明,就很難建議樓主這樣做,畢竟它是一個無窮迴圈的慨念(除了機制可以關掉它)。
排程性的作業還是交給crontab,一行就搞定。

@WQ 可能沒注意到樓主貼的文章。
一開始就有說沒辦法用crontab了。

所以只能找這個下下策。

用 ignore_user_abort 其實的確有風險的。不得已的情況下才使用。

WQ iT邦新手 2 級 ‧ 2019-12-18 10:08:14 檢舉

如果有對外開放連線(虛擬主機),一定要是該主機才能設嗎?
可不可以設在B主機,然後去呼叫A主機呢?
以上給樓主去TRY....

fillano iT邦超人 1 級 ‧ 2019-12-18 10:28:07 檢舉

以樓主的使用情境,如果使用到ignore_user_abort然後又用url來觸發(就是說這支程式在web server跑),那很簡單就可以做DOS攻擊...

st474ddr iT邦新手 2 級 ‧ 2019-12-18 11:02:16 檢舉

這我早期有用過類似的,且我是寫文件檔非使用資料庫。

想請問寫成文件會比較不消耗內存嗎?
在不改變時間間隔執行的情況下

用 ignore_user_abort 其實的確有風險的。不得已的情況下才使用。

是的 真的是蠻不得已的
不過我也有想到下面那個方法

如果有對外開放連線(虛擬主機),一定要是該主機才能設嗎?
可不可以設在B主機,然後去呼叫A主機呢?

我昨天睡覺的時候也有想到這個方法
感覺實際上很可行
我可能會採用這個做法

以樓主的使用情境,如果使用到ignore_user_abort然後又用url來觸發(就是說這支程式在web server跑),那很簡單就可以做DOS攻擊...

可是只有我自己知道這程式的網址 而且我沒有把他的路徑寫在任何程式中(這樣應該也只有我能執行它)
這樣也會被DOS嗎?

感謝三位大大的回答

其實我在一開始就有說到。不要去想會不會被其它任何東西執行到,要怎麼防止....等等這些都不需要去想。

只要往確保只會同段時間內只會有一支程序運行就好。

只要你的先決條件有做到,自然就不需要去擔心有沒有人會去跑到的問題了。反正跑到也不會運行。

WQ iT邦新手 2 級 ‧ 2019-12-18 13:34:33 檢舉

如果有對外開放連線(虛擬主機),一定要是該主機才能設嗎?
可不可以設在B主機,然後去呼叫A主機呢?
我昨天睡覺的時候也有想到這個方法
感覺實際上很可行
我可能會採用這個做法

其實我都是這樣做的,不過我都在域內,所以沒有DOS的考量.

我以前的做法是用公司自已的主機跑排程。用curl或wget的方式跑。
如果是windows srever的話就是計劃任務去跑curl

st474ddr iT邦新手 2 級 ‧ 2019-12-18 18:30:01 檢舉

現在我用WQ大提議的做法去做
可是我的程式(a.php)有時會回報Can't connect to MySQL server on 'XXX.com.tw'的錯誤
問系統人員
他們說我另外一隻程式(b.php)被擋住了
可是奇怪 我明明就沒有開啟b.php 他卻被擋住
而且最大的問題 是時好時壞 有時可以連 有時不能連
不知道哪裡出了問題

※a.php 放在 A主機 b.php 放在B主機
※要用A主機的a.php去撈B主機中資料庫的資料

為何還要用a主機的一支php去叫啊@@"
不直接curl去呼叫遠端的php不就行了。
還是你以為我說的是php的curl??

st474ddr iT邦新手 2 級 ‧ 2019-12-19 10:07:08 檢舉

為何還要用a主機的一支php去叫啊@@"
不直接curl去呼叫遠端的php不就行了。
還是你以為我說的是php的curl??

大大歹勢 我是先嘗試WQ大的做法
我還沒嘗試您的做法
不過大大您的意思是
用可以操作corntab的主機A
運用curl或wget
去觸發主機B上面的程式
是這個意思嗎@@?
還是我又誤會大大您的意思

用可以操作corntab的主機A
運用curl或wget
去觸發主機B上面的程式

是這樣沒錯。
在a主機的crontab內下類似如下的命令。

* * * * *   curl http://URL/cron.php

這樣就可借由a主機去觸發b主機的程式了。

st474ddr iT邦新手 2 級 ‧ 2019-12-19 13:38:47 檢舉

大大我照你說的做了
但是還是發生Can't connect to MySQL server on 'XXX.com.tw'(4)
應該是有什麼地方被擋住了
感覺跟系統有關
我這方面就很不懂了QQ

這你要直接找原程式處理的。
一定不會是因為你用了其它機器排程造成的。
問題一定是發生在你原本的程式。

st474ddr iT邦新手 2 級 ‧ 2019-12-20 09:38:45 檢舉

姑且是解決了
感謝各位大大幫忙

1
混水摸魚
iT邦研究生 2 級 ‧ 2019-12-18 09:59:45

我猜你用的是一般的虛擬主機,建議你直接升等vps才會有比較高的主控權,不然你用ignore_user_abort 長行程的佔用資源,有在做管控的一定會砍掉。

用比較正統的方式去處理會比較好,才不會走歪路。

st474ddr iT邦新手 2 級 ‧ 2019-12-18 11:06:45 檢舉

恩... 說實在我也擔心風險
而且被砍掉 我覺得可能性應該也很高
說實在昨天是 沒有找到其他方法才想這樣做

感謝大大回覆

我要發表回答

立即登入回答