作者buganini (霸格尼尼)
看板PHP
標題Re: [請益] php 如何實現crontab 的功能
時間Sun Oct 14 11:31:52 2007
我在想可不可以弄個
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