本帖最后由 jlzan1314 于 2010-05-26 14:46:35 编辑

解决方案 »

  1.   

    #!/usr/local/bin/php
    <?php
        set_time_limit(0);
        $acts=array('start','stop','status','prepare','help');    $config=array(
        "dbhost"=>"localhost",
        "dbuser"=>"xxx",
        "dbpw"=>'xxx',
        "dbname"=>"po",
        "charset"=>"utf8",
        );
        $db=null;
        
        
        $lock="lock.txt";    if(in_array($argv[1],$acts,true) ){
            $argv[1](); 
        }else{
            help();    
        }    function start(){
            global $lock,$argc,$argv,$db;
            if($argc===2){
                if(status(true)=="starting\n"){
                    echo "program is also starting";
                }else{
                    @unlink($lock);
                    $date=date("Y-m-d");
                    $log="log/$date.txt";
                    exec(__FILE__." start back >>$log 2>&1 &");//在后台运行
                }
            }elseif($argc===3&&$argv[2]==='back'){
                $str="program is also starting\n";
                if($fh=@fopen("starting.txt",'w+')){
                    if(flock($fh,LOCK_EX + LOCK_NB)){//只准运行一个实例
                        $db=get_db();
                        $str='';
                        while(1){
                            if(is_file($lock)){
                                break;
                            }
                            sendmail();
                        }
                    }
                    fclose($fh);
                }
                if($str){
                    echo $str;//报错 
                }
            }else{
                echo "starting error\n";
            }
        }    function sendmail(){
            $db=get_db();
            echo "$i\n";
            usleep(1000000*1);//间隔0.2秒发一封,一秒发5封
        }    function get_email_doamins($limit){
            $db=get_db();
        }    function prepare(){
            $db=get_db();
        }    /**
        * 显示信息
        * 
        */
        function status($r=false){
            $str="stopping\n";
            if($fh=@fopen("starting.txt",'w+')){
                if(!flock($fh,LOCK_EX + LOCK_NB)){
                    $str= "starting\n"; 
                }
                fclose($fh);
            }
            if($r){
                return $str; 
            }
            echo $str;
        }    function stop(){
            global $lock;
            file_put_contents($lock,'');
            if(is_file($lock)){
                echo "stoping\n";
            }else{
                echo "Error:stoping";
            }
        }    function help(){
            global $acts;
            foreach($acts as $act){
                echo __FILE__." $act\n";  
            }
        }
        
        function get_db(){
            global $config;
            static $db=null;
            if(is_null($db)){
                $db=new DB($config);
            }
            return $db;
        }
    ?> 
      

  2.   

    ./file_name start 会出现这个错误.
      

  3.   

    搜了好多,没得到答案是 不是这个问题
    启动一个后台进程的问题.
    exec(__FILE__." start back >>$log 2>&1 &");//在后台运行
      

  4.   

    你这个代码是抄来的吧?$lock="lock.txt";
    本意是做文件锁,但代码中并没有体现
      

  5.   

    晕... 这个完全手写的,
    starting.txt是锁文件.这个lock.txt文件,控制进程暂停的.在stop()里面有实现啊.