在实际应用中。通常需要异步处理一些操作,例如消息推送。邮件发送等,对于这些操作,可以用think的命令去异步执行,而PHP可以继续去做其他的事情
异步执行需要的类:
namespace util;
/**
* 创建异步执行CMD任务
* @package app\common\model;
* @author 晓风<215628355@qq.com>
*/
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 常量即可