swoole定时器

php备忘

比如说网站上实现一个功能,用户可以保存一个定时任务,比如明天下午5点发一封邮件给我,后天上午10点发一个短信提醒给我,等等。这样的功能用php应该怎么实现呢。

如果没有接触swoole之前,我会把这些定时信息入库,然后用cron去每分钟轮询一次。

缺点有很多,比如说不能精确到秒,也就是说用户设置的时间格式只能精确到分钟,如果设置到秒是无效的。再比如说,用轮询实在是太low了


swoole的定时器很好的解决了这个问题。直接上代码备忘一下。


service

<?php
    class Server{    
       private $serv;
    public function __construct() {        
            $this->serv = new swoole_server("127.0.0.1", 9501);
        $this->serv->set(array(
            'worker_num' => 1,   //一般设置为服务器CPU数的1-4倍            
           // 'daemonize' => 1,  //以守护进程执行            
            'max_request' => 10000,
            'dispatch_mode' => 2,
            'task_worker_num' => 8,  //task进程的数量            
            "task_ipc_mode " => 3 ,  //使用消息队列通信,并设置为争抢模式            
            //"log_file" => "log/taskqueueu.log" ,//日志        
            ));
        $this->serv->on('Receive', array($this, 'onReceive'));
        // bind callback        
        $this->serv->on('Task', array($this, 'onTask'));
        $this->serv->on('Finish', array($this, 'onFinish'));
        $this->serv->start();
    }
    public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {        
    //echo "Get Message From Client {$fd}:{$data}n";        
    // send a task to task worker.     
    
       $intt = strtotime($data)-time()    ;
       $intt = $intt*1000;
       if($intt>0){
           
        $serv->after($intt, function() use ($serv, $fd) {
           echo "hello world";
            });
        
       }   
    
    }
    public function onTask($serv,$task_id,$from_id, $data) {
      
           
      return true;
    }
    public function onFinish($serv,$task_id, $data) {        
    echo "Task {$task_id} finishn";       
     
    //echo "Result: {$data}n";   
     }
   
}

$server = new Server();

client

<?php
class Client{    
private $client;
    public function __construct() {        
    $this->client = new swoole_client(SWOOLE_SOCK_TCP);
    }
    public function connect() {        
    if( !$this->client->connect("127.0.0.1", 9501 , 1) ) {
            echo "Connect Error";
        }
        $data = "2016-08-26 09:32:30";
        $this->client->send( $data );
    }
}
$client = new Client();
$client->connect();


2016-08-26 09:38:25

php
php

这是介绍的地方

本文相关标签

推荐应用

友情链接


皖ICP备14007051号-2 关于穆子龙