Web应用在运行时会有执行时长的限制,但是实际开发中有些任务耗时比较长,甚至是常驻内存的,这时只能使用cli方式运行PHP脚本,也就是常说的命令行应用。
开发一个完整的命令行应用流程如下:
## 1、创建一个命令文件
~~~
$ php think make:command Push
Command:app\command\Push created successfully.
~~~
成功创建后,会生成一个文件:
~~~
<?php
declare (strict_types = 1);
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
class Push extends Command
{
protected function configure()
{
// 指令配置
$this->setName('app\command\push')
->setDescription('the app\command\push command');
}
protected function execute(Input $input, Output $output)
{
// 指令输出
$output->writeln('app\command\push');
}
}
~~~
## 2、添加功能
其中的 execute 方法,就是你要补充的。我给出一个我在项目中不完整的例子,如下。
~~~
protected function execute(Input $input, Output $output)
{
/* 读入数据推送规则 */
$target = $input->getArgument('target');
$this->rules = Config::get('push_' . $target);
$output->writeln('Push ver: ' . self::$version . PHP_EOL);
if (!$this->rules) {
$output->writeln('Push rules not found.');
}
/* 遍历规则 */
foreach ($this->rules as $rule) {
/* 启用的规则 */
if ($rule['enable'] ?? false) {
/* 是否输出调试信息和调试数据 */
$rule['debug'] = $rule['debug'] ?? false;
/* 获取数据 */
$data = $this->getData($rule);
/* 写到目标表中 */
if (isset($rule['target'])) {
$result = $this->setData($data, $rule);
$output->writeln('成功数: ' . $result[0] . ', 失败数: ' . $result[1] . ',' . $rule['name'] .
PHP_EOL);
}
}
} //endforeach
}
~~~
## 3、配置命令
修改`config/console.php`文件,内容如下。
~~~
<?php
// +------------
// | 控制台配置
// +------------
return [
// 指令定义
'commands' => [
'push' => 'app\command\Push',
],
];
~~~
## 4、运行命令
~~~
php think push
~~~
也可以用 Shell 包装以下, 让代码运行更健壮.
~~~
#!/usr/bin/env bash
# 文件锁
LOCK_FILE="/var/run/push_gonggai.pid"
# 日志文件
LOG_FILE="/var/log/push_gonggai.log"
# 需要 root 权限
if [ "$UID" -ne "0" ]; then
echo "Must be root to run this srcript."
exit 103
fi
if (set -o noclobber; echo "$$" > "$LOCK_FILE") 2> /dev/null; then
trap 'rm -f "$LOCK_FILE"; exit $?' INT TERM EXIT
echo "" >> ${LOG_FILE}
echo "=== BEGIN-TO-PUSH ===" >> ${LOG_FILE}
echo `date '+%Y-%m-%d %H:%M:%S'` >> ${LOG_FILE}
/usr/local/php/bin/php /home/www/gonggaixitong/think push>> ${LOG_FILE}
# 记录结束时间
echo `date '+%Y-%m-%d %H:%M:%S'` >> ${LOG_FILE}
echo "=== END-OF-PUSH ===" >> ${LOG_FILE}
echo "" >> ${LOG_FILE}
rm -f $LOCK_FILE
trap - INT TERM EXIT
else
if [ ! -f $LOCK_FILE ]; then
echo "You have no right to excute the script."
exit 102
else
echo "The script is running, lock file is $LOCK_FILE."
exit 101
fi
fi
~~~
命令行程序非常简单,脚本一旦出现错误,进程就会终止,所以需要配合进程监控工具才能使用到生产环境。本人常用的进程监控工具`pm2`及`supervisor`,大家可以关注一下。
- 搭建ThinkPHP6的开发环境
- 配置ThinkPHP6
- 必要的基础知识(basic)
- MVC开发模式
- 控制器(controller)
- 数据库(database)
- 模型(model)
- 模型关联(relation)
- 视图(view)
- Session
- Cookie
- 缓存(cache)
- 上传(upload)
- 验证器(validate)
- 验证码(captcha)
- 命令行(command)
- 服务器部署(deploy)
- 数据备份(backup)
- 数据同步(synchronization)
- 订阅服务(subscribe)
- PHP 易混淆知识点
- 助手函数
- MySQL规范
- Redis 规范
- office插件 phpoffice
- 拼音插件 pinyin
- 日期插件 datetime
- 消息插件 amqp
- 产品部署环境的搭建
- PDF 等杂项处理
- 文件上传
- 常用扩展
- flc/dysms
- 使用示例 ①
- 使用示例 ②
- qiniu/php-sdk
- 简介
- 使用示例
- 使用示例 2 ②
- liliuwei/thinkphp-jump
- 扩展介绍
- 下载扩展
- 使用方法
- topthink/think-captcha
- 安装扩展
- 验证码显示
- 更换验证码
- 验证码校验
- 验证码配置
- 自定义验证码
- phpoffice/phpspreadsheet
- 数据写入表格
- 读取表格数据
- topthink/think-queue
- 安装
- 自定义函数
- 任务类
- 带有日志的任务类