## 一、开机启动
对于那些支持 Systemd 的软件,安装的时候,会自动在`/usr/lib/systemd/system`目录添加一个配置文件。
如果你想让该软件开机启动,就执行下面的命令(以`httpd.service`为例)。
~~~
$ sudo systemctl enable httpd
~~~
上面的命令相当于在`/etc/systemd/system`目录添加一个符号链接,指向`/usr/lib/systemd/system`里面的`httpd.service`文件。
这是因为开机时,`Systemd`只执行`/etc/systemd/system`目录里面的配置文件。这也意味着,如果把修改后的配置文件放在该目录,就可以达到覆盖原始配置的效果。
## 二、启动服务
设置开机启动以后,软件并不会立即启动,必须等到下一次开机。如果想现在就运行该软件,那么要执行`systemctl start`命令。
~~~
$ sudo systemctl start httpd
~~~
执行上面的命令以后,有可能启动失败,因此要用`systemctl status`命令查看一下该服务的状态。
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
~~~
$ sudo systemctl status httpd
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
Active: active (running) since 金 2014-12-05 12:18:22 JST; 7min ago
Main PID: 4349 (httpd)
Status: "Total requests: 1; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─4349 /usr/sbin/httpd -DFOREGROUND
├─4350 /usr/sbin/httpd -DFOREGROUND
├─4351 /usr/sbin/httpd -DFOREGROUND
├─4352 /usr/sbin/httpd -DFOREGROUND
├─4353 /usr/sbin/httpd -DFOREGROUND
└─4354 /usr/sbin/httpd -DFOREGROUND
12月 05 12:18:22 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
12月 05 12:18:22 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
12月 05 12:22:40 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
~~~
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
上面的输出结果含义如下。
* `Loaded`行:配置文件的位置,是否设为开机启动
* `Active`行:表示正在运行
* `Main PID`行:主进程ID
* `Status`行:由应用本身(这里是 httpd )提供的软件当前状态
* `CGroup`块:应用的所有子进程
* 日志块:应用的日志
## 三、停止服务
终止正在运行的服务,需要执行`systemctl stop`命令。
~~~
$ sudo systemctl stop httpd.service
~~~
有时候,该命令可能没有响应,服务停不下来。这时候就不得不"杀进程"了,向正在运行的进程发出`kill`信号。
~~~
$ sudo systemctl kill httpd.service
~~~
~~~bash
此外,重启服务要执行systemctl restart命令。
~~~
~~~
$ sudo systemctl restart httpd.service
~~~
## 四、读懂配置文件
一个服务怎么启动,完全由它的配置文件决定。下面就来看,配置文件有些什么内容。
前面说过,配置文件主要放在`/usr/lib/systemd/system`目录,也可能在`/etc/systemd/system`目录。找到配置文件以后,使用文本编辑器打开即可。
`systemctl cat`命令可以用来查看配置文件,下面以`sshd.service`文件为例,它的作用是启动一个 SSH 服务器,供其他用户以 SSH 方式登录。
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
~~~
$ systemctl cat sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
~~~
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
可以看到,配置文件分成几个区块,每个区块包含若干条键值对。
下面依次解释每个区块的内容。
## 五、 \[Unit\] 区块:启动顺序与依赖关系。
`Unit`区块的`Description`字段给出当前服务的简单描述,`Documentation`字段给出文档位置。
接下来的设置是启动顺序和依赖关系,这个比较重要。
`After`字段:表示如果`network.target`或`sshd-keygen.service`需要启动,那么`sshd.service`应该在它们之后启动。
相应地,还有一个`Before`字段,定义`sshd.service`应该在哪些服务之前启动。
注意,`After`和`Before`字段只涉及启动顺序,不涉及依赖关系。
举例来说,某 Web 应用需要 postgresql 数据库储存数据。在配置文件中,它只定义要在 postgresql 之后启动,而没有定义依赖 postgresql 。上线后,由于某种原因,postgresql 需要重新启动,在停止服务期间,该 Web 应用就会无法建立数据库连接。
设置依赖关系,需要使用`Wants`字段和`Requires`字段。
`Wants`字段:表示`sshd.service`与`sshd-keygen.service`之间存在"弱依赖"关系,即如果"sshd-keygen.service"启动失败或停止运行,不影响`sshd.service`继续执行。
`Requires`字段则表示"强依赖"关系,即如果该服务启动失败或异常退出,那么`sshd.service`也必须退出。
注意,`Wants`字段与`Requires`字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的。
## 六、\[Service\] 区块:启动行为
`Service`区块定义如何启动当前服务。
### 6.1 启动命令
许多软件都有自己的环境参数文件,该文件可以用`EnvironmentFile`字段读取。
`EnvironmentFile`字段:指定当前服务的环境参数文件。该文件内部的`key=value`键值对,可以用`$key`的形式,在当前配置文件中获取。
上面的例子中,sshd 的环境参数文件是`/etc/sysconfig/sshd`。
配置文件里面最重要的字段是`ExecStart`。
`ExecStart`字段:定义启动进程时执行的命令。
上面的例子中,启动`sshd`,执行的命令是`/usr/sbin/sshd -D $OPTIONS`,其中的变量`$OPTIONS`就来自`EnvironmentFile`字段指定的环境参数文件。
与之作用相似的,还有如下这些字段。
` ExecReload`字段:重启服务时执行的命令
` ExecStop`字段:停止服务时执行的命令
` ExecStartPre`字段:启动服务之前执行的命令
` ExecStartPost`字段:启动服务之后执行的命令
`ExecStopPost`字段:停止服务之后执行的命令
请看下面的例子。
~~~
[Service]
ExecStart=/bin/echo execstart1
ExecStart=
ExecStart=/bin/echo execstart2
ExecStartPost=/bin/echo post1
ExecStartPost=/bin/echo post2
~~~
上面这个配置文件,第二行`ExecStart`设为空值,等于取消了第一行的设置,运行结果如下。
~~~bash
execstart2
post1
post2
~~~
所有的启动设置之前,都可以加上一个连词号(`-`),表示"抑制错误",即发生错误的时候,不影响其他命令的执行。比如,`EnvironmentFile=-/etc/sysconfig/sshd`(注意等号后面的那个连词号),就表示即使`/etc/sysconfig/sshd`文件不存在,也不会抛出错误。
### 6.2 启动类型
`Type`字段定义启动类型。它可以设置的值如下。
> * simple(默认值):`ExecStart`字段启动的进程为主进程
> * forking:`ExecStart`字段将以`fork()`方式启动,此时父进程将会退出,子进程将成为主进程
> * oneshot:类似于`simple`,但只执行一次,Systemd 会等它执行完,才启动其他服务
> * dbus:类似于`simple`,但会等待 D-Bus 信号后启动
> * notify:类似于`simple`,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
> * idle:类似于`simple`,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合
下面是一个`oneshot`的例子,笔记本电脑启动时,要把触摸板关掉,配置文件可以这样写。
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
~~~
[Unit]
Description=Switch-off Touchpad
[Service]
Type=oneshot
ExecStart=/usr/bin/touchpad-off
[Install]
WantedBy=multi-user.target
~~~
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
~~~bash
上面的配置文件,启动类型设为oneshot,就表明这个服务只要运行一次就够了,不需要长期运行。
~~~
如果关闭以后,将来某个时候还想打开,配置文件修改如下。
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
~~~
[Unit]
Description=Switch-off Touchpad
[Service]
Type=oneshot
ExecStart=/usr/bin/touchpad-off start
ExecStop=/usr/bin/touchpad-off stop
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
~~~
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
上面配置文件中,`RemainAfterExit`字段设为`yes`,表示进程退出以后,服务仍然保持执行。这样的话,一旦使用`systemctl stop`命令停止服务,`ExecStop`指定的命令就会执行,从而重新开启触摸板。
### 6.3 重启行为
`Service`区块有一些字段,定义了重启行为。
`KillMode`字段:定义 Systemd 如何停止 sshd 服务。
上面这个例子中,将`KillMode`设为`process`,表示只停止主进程,不停止任何sshd 子进程,即子进程打开的 SSH session 仍然保持连接。这个设置不太常见,但对 sshd 很重要,否则你停止服务的时候,会连自己打开的 SSH session 一起杀掉。
`KillMode`字段可以设置的值如下。
> * control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
> * process:只杀主进程
> * mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
> * none:没有进程会被杀掉,只是执行服务的 stop 命令。
接下来是`Restart`字段。
`Restart`字段:定义了 sshd 退出后,Systemd 的重启方式。
上面的例子中,`Restart`设为`on-failure`,表示任何意外的失败,就将重启sshd。如果 sshd 正常停止(比如执行`systemctl stop`命令),它就不会重启。
`Restart`字段可以设置的值如下。
> * no(默认值):退出后不会重启
> * on-success:只有正常退出时(退出状态码为0),才会重启
> * on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
> * on-abnormal:只有被信号终止和超时,才会重启
> * on-abort:只有在收到没有捕捉到的信号终止时,才会重启
> * on-watchdog:超时退出,才会重启
> * always:不管是什么退出原因,总是重启
对于守护进程,推荐设为`on-failure`。对于那些允许发生错误退出的服务,可以设为`on-abnormal`。
最后是`RestartSec`字段。
`RestartSec`字段:表示 Systemd 重启服务之前,需要等待的秒数。上面的例子设为等待42秒。
## 七、\[Install\] 区块
`Install`区块,定义如何安装这个配置文件,即怎样做到开机启动。
`WantedBy`字段:表示该服务所在的 Target。
`Target`的含义是服务组,表示一组服务。`WantedBy=multi-user.target`指的是,sshd 所在的 Target 是`multi-user.target`。
这个设置非常重要,因为执行`systemctl enable sshd.service`命令时,`sshd.service`的一个符号链接,就会放在`/etc/systemd/system`目录下面的`multi-user.target.wants`子目录之中。
Systemd 有默认的启动 Target。
~~~
$ systemctl get-default
multi-user.target
~~~
上面的结果表示,默认的启动 Target 是`multi-user.target`。在这个组里的所有服务,都将开机启动。这就是为什么`systemctl enable`命令能设置开机启动的原因。
使用 Target 的时候,`systemctl list-dependencies`命令和`systemctl isolate`命令也很有用。
~~~bash
# 查看 multi-user.target 包含的所有服务
~~~
~~~
$ systemctl list-dependencies multi-user.target
~~~
~~~bash
# 切换到另一个 target
# shutdown.target 就是关机状态
~~~
~~~
$ sudo systemctl isolate shutdown.target
~~~
一般来说,常用的 Target 有两个:一个是`multi-user.target`,表示多用户命令行状态;另一个是`graphical.target`,表示图形用户状态,它依赖于`multi-user.target`。官方文档有一张非常清晰的 [Target 依赖关系图](https://www.freedesktop.org/software/systemd/man/bootup.html#System%20Manager%20Bootup)。
## 八、Target 的配置文件
Target 也有自己的配置文件。
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
~~~
$ systemctl cat multi-user.target
[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
~~~
[![复制代码](https://common.cnblogs.com/images/copycode.gif)](javascript:void(0); "复制代码")
注意,Target 配置文件里面没有启动命令。
上面输出结果中,主要字段含义如下。
> `Requires`字段:要求`basic.target`一起运行。
>
> `Conflicts`字段:冲突字段。如果`rescue.service`或`rescue.target`正在运行,`multi-user.target`就不能运行,反之亦然。
>
> `After`:表示`multi-user.target`在`basic.target` 、 `rescue.service`、 `rescue.target`之后启动,如果它们有启动的话。
>
> `AllowIsolate`:允许使用`systemctl isolate`命令切换到`multi-user.target`。
## 九、修改配置文件后重启
修改配置文件以后,需要重新加载配置文件,然后重新启动相关服务。
~~~bash
# 重新加载配置文件
~~~
~~~
$ sudo systemctl daemon-reload
~~~
~~~bash
# 重启相关服务
~~~
~~~
$ sudo systemctl restart foobar
~~~
- linux
- lanmp
- lanmp
- apache
- Apache2.4.x与Apache2.2.x的一些区别
- 跨域请求 Apache 服务器配置
- apache服务器安装配置ssl数字证书,https访问
- put请求跨区
- apache允许跨域请求 & ajax 自定义header
- 自定义header
- 安装最新版openssl
- nginx
- 解决Nginx出现403 forbidden的方法
- nginx: [error] open() "/usr/local/var/run/nginx.pid" failed (2: No such file or directory)
- 如何用linux命令查看nginx是否在正常运行
- nginx反向代理
- nginx 编译安装
- nginx重定向
- 一个域名对应多个vue项目
- 关于http和https允许请求设置header问题
- nginx配置ssl证书
- 配置宝塔nginx支持tp5路由规则
- nginx获取自定义请求头header
- mysql
- 创建还量表
- 解决Navicat 出错:1130-host . is not allowed to connect to this MySql server,MySQL
- mysql慢查询
- explain
- 索引
- sphinx
- coreseek(sphinx)错误:WARNING: attribute 'id' not found - IGNORING原因及解决方法
- coreseek在windows安装问题和使用步骤
- coreseek常见错误
- coreseek php操作
- mysql5.6升级5.7.21
- sql操作
- mysql函数
- phpmyadmin上传文件大小限制
- mysql主从复制
- 单机主从配置
- 修改mysql端口后修改相应的phpmyadmin端口
- MERGE分表
- MySQL 5.7.22 多实例安装(二进制免编译安装模式)
- 解决phpmyadmin mysqli_real_connect(): (HY000/2002): No such file or directory错误
- Mysql服务器无法存emoji表情的解决方案
- /var/run/mysqld 目录每次重启后都需要手动去创建并赋权mysql用户才能起到mysql
- mysql排序
- mysql关键字冲突
- mysql备份
- mysql5.7密码修改
- 更改MySQL数据库目录位置
- mysql5.6安装
- 字符集与排序规则
- mysql 锁
- mysql事务性
- php
- centos7 升级 php 5.4 -> php5.6
- php扩展
- linux切换默认php版本(宝塔)
- vsftpd
- 关于vsftp出现Restarting vsftpd (via systemctl): Job for vsftpd.service failed because the control 的解决办法
- vdb
- fdisk
- parted
- 磁盘小知识
- CentOS7.x系统根目录分区扩容
- Linux 格式化分区 报错Could not stat --- No such file or directory 和 partprobe 命令
- 添加swap交换区
- root
- Centos创建和修改用户及密码命令
- linux 命令终端提示符显示-bash-4.2#解决方法
- firewall
- centOS7下安装GUI图形界面
- 在Linux主机上,安装上传下载工具包rz及sz
- ping: www.baidu.com: Name or service not known centos7
- linux中 you have newmail in /var/spool/mail/root
- CentOS7启动SSH服务报:Job for ssh.service failed because the control process exited with error code.......
- ifconfig,netstat 命令找不到解決办法
- CentOS7系统时间与真实时间相差8小时
- Centos7:利用crontab定时执行任务
- crontab命令
- /usr/bin/curl 执行外链
- speedtest-cli命令,网速测试
- yum 卸载命令
- 用户管理
- PATH环境变量
- rpm 命令
- 防火墙和网络的安装
- nohup
- vim命令
- 清理缓存命令
- 错误集
- tar解压包的时候出现错误 gzip: stdin: not in gzip format
- 在linux下创建自定义service服务
- 时钟同步
- 查找大文件
- redis
- yum安装
- redis主从复制
- php用法
- redis表的特性
- redis 锁
- redis事务
- redis主从配置+哨兵模式
- redis应用场景
- redis高并发集群下常见问题
- redis思维导图
- 脑图1
- 脑图2
- redis编码
- redis字符串编码
- hash编码
- list编码
- set编码
- zset编码
- 内存回收和内存共享
- redis小知识点
- ffmpeg
- yum安装ffmpeg
- ffmpeg-php类库安装及使用
- make安装
- WebRTC
- 房间服务器
- 信令服务器
- 打洞服务器
- PHP识别二维码(php-zbarcode)
- centos7.4安装Imagemagick
- 第二种方式
- linux小知识
- 查看日志命令
- linux CPU使用率过高或负载过高的处理
- swoole安装
- mq安装
- RabbitMQ安装
- php-amqplib使用--基本使用
- RabbitMQ使用技巧
- tp5
- problem
- thinkphp5的mkdir() Permission denied问题
- 5.5版本以上”No input file specified“问题解决
- 路由带参数的翻页,第二页无数据
- 报错A non well formed numeric value encountered(Thinkphp5时间戳自动转换问题)
- order排序没反应
- tp5分页--搜索
- tp5文件上传---宝塔
- 小知识
- return
- volist标签中使用eq标签 下拉列表选中selected
- TP5写入避免某字段重复的问题
- tp5 --url大小写
- tp5接收数组
- json存储与查询
- 接收参数为null
- php替换str_replace的使用方法,支持多个替换
- postman传数组参数
- Request 排除变量传参
- sql连表统计查询
- php循环
- 模型column方法
- 修改器与获取器
- mysql数据库group与order不能同时使用
- mysql三表查询
- json数据
- 获取数组第一个获第二个元素的键值
- mysql除以100计算
- mysql分组统计
- tp5.1 高级查询之 表里2字段比较大小
- whereOr()用法
- param数字参数,不能用==判断相等,需要用=来判断
- if判断
- tp5随机排序
- 短链接算法
- $_FILES["file"]二进制数据获取
- 跨域
- web.config
- iis: httpd相应标头
- thikphp模板中一维数组如何循环
- tp5 视频上传及自定义命名
- 搜索附近的人
- 小程序
- uploadFile:fail Error: unable to verify the first certificate
- 安卓手机打开小程序提示:request:fail ssl hand shake error
- tp5.1引入库文件
- composer
- tp5小知识
- TP5.1隐藏public和index.php
- tp5扩展
- 二维码
- phpexcel
- 谷歌验证码
- 谷歌验证码2
- mysql时间统计
- union合并查询并分页
- tp5底层框架学习
- php未知函数
- 类的知识点
- 三大设计模式
- 反射机制
- php常用内置类
- php小知识点
- 变量,函数名,参数前加&,什么意思
- PHP中 比较 0、false、null,'' "
- php小常识
- php缓存
- Trait特性
- php -- 取路径:getcwd()、DIR、FILE 的区别
- php关于类的常用概念
- php 类与对象全面了解
- php命名空间与引入
- php常见魔法常量
- php常见魔法函数
- PHP 超级全局变量
- tp5.1本身小知识
- 框架运行流程
- 框架教程总结
- 类的自动加载
- 配置文件
- ArrayAccess用法
- yaconf学习
- yaml学习
- config类重点
- php小知识2
- 多语言切换
- jwt(token)
- redis连接池
- 百度富文本
- 图片路径转换
- layui
- 复选框
- 获取视频第几帧作为封面图
- mysql查询
- FIND_IN_SET(str,strlist)
- PHP
- 函数取整
- array
- 日期
- header
- php获取一维,二维数组长度的方法
- php中数组和字符串的相互转换
- php对数组开头与末尾的元素进行插入与移除
- 队列
- PHP substr截取中文字符出现乱码的问题解疑
- foreach遍历数组并添加属性(下标)
- 数组排序
- PHP实现保留两位小数的三种方法
- 对象转数组
- php小知识
- 阻塞IO和非阻塞IO,异步与同步的区别
- 后台运行
- 超时
- php 高精度计算的问题
- move_uploaded_file
- PHP SplQueue 队列简介
- @,&&等php符号
- PHP命令行脚本接收传入参数的三种方式
- php执行linux命令
- 一些封装函数
- PHP获取文件大小
- PHP 生成随机字符串与唯一字符串
- PHP去除emoji表情
- ip
- php把时间计算成几分钟前,几小时前,几天前的函数
- https
- ssl证书
- 远程登入密码和端口修改
- apache配置https
- problems
- 响应状态status为canceled,解决办法
- PHP Restful PUT方法的参数提交及接收
- HTTP之预检,两种请求
- http增删改查理解
- js
- js数组与字符串的相互转换
- js移除Array中指定元素
- 使用sessionStorage、localStorage存储数组与对象
- 子页面调用父页面方法
- input文件上传
- 随机字符串
- 数组操作
- js 传递数组
- token接入验证
- 用文件来保存token
- 删除用户资料
- 微信function
- 接入验证及点击事件
- 基础token
- 获取用户资料
- curl
- 链接分享
- 网页授权登入
- 微信被动回复用户消息
- 生成微信二维码
- WxPay
- 单一文件,不能加额外参数
- tp5引用微信支付官方库文件
- 微信二维码支付
- 其他
- 手机端发送ajax请求,后台有可能会接收不到到请求(360浏览器和ie浏览器)
- 短信发送
- git
- postman无法正常返回结果Could not get any response
- web服务器配置
- 高并发方案
- nginx防盗链和限制请求速度
- 高并发概念与测试工具
- 定时秒杀方案
- web接口
- yzdd
- 接口1
- 接口2
- spx
- 接口说明
- 新闻表sbh_artnews字段说明
- 用户表sbh_homeuser
- 用户认证表sbh_usertrue
- txsh
- 接口_txsh_1
- chat消息格式
- 表字段
- txsh_第三方接口
- GatewayWorker
- 向对方发送消息,对方会掉线
- 负载均衡
- html
- html中引入调用另一个html的方法
- python
- linux安装--python3.6
- Centos7卸载Python2.7之后恢复yum
- pycharm汉化
- python错误集
- fatal error: Python.h: No such file or directory
- Python小知识
- python中两个重要的工具setuptools和pip的安装
- 基础知识点
- 学习笔记
- tornado基础流程
- 请求与响应
- 以太坊
- 以太坊账户管理
- 一些方法的更新弃用
- 小知识点
- web3.eth.accounts 和 web3.eth.personal 创建account的区别
- web3.py中sendTransaction和sendRawTransaction之间的区别
- 测试网和主网区别
- 以太坊gas、gaslimit、gasPrice、gasUsed详解
- web安全
- web渗透--全面介绍
- 大概介绍
- xss--介绍
- sql注入-介绍
- 文件上传下载-介绍
- 越权--介绍
- xxe--介绍
- 暴力破解
- xss漏洞安全编码系列详解
- 反射型
- DOM型
- 存储型
- 图片隐写
- sql注入详解
- 数据库和其他--介绍
- mysql爆破
- web安全--工具
- sqlmap
- 介绍与安装
- sqlmap攻击方式
- Sqlmap中的其他
- sqlmap--get攻击
- sqlmap--post攻击
- sqlmap--常用选项及命令
- sqlmap--详解
- sqlmap--查看
- web安全简单总结
- api功能扩展
- 阿里云短信
- 阿里云短信sdk新版用法
- 阿里云对象存储 OSS
- 七牛云上传
- qq邮箱发送短信验证码
- 通过ip获取归属地
- 支付插件
- zoujingli
- swoole
- swoole启动关闭方案
- swoole服务端主动推送消息
- 创建websocket--systemctl自定义启动服务
- 创建php脚本来启动关闭websocket服务
- swoole小知识
- 进程/线程结构图
- 区块链
- 区块链概念理解
- usdt小知识点1
- 区块链架构1.0、2.0与3.0梳理
- 理解usdt和代币,智能合约,基础货币
- 波场tron
- 账号创建
- 代币转账