看板 PHP 關於我們 聯絡資訊
我在想可不可以弄個 cron.php <?php set_time_limit(0); ignore_user_abort(true); if($sock=stream_socket_server('udp://0.0.0.0:9999', $en, $es, STREAM_SERVER_BIND)){ while(1){ $now=time(); #SELECT `id`,`cmd` FROM `crontab` WHERE `next`<=$now; #UPDATE `crontab` SET `next`=blah; #exec(cmd); sleep(300-time()+$now); } } ?> 然後只要用browser去連他一下就ok了 這裡用socket來做lock避免重複執行 (一時間想不到其他方法, 這樣應該可以吧?) 但是他掛掉的時候你得自己再去起動他 但是要儘量減短每個指令需要的時間 因為這沒跑thread 弄不好會拖很久 阿不然就是再弄個 thread.php <?php set_time_limit(0); ignore_user_abort(true); if($_SERVER['REMOTE_ADDR']!='127.0.0.1'){ die(); } #SELECT `cmd` FROM `crontab` WHERE `id`=$_GET['id']; #exec(cmd); ?> 然後cron.php那裡用Curl連thread.php?id=X 並且curl timeout設短一些 也不一定要用udp 有unix://可以用的話應該會更好 tcp也是可以 只是我猜想udp消耗的資源應該會<=tcp 只是猜想 以上兩個合成一頁也是OK 剛剛爬到以前的 3517 1 5/19 foxzgerald R: [閒聊] ignore_user_abort() 其實裡面有一點想法了 可是少了一個重點 如果我記的沒錯的話 要產生一個background process 事實上是執行A (a) 然後A fork出 B (b) 然後A自己結束掉 (c) B變成斷線風箏 這時B就是一個background process 這裡(a)就是cron.php去執行curl的動作 (雖然不是獨立process,但可接受啦) (b)是Curl做的事 (c)用timeout達成 ※ 編輯: buganini 來自: 221.169.71.109 (10/14 11:54)
buganini:這不知道能不能用 10/14 11:58
gpmm:push!! 10/14 13:34
※ 編輯: buganini 來自: 221.169.71.109 (10/14 14:03)
arzbar:感恩 小弟這邊先感謝 先消化一下 10/14 23:35
arzbar:非常感謝 我消化完後 決定先用下次執行時間來處理 10/14 23:40
arzbar:後續有何發展 我會PO 上 10/14 23:41
※ 編輯: buganini 來自: 221.169.71.109 (10/16 12:48)
buganini:補充一下, 一定要拿個變數去收他, 不然會always true 10/16 12:49
buganini:reference跟value的差別 10/16 12:51