用PHP写daemon的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
bearcat001
V2EX    PHP

用PHP写daemon的问题

  •  
  •   bearcat001 Jan 13, 2014 4601 views
    This topic created in 4490 days ago, the information mentioned may be changed or developed.
    比如下面这样一个文件test.php
    <?php
    echo exec("nohup sleep 20 > /dev/null 2>&1 & echo $!");
    ?>

    在终端下执行php test.php可以将进程留在后台
    但是通过浏览器访问test.php的时候,不能在后台留下进程

    猜测可能是web进程中止同时把sleep也给中止了,要想一直留着,有什么好的解决方法吗?
    Supplement 1    Jan 13, 2014
    本来想图个省事直接在请求处理过程中就把这些事情做了,看来不太行
    还是得弄一个daemon来专门负责耗时任务的启动和中止
    Supplement 2    Jan 13, 2014
    感谢已送上,多谢各位
    15 replies    2015-04-24 09:55:42 +08:00
    cdffh
        1
    cdffh  
       Jan 13, 2014   2
    用 setsid 试试?
    skydiver
        2
    skydiver  
       Jan 13, 2014 via Android   1
    楼主这种用法本来就是不对的,放弃吧。
    shiny
        3
    shiny  
    PRO
       Jan 13, 2014   1
    1、用 ignore_user_abort 可以让用户中断连接的时候避免进程退出
    2、再需要设置 set_time_limit(0) 来避免超时的中断

    ucenter 的计划任务就是这么做的吧。
    breeswish
        4
    breeswish  
       Jan 13, 2014   1
    想要用作daemon,就用php-cli,并且关闭运行时间限制,不要用php-fpm或者mod-php
    h2ero
        5
    h2ero  
       Jan 13, 2014   1
    如果用的FastCGI可以用`fastcgi_finish_request();`
    bearcat001
        6
    bearcat001  
    OP
       Jan 13, 2014
    @cdffh 应该也是不行的
    bearcat001
        7
    bearcat001  
    OP
       Jan 13, 2014
    @skydiver 恩,还是在cli下写daemon吧
    bearcat001
        8
    bearcat001  
    OP
       Jan 13, 2014
    @shiny 如果是服务端启动一个耗时任务呢?这个任务写的时候就是CLI下运行,因为时长问题
    bearcat001
        9
    bearcat001  
    OP
       Jan 13, 2014
    @breeswish 恩,打算换了,多谢
    bearcat001
        10
    bearcat001  
    OP
       Jan 13, 2014
    @h2ero 多谢
    fastcgi_finish_request和ignore_user_abort类似都是继续执行当前脚本,没有办法让exec启动的cli命令驻留下来
    jasontse
        11
    jasontse  
       Jan 13, 2014 via iPad   1
    @bearcat001 如果是耗时任务就应该向daemon推送队列异步处理。
    bearcat001
        12
    bearcat001  
    OP
       Jan 13, 2014
    @jasontse 恩,打算这么做了,多谢~
    picasso250
        13
    picasso250  
       Jan 14, 2014
    php-resque
    judasnow
        14
    judasnow  
       Jan 14, 2014
    要是我 就定时执行一段 php 脚本(用crontab或者whatever)然后用redis模拟保存全局变量(每次脚本执行的时候 就从redis读取信息初始化 完成之后保存之)
    jevonszmx
        15
    jevonszmx  
       Apr 24, 2015
    如果你没服务器的权限,仅开发权限的话,就写php脚本,用crontab定时执行;

    如果你有服务器权限,可以给php编译一个PCNTL模块,官方文档在这里: http://php.net/manual/zh/book.pcntl.php,可以启动一个deamon在后台,比如有个大队列数据需要一直需要php同步入库,可以fork一个进程一直在后台跑,比crontab频率高,还可以多进程。
    About     Help     Advertise     Blog     API     FAQ     Solana     5192 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 53ms UTC 08:51 PVG 16:51 LAX 01:51 JFK 04:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86