THINKPHP5命令行的异步执行工具类

浏览:835 发布日期:2019/06/14 分类:技术分享 关键字: 命令行 异步 think
在实际应用中。通常需要异步处理一些操作,例如消息推送。邮件发送等,对于这些操作,可以用think的命令去异步执行,而PHP可以继续去做其他的事情
异步执行需要的类:namespace util;
/**
 * 创建异步执行CMD任务
 * @package app\common\model;
 * @author andy3513
 */
class AsyncCommand {     
   
    /**
     * 异步执行think命令行
     * @param string $command think命令行名称
     * @param array  $argument 参数 如[1,2,3]
     * @return string
     */
    public static function think($command,$argument = []){
        $cmd = "php " . ROOT_PATH . 'think ' . $command;
        if($argument){
            $cmd  .= " " . implode(" ",$argument);
        }   
        return self::run($cmd);
    }       
    
    /**
     * 创建一个新的异步CLI进程,支持WINDOWS 和 LINUX系统  
     * PHP 需可全局执行,并启用popen 
     * @param string $cmd 要异步执行的命令行
     * @return string
     */   
    public static function run($cmd){       
        $isWin = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
        if ($isWin) {
            $cmd = "start /b " . $cmd . '>' .ROOT_PATH . "runtime/popen.log"; //windos系统中start /b 是异步执行
        } else {
            $cmd = $cmd . " > /dev/null &"; //linux系统中&符号 是异步执行
        }
        $id = popen($cmd, 'r');    
        pclose($id);
        return $cmd;
    }   
}
关于think命令行的创建 可参考thinkphp文档
使用时,比如你的think命令行是这样
php think sedemail 1 2 3
那么这样调用
\util\AsyncCommand::think("sedemail",[1,2,3]);
也可以不传参数
如 php think test
那么
\util\AsyncCommand::think("test");

如果想用到tp6,修改 ROOT_PATH 常量即可
最佳答案
评论( 相关
后面还有条评论,点击查看>>
500万彩票网