作者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)
2F:→ buganini:这不知道能不能用 10/14 11:58
3F:推 gpmm:push!! 10/14 13:34
※ 编辑: buganini 来自: 221.169.71.109 (10/14 14:03)
4F:推 arzbar:感恩 小弟这边先感谢 先消化一下 10/14 23:35
5F:推 arzbar:非常感谢 我消化完後 决定先用下次执行时间来处理 10/14 23:40
6F:→ arzbar:後续有何发展 我会PO 上 10/14 23:41
※ 编辑: buganini 来自: 221.169.71.109 (10/16 12:48)
7F:推 buganini:补充一下, 一定要拿个变数去收他, 不然会always true 10/16 12:49
8F:→ buganini:reference跟value的差别 10/16 12:51