Git 常用命令大全
Git 常用命令大全
Git 是开发必备工具,常用命令一定要熟练。
1. 初始化仓库
新建仓库:
git init
克隆远程仓库:
git clone https://github.com/user/repo.git
克隆指定分支:
git clone -b dev https://github.com/user/repo.git
2. 查看状态
查看状态:
git status
查看提交历史:
git log
简洁历史:
git log --oneline --graph
查看文件修改:
git diff
3. 提交代码
添加所有修改:
git add .
添加指定文件:
git add index.php
提交:
git commit -m "修复bug"
添加并提交:
git commit -am "修复bug"
4. 远程操作
查看远程仓库:
git remote -v
拉取远程更新:
git pull
推送代码:
git push
推送并设置上游分支:
git push -u origin dev
5. 分支操作
查看本地分支:
git branch
查看所有分支:
git branch -a
创建分支:
git branch dev
切换分支:
git checkout dev
创建并切换:
git checkout -b dev
合并分支:
# 先切换到master
git checkout master
# 合并dev分支
git merge dev
删除分支:
git branch -d dev
强制删除:
git branch -D dev
6. 撤销操作
撤销工作区修改:
git checkout -- index.php
撤销暂存区:
git reset HEAD index.php
回退到上个版本:
git reset --hard HEAD^
回退到指定版本:
git reset --hard commit_id
7. 标签操作
打标签:
git tag v1.0.0
查看标签:
git tag
推送标签:
git push origin v1.0.0
推送所有标签:
git push origin --tags
8. 暂存操作
暂存当前修改:
git stash
查看暂存列表:
git stash list
恢复暂存:
git stash pop
删除暂存:
git stash drop
9. 其他常用
配置用户名:
git config --global user.name "张三"
配置邮箱:
git config --global user.email "zhangsan@example.com"
查看配置:
git config --list
查看当前分支:
git branch --show-current
10. 常用工作流
开发新功能:
# 拉最新代码
git pull
# 创建功能分支
git checkout -b feature/user
# 开发完提交
git add .
git commit -m "添加用户功能"
# 推送
git push -u origin feature/user
总结
Git 常用命令要点:
- git init 初始化仓库
- git clone 克隆仓库
- git status 看状态
- git add 添加修改
- git commit 提交
- git push 推送
- git pull 拉取
- git branch 分支操作
- git checkout 切换分支
- git merge 合并分支
- git reset 回退
- git stash 暂存
Git 熟练了,团队协作效率提升很多。
PHP 时间日期处理
PHP 时间日期处理
时间日期是开发常用功能,这些函数要记住。
1. 获取当前时间
// 当前时间戳
echo time();
// 当前日期时间
echo date('Y-m-d H:i:s');
// 今天日期
echo date('Y-m-d');
2. 时间戳和日期互转
时间戳转日期
$time = time();
echo date('Y-m-d H:i:s', $time);
日期转时间戳
$date = '2024-01-01 12:00:00';
$time = strtotime($date);
echo $time;
3. 常用日期格式
// 2024-01-01
echo date('Y-m-d');
// 2024-01-01 12:00:00
echo date('Y-m-d H:i:s');
// 2024年01月01日
echo date('Y年m月d日');
// 2024/01/01
echo date('Y/m/d');
// 星期几
echo date('l'); // Sunday
4. 常用格式字符
- Y: 4位年
- m: 2位月
- d: 2位日
- H: 24小时制
- i: 分钟
- s: 秒
5. 日期加减
// 明天
echo date('Y-m-d', strtotime('+1 day'));
// 昨天
echo date('Y-m-d', strtotime('-1 day'));
// 一周后
echo date('Y-m-d', strtotime('+1 week'));
// 一个月后
echo date('Y-m-d', strtotime('+1 month'));
// 一年后
echo date('Y-m-d', strtotime('+1 year'));
6. 计算时间差
$start = strtotime('2024-01-01');
$end = strtotime('2024-01-10');
// 相差天数
$diff = ($end - $start) / 86400;
echo $diff . '天';
7. DateTime 类(推荐)
// 创建日期对象
$date = new DateTime('2024-01-01');
// 格式化输出
echo $date->format('Y-m-d H:i:s');
// 加一天
$date->add(new DateInterval('P1D'));
echo $date->format('Y-m-d');
// 计算两个日期差
$start = new DateTime('2024-01-01');
$end = new DateTime('2024-01-10');
$diff = $start->diff($end);
echo $diff->days . '天';
8. 常用场景
1)几天前
function timeAgo($time) {
$diff = time() - $time;
if ($diff < 60) return '刚刚';
if ($diff < 3600) return floor($diff/60) . '分钟前';
if ($diff < 86400) return floor($diff/3600) . '小时前';
return floor($diff/86400) . '天前';
}
2)生日计算
$birthday = '1990-01-01';
$age = floor((time() - strtotime($birthday)) / 31536000);
echo $age . '岁';
总结
PHP 时间日期处理要点:
- time() 获取时间戳
- date() 格式化日期
- strtotime() 日期转时间戳
- 用 +1 day 等做日期加减
- 推荐用 DateTime 类
- 时间差除以86400得天数
- 注意时区设置
做开发时间日期天天用,这些函数必须熟。
MySQL 常用数据类型
MySQL 常用数据类型
建表选对数据类型很重要,这些常用类型要记住。
1. 数值类型
整数类型
- TINYINT: 1字节,范围 -128~127
- SMALLINT: 2字节,范围 -32768~32767
- INT: 4字节,常用,范围约 ±21亿
- BIGINT: 8字节,大数值
小数类型
- FLOAT: 单精度浮点数
- DOUBLE: 双精度浮点数
- DECIMAL: 精确小数,存金额用这个
-- 金额用 DECIMAL(总位数, 小数位数)
price DECIMAL(10,2) -- 最多10位,2位小数
2. 字符串类型
CHAR: 定长字符串,比如 CHAR(10) 存不满补空格
- 适合固定长度,比如手机号、性别
VARCHAR: 变长字符串,最常用
- VARCHAR(255),存多少占多少
- 适合变长内容,比如用户名、标题
TEXT: 长文本
- TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT
- 存文章内容、备注等
常用选择:
- 短文本:VARCHAR(50)
- 长文本:TEXT
- 固定长度:CHAR
3. 日期时间类型
DATE: 日期,格式 YYYY-MM-DD
TIME: 时间,格式 HH:MM:SS
DATETIME: 日期+时间,范围 1000-9999年
TIMESTAMP: 时间戳,范围 1970-2038年,自动更新
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
4. 常用字段设计示例
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL COMMENT '用户名',
age TINYINT UNSIGNED COMMENT '年龄',
phone CHAR(11) COMMENT '手机号',
money DECIMAL(10,2) DEFAULT 0 COMMENT '余额',
status TINYINT DEFAULT 1 COMMENT '状态:1正常 0禁用',
content TEXT COMMENT '简介',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
5. 选择建议
1)主键ID
- 用 INT 或 BIGINT
- 不要用 UUID 做主键
2)金额
- 用 DECIMAL,不要用 FLOAT/DOUBLE
- 避免精度丢失
3)状态字段
- 用 TINYINT,不要用 VARCHAR 存 "正常/禁用"
4)时间
- 创建时间用 DATETIME
- 更新时间用 TIMESTAMP 自动更新
5)字符串
- 短文本用 VARCHAR
- 长文本用 TEXT
- 固定长度用 CHAR
6. 注意事项
- 不要过度设计: 够用就行,不要字段太大
- 能用数字不用字符串: 排序、计算都快
- 避免 NULL: 尽量设默认值,NULL 不好查询
- 加注释: 每个字段都加 COMMENT
总结
MySQL 常用数据类型要点:
- INT/BIGINT:整数
- DECIMAL:金额
- VARCHAR:字符串
- TEXT:长文本
- DATETIME/TIMESTAMP:时间
- 主键用 INT 自增
- 金额用 DECIMAL
- 状态用 TINYINT
- 字段加注释
建表选对类型,性能和存储都好。
PHP PDO 连接数据库
PHP PDO 连接数据库
PDO 是 PHP 推荐的数据库连接方式,支持多种数据库,防注入。
1. 什么是 PDO
PDO(PHP Data Objects)是 PHP 数据库抽象层,统一接口操作多种数据库。
2. 为什么用 PDO
- 防SQL注入: 预处理语句
- 支持多数据库: MySQL、PostgreSQL、SQLite 等
- 面向对象: 写法更规范
- 错误处理: 统一的错误模式
3. 连接数据库
// 数据库配置
$host = '127.0.0.1';
$dbname = 'test';
$user = 'root';
$pass = 'root';
try {
// 连接数据库
$pdo = new PDO(
"mysql:host=$host;dbname=$dbname;charset=utf8mb4",
$user,
$pass,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]
);
echo '连接成功';
} catch(PDOException $e) {
die('连接失败:' . $e->getMessage());
}
4. 查询数据
查询多条
$stmt = $pdo->query("SELECT * FROM users");
$users = $stmt->fetchAll();
查询单条
$stmt = $pdo->query("SELECT * FROM users WHERE id = 1");
$user = $stmt->fetch();
5. 预处理语句(防注入)
查询
// 问号占位符
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([1]);
$user = $stmt->fetch();
// 命名占位符
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute([':id' => 1]);
$user = $stmt->fetch();
插入
$stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (:name, :age)");
$stmt->execute([
':name' => '张三',
':age' => 20
]);
更新
$stmt = $pdo->prepare("UPDATE users SET name = :name WHERE id = :id");
$stmt->execute([
':name' => '李四',
':id' => 1
]);
删除
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
$stmt->execute([':id' => 1]);
6. 获取自增ID
$pdo->exec("INSERT INTO users (name) VALUES ('王五')");
$id = $pdo->lastInsertId();
7. 事务处理
try {
$pdo->beginTransaction();
$pdo->exec("INSERT INTO orders ...");
$pdo->exec("UPDATE stock ...");
$pdo->commit();
echo '事务成功';
} catch(Exception $e) {
$pdo->rollBack();
echo '事务失败:' . $e->getMessage();
}
8. 常用配置
// 设置返回关联数组
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
// 错误模式
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
// 关闭预处理模拟(真正服务端预处理)
PDO::ATTR_EMULATE_PREPARES => false
总结
PHP PDO 连接数据库要点:
- PDO 是统一数据库接口
- 预处理语句防 SQL 注入
- 支持事务操作
- 配置错误模式方便调试
- 推荐用命名占位符
- 生产环境关闭预处理模拟
- 记得设置 utf8mb4 字符集
做数据库开发,PDO 比 mysqli 更好用。
MySQL 视图的使用
MySQL 视图的使用
视图是虚拟表,用好了能简化查询、保护数据。
1. 什么是视图
视图(View)是基于 SQL 查询结果的虚拟表,本身不存数据,数据来自真实表。
2. 为什么用视图
1)简化查询
- 复杂查询封装成视图
- 直接查视图就行
2)权限控制
- 只暴露部分字段给用户
- 敏感字段不暴露
3)数据独立
- 表结构变了,视图不变
- 上层应用不用改
3. 创建视图
-- 创建视图
CREATE VIEW v_user_order AS
SELECT u.id, u.name, o.order_no, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id;
-- 使用视图
SELECT * FROM v_user_order WHERE id = 1;
4. 修改和删除视图
-- 修改视图
CREATE OR REPLACE VIEW v_user_order AS
SELECT u.id, u.name, o.order_no, o.amount, o.create_time
FROM users u
JOIN orders o ON u.id = o.user_id;
-- 删除视图
DROP VIEW IF EXISTS v_user_order;
5. 查看视图
-- 查看所有视图
SHOW FULL TABLES WHERE Table_type = 'VIEW';
-- 查看视图结构
DESC v_user_order;
-- 查看创建语句
SHOW CREATE VIEW v_user_order;
6. 视图的限制
1)不能用 ORDER BY 在视图里
- 外层查询可以排序
- 视图里排序意义不大
2)某些视图不能更新
- 包含 GROUP BY、DISTINCT、JOIN 等的视图
- 不能通过视图 INSERT/UPDATE/DELETE
3)视图不存数据
- 每次查询都执行 SQL
- 复杂视图查询可能慢
7. 实际使用建议
1)视图不是越多越好
- 复杂业务逻辑用视图
- 简单查询直接写 SQL
2)视图不要嵌套太多层
- 视图套视图性能差
- 最多一层就够了
3)敏感数据保护
- 密码、手机号等敏感字段
- 用视图隐藏或脱敏
8. 视图和表的区别
| 对比项 | 表 | 视图 |
|---|---|---|
| 存数据 | 是 | 否(虚拟表) |
| 占空间 | 是 | 否 |
| 查询速度 | 快 | 取决于SQL |
| 安全性 | 低 | 高 |
总结
MySQL 视图使用要点:
- 视图是虚拟表,不存数据
- 简化复杂查询
- 保护敏感数据
- 用 CREATE VIEW 创建
- 简单视图可以更新
- 复杂视图查询可能慢
- 不要过度使用视图
视图是好东西,但别滥用。
PHP 超全局变量详解
PHP 超全局变量详解
PHP 超全局变量在所有作用域都能用,写接口和表单开发天天用到。
1. 什么是超全局变量
超全局变量是 PHP 预定义的数组变量,不需要 global 声明,在函数、类、文件里都能直接访问。
2. 常用超全局变量
1)$_GET
获取 URL 查询参数。
// 访问 index.php?id=1&name=张三
$id = $_GET['id']; // 1
$name = $_GET['name']; // 张三
2)$_POST
获取表单 POST 提交的数据。
// 表单 method="post"
$username = $_POST['username'];
$password = $_POST['password'];
3)$_REQUEST
同时获取 GET、POST、COOKIE 数据。
$id = $_REQUEST['id'];
// 不推荐,安全隐患大
4)$_SESSION
会话数据,跨页面共享。
session_start();
$_SESSION['user_id'] = 1;
$_SESSION['username'] = '张三';
5)$_COOKIE
获取客户端 Cookie。
$token = $_COOKIE['token'];
6)$_SERVER
服务器和执行环境信息。
// 获取请求方法
$method = $_SERVER['REQUEST_METHOD'];
// 获取当前URL
$uri = $_SERVER['REQUEST_URI'];
// 获取客户端IP
$ip = $_SERVER['REMOTE_ADDR'];
// 获取HTTP头
$host = $_SERVER['HTTP_HOST'];
3. 文件上传变量
$_FILES
处理文件上传。
// 表单 enctype="multipart/form-data"
$file = $_FILES['upload'];
$name = $file['name']; // 文件名
$tmp = $file['tmp_name']; // 临时路径
$size = $file['size']; // 文件大小
$error = $file['error']; // 错误码
4. 注意事项
- 安全问题: 所有超全局变量都不可信,必须做过滤和验证
- isset 判断: 取值前用 isset 判断是否存在,避免报错
- 类型转换: 数字参数记得转 int
- 不要用 $_REQUEST: 安全隐患大,明确用 GET 还是 POST
5. 安全取值示例
// 安全获取GET参数
$id = isset($_GET['id']) ? intval($_GET['id']) : 0;
// 安全获取POST参数
$username = isset($_POST['username']) ? trim($_POST['username']) : '';
// 判断请求方法
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 处理POST请求
}
总结
PHP 超全局变量要点:
- $_GET:获取 URL 参数
- $_POST:获取表单数据
- $_SESSION:会话数据
- $_COOKIE:客户端 Cookie
- $_SERVER:服务器信息
- $_FILES:文件上传
- 所有外部输入都要过滤验证,不能直接用
- 取值前先 isset 判断
做 PHP 开发,超全局变量是基础中的基础。
MySQL 事务隔离级别
MySQL 事务隔离级别
事务隔离是数据库的重要概念,搞懂4种级别很有必要。
1. 事务的ACID
- 原子性(Atomicity): 要么全成功,要么全失败
- 一致性(Consistency): 事务前后数据一致
- 隔离性(Isolation): 多个事务互不影响
- 持久性(Durability): 提交后永久保存
2. 4种隔离级别
1)读未提交(Read Uncommitted)
- 能读到未提交的数据
- 有脏读、不可重复读、幻读问题
- 性能最好
2)读提交(Read Committed)
- 只能读到已提交的数据
- 解决脏读
- 有不可重复读、幻读问题
- Oracle默认级别
3)可重复读(Repeatable Read)
- 同一个事务里读多次结果一样
- 解决脏读、不可重复读
- 有幻读问题
- MySQL默认级别
4)串行化(Serializable)
- 事务排队执行
- 解决所有问题
- 性能最差
3. 三种问题
脏读:
- 读到另一个事务未提交的数据
- 对方回滚了,你读的就是脏数据
不可重复读:
- 同一个事务里,两次读同一行结果不一样
- 中间被其他事务修改了
幻读:
- 同一个事务里,两次查询行数不一样
- 中间被其他事务插入了
4. 查看和设置
-- 查看当前隔离级别
SELECT @@transaction_isolation;
-- 设置隔离级别
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
5. 实际使用
- 一般用默认的可重复读就够了
- 对一致性要求高的用串行化
- 不要随便改隔离级别
总结
MySQL事务隔离级别要点:
- 读未提交:性能最好,问题最多
- 读提交:解决脏读
- 可重复读:MySQL默认,解决不可重复读
- 串行化:最安全,性能最差
- 理解脏读、不可重复读、幻读
做数据库开发,事务隔离一定要懂。
PHP 字符串处理函数
PHP 字符串处理函数
字符串处理是 PHP 最常用的操作,这些函数一定要会。
1. 截取字符串
// 截取前n个字符
substr("hello world", 0, 5); // hello
// 中文截取(用mb_substr)
mb_substr("你好世界", 0, 2, "utf-8"); // 你好
2. 替换字符串
// str_replace 替换
str_replace("world", "PHP", "hello world"); // hello PHP
// 只替换第一次出现
str_replace("a", "b", "aaa", $count);
3. 查找字符串
// 查找位置(找不到返回false)
strpos("hello world", "world"); // 6
// 注意:用 === 0 判断开头
if (strpos($str, "hello") === 0) {
echo "以hello开头";
}
4. 大小写转换
// 转小写
strtolower("Hello"); // hello
// 转大写
strtoupper("hello"); // HELLO
// 首字母大写
ucfirst("hello"); // Hello
// 每个单词首字母大写
ucwords("hello world"); // Hello World
5. 去除空白
// 去除两边空格
trim(" hello "); // hello
// 去左边
ltrim(" hello "); // hello
// 去右边
rtrim(" hello "); // hello
6. 字符串拼接
// 用点拼接
$str = "hello" . " " . "world";
// 多变量拼接
$a = "hello";
$b = "world";
$c = "$a $b"; // hello world
7. 分割和合并
// 分割成数组
$arr = explode(",", "a,b,c"); // ["a", "b", "c"]
// 数组合并成字符串
$str = implode(",", $arr); // a,b,c
8. 常用技巧
1)判断是否包含字符串:
if (strpos($str, "hello") !== false) {
echo "包含hello";
}
2)反转字符串:
strrev("hello"); // olleh
3)字符串长度:
strlen("hello"); // 5
mb_strlen("你好", "utf-8"); // 2
总结
PHP 字符串处理要点:
- substr 截取,注意中文用 mb_substr
- str_replace 替换
- strpos 查找,用 !== false 判断
- trim 去空格
- explode/implode 分割合并
- 注意中文编码问题,用 mb 开头的函数
写 PHP,字符串函数天天用。
PHP 常用设计模式
PHP 常用设计模式
设计模式是写好代码的经验总结,常用的几种要掌握。
1. 单例模式
整个项目只有一个实例,比如数据库连接。
class Db
{
private static $instance = null;
private function __construct() {}
public static function getInstance()
{
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}
$db = Db::getInstance();
2. 工厂模式
根据参数创建不同的对象。
class Factory
{
public static function make($type)
{
$class = ucfirst($type);
return new $class();
}
}
$user = Factory::make('user');
$order = Factory::make('order');
3. 观察者模式
一个对象状态变化,通知所有观察者。
interface Observer
{
public function update($event);
}
class Event
{
private $observers = [];
public function add(Observer $observer)
{
$this->observers[] = $observer;
}
public function trigger($event)
{
foreach ($this->observers as $ob) {
$ob->update($event);
}
}
}
4. 常用场景
- 单例: 数据库、日志、配置
- 工厂: 创建不同类的对象
- 观察者: 事件触发、消息通知
- 策略: 不同支付方式
- 适配器: 兼容不同接口
5. 设计原则
- 单一职责:一个类只做一件事
- 开闭原则:对扩展开放,对修改关闭
- 依赖倒置:依赖抽象不依赖具体
总结
PHP 常用设计模式要点:
- 单例模式:只创建一个实例
- 工厂模式:统一创建对象
- 观察者:事件通知
- 理解设计原则
- 不要为了模式而模式
设计模式是工具,解决问题才是目的。
PHP Composer 使用指南
PHP Composer 使用指南
Composer 是 PHP 的依赖管理工具,做开发必备。
1. 安装 Composer
# 下载安装
curl -sS https://getcomposer.org/installer | php
# 移动到全局
mv composer.phar /usr/local/bin/composer
# 验证
composer -V
2. 国内镜像加速
# 阿里镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
3. 常用命令
1)初始化项目:
composer init
2)安装依赖:
# 安装所有依赖
composer install
# 安装指定包
composer require monolog/monolog
# 安装开发依赖
composer require --dev phpunit/phpunit
3)更新依赖:
# 更新所有依赖
composer update
# 更新指定包
composer update monolog/monolog
4)删除依赖:
composer remove monolog/monolog
4. composer.json 说明
{
"name": "test/project",
"description": "测试项目",
"require": {
"php": ">=7.0",
"monolog/monolog": "^2.0"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
5. 自动加载
// 引入自动加载
require __DIR__ . '/vendor/autoload.php';
// 使用类
$log = new Monolog\Logger('name');
6. 常用操作
composer install:根据 lock 文件安装composer update:更新依赖composer dump-autoload:重新生成自动加载
总结
Composer 使用要点:
- 安装 Composer
- 配置国内镜像
- require 安装依赖
- autoload 自动加载
- install/update 管理依赖
做 PHP 开发,Composer 一定要会用。
Git 常用命令大全
Git 常用命令大全
Git 是开发必备工具,这些常用命令一定要会。
1. 初始化和克隆
# 初始化仓库
git init
# 克隆远程仓库
git clone https://github.com/user/repo.git
2. 提交代码
# 查看状态
git status
# 添加所有文件到暂存区
git add .
# 添加指定文件
git add index.html
# 提交到本地仓库
git commit -m "提交说明"
# 提交并添加所有修改
git commit -am "提交说明"
3. 远程操作
# 推送到远程分支
git push origin master
# 拉取远程更新
git pull origin master
# 查看远程仓库
git remote -v
4. 分支操作
# 查看所有分支
git branch
# 创建新分支
git branch dev
# 切换分支
git checkout dev
# 创建并切换分支
git checkout -b dev
# 合并分支
git merge dev
# 删除分支
git branch -d dev
5. 版本回退
# 查看提交历史
git log
# 查看简化日志
git log --oneline
# 回退到上一个版本
git reset --hard HEAD^
# 回退到指定版本
git reset --hard 版本号
# 查看操作记录
git reflog
6. 撤销操作
# 撤销工作区修改
git checkout -- 文件
# 撤销暂存区
git reset HEAD 文件
# 删除文件
git rm 文件
7. 常用技巧
1)查看差异:
git diff
2)暂存修改:
# 临时保存
git stash
# 恢复暂存
git stash pop
3)打标签:
git tag v1.0
git push origin v1.0
8. 配置用户信息
# 全局配置
git config --global user.name "用户名"
git config --global user.email "邮箱"
总结
Git 常用命令要点:
- add 添加文件
- commit 提交代码
- push 推送到远程
- pull 拉取更新
- branch 分支管理
- log 查看历史
- reset 版本回退
做开发,Git 一定要熟练用。
PHP 会话管理详解
PHP 会话管理详解
Session 是 PHP 做用户登录状态管理的核心功能,搞懂它很重要。
1. 什么是 Session
- Cookie: 存在客户端(浏览器)
- Session: 存在服务器端
- 通过 SessionID 关联用户
2. 基础用法
// 开启会话(必须放在最前面)
session_start();
// 存数据
$_SESSION['user_id'] = 1;
$_SESSION['username'] = "test";
// 取数据
echo $_SESSION['username'];
// 判断是否登录
if (isset($_SESSION['user_id'])) {
echo "已登录";
} else {
echo "未登录";
}
// 销毁会话
session_destroy();
3. 登录验证示例
// 登录页
session_start();
if ($_POST['password'] == "123456") {
$_SESSION['user'] = $_POST['username'];
header("Location: dashboard.php");
}
// 验证页
session_start();
if (!isset($_SESSION['user'])) {
header("Location: login.php");
exit;
}
4. 常用配置
php.ini 里的配置:
; 会话有效期(分钟)
session.gc_maxlifetime = 1440
; Cookie 有效期(秒)
session.cookie_lifetime = 0
; 是否只允许 HTTP 访问 Cookie
session.cookie_httponly = On
5. 常见问题
1)session 丢失:
- 检查是否有输出(session_start 前不能有空格)
- 检查 Cookie 是否被禁用
2)多服务器共享 Session:
- 存在数据库里
- 存在 Redis 里
- 不要用文件 Session
3)安全问题:
- 登录后重新生成 SessionID
session_regenerate_id(); - 防止 Session 固定攻击
6. Cookie vs Session
| 对比 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端 | 服务器端 |
| 大小限制 | 4KB | 无限制 |
| 安全性 | 低 | 高 |
| 生命周期 | 可长期保存 | 浏览器关闭就没了 |
7. 登出销毁
session_start();
// 清除所有 session 变量
$_SESSION = array();
// 清除 session cookie
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
// 销毁 session
session_destroy();
总结
PHP 会话管理要点:
- session_start() 必须在最前面
- 登录验证用 $_SESSION 判断
- 生产环境用 Redis 存 Session
- 登录后重新生成 SessionID 防攻击
做用户系统,Session 是必须掌握的。
PHP 错误处理机制
PHP 错误处理机制
做开发离不开错误处理,搞懂 PHP 的错误机制才能写出健壮的代码。
1. 错误级别
PHP 错误分几个级别:
1)致命错误(E_ERROR)
- 脚本停止执行
- 比如调用不存在的类、方法
2)警告(E_WARNING)
- 脚本继续执行
- 比如包含不存在的文件
3)注意(E_NOTICE)
- 不影响执行
- 比如使用未定义的变量
2. 错误报告配置
php.ini 里的配置:
; 开发环境:显示所有错误
display_errors = On
error_reporting = E_ALL
; 生产环境:不显示错误,记录日志
display_errors = Off
log_errors = On
error_reporting = E_ALL & ~E_NOTICE
3. 自定义错误处理
// 设置错误报告级别
error_reporting(E_ALL);
// 自定义错误处理函数
set_error_handler(function($errno, $errstr, $errfile, $errline) {
echo "错误:[$errno] $errstr 在 $errfile 第 $errline 行";
return true; // 阻止默认错误处理
});
// 测试
echo $undefined_var;
4. 异常处理
try {
if (!file_exists("test.txt")) {
throw new Exception("文件不存在");
}
$file = fopen("test.txt", "r");
} catch (Exception $e) {
echo "错误:" . $e->getMessage();
} finally {
echo "\n执行完成";
}
5. 错误日志
// 记录错误日志
error_log("这是一条错误日志", 3, "/tmp/php_errors.log");
// 手动触发错误
trigger_error("自定义错误", E_USER_WARNING);
6. 开发 vs 生产
开发环境:
- 显示错误
- 所有错误都报告
- 方便调试
生产环境:
- 不显示错误(防止泄露敏感信息)
- 记录错误日志
- 只报告致命错误和警告
7. 常用技巧
1)错误抑制符 @
// 不推荐,会影响性能
@include("config.php");
2)die/exit
// 简单粗暴
if (! $db) {
die("数据库连接失败");
}
3)抛异常
- 推荐用异常处理
- 代码更清晰,容易维护
总结
PHP 错误处理要点:
- 开发环境显示错误,生产环境记录日志
- 用 try-catch 处理异常
- 错误日志要记录,方便排查
- 不要用 @ 错误抑制符
写代码多做错误处理,线上少踩坑。
PHP 数组常用函数
PHP 数组常用函数
数组是 PHP 最常用的数据结构,数组函数用熟了开发效率翻倍。整理一份常用清单。
1. 数组创建和遍历
// 索引数组
$arr1 = [1, 2, 3];
// 关联数组
$arr2 = ['name' => '张三', 'age' => 25];
// 遍历
foreach ($arr2 as $key => $value) {
echo "$key: $value\n";
}
2. 数组增删改查
// 追加元素
$arr[] = 4;
array_push($arr, 5, 6);
// 头部插入
array_unshift($arr, 0);
// 删除末尾元素
array_pop($arr);
// 删除头部元素
array_shift($arr);
// 删除指定元素
unset($arr[0]);
3. 数组合并和拆分
// 合并数组
$arr1 = [1, 2];
$arr2 = [3, 4];
$merged = array_merge($arr1, $arr2); // [1,2,3,4]
// 拆分
$slice = array_slice($arr, 0, 2);
4. 查找和过滤
// 判断键是否存在
array_key_exists('name', $arr);
// 判断值是否存在
in_array('张三', $arr);
// 查找值对应的键
array_search('张三', $arr);
// 数组过滤
$filtered = array_filter([1, 2, 3, 4], function($n) {
return $n > 2;
}); // [3,4]
5. 排序
sort($arr); // 升序
rsort($arr); // 降序
asort($arr); // 按值升序,保留键
ksort($arr); // 按键升序
6. 常用操作
// 数组长度
count($arr);
// 去重
array_unique($arr);
// 反转
array_reverse($arr);
// 随机取一个
array_rand($arr);
7. 实际应用
统计数组中出现次数:
$counts = array_count_values(['a', 'b', 'a', 'c', 'a']);
// ['a' => 3, 'b' => 1, 'c' => 1]
二维数组按某列排序:
$users = [
['name' => '张三', 'age' => 25],
['name' => '李四', 'age' => 20]
];
array_multisort(array_column($users, 'age'), SORT_ASC, $users);
总结
PHP 数组函数非常多,日常开发记住这些常用的就够了:
- 增删改查:array_push / array_pop / unset
- 合并拆分:array_merge / array_slice
- 查找过滤:in_array / array_filter
- 排序:sort / asort / ksort
数组是 PHP 的灵魂,多用多练就熟了。
PHP 字符串处理函数
PHP 字符串处理函数
字符串处理是 PHP 开发最常用的操作,整理一份常用函数清单。
1. 字符串长度
// 英文字符串长度
echo strlen("hello world"); // 11
// 中文字符串长度(mbstring扩展)
echo mb_strlen("你好世界", "UTF-8"); // 4
2. 截取字符串
// 英文截取
echo substr("hello world", 0, 5); // hello
// 中文截取
echo mb_substr("你好世界", 0, 2, "UTF-8"); // 你好
3. 查找替换
// 查找位置
echo strpos("hello world", "world"); // 6
// 替换
echo str_replace("world", "PHP", "hello world"); // hello PHP
// 大小写转换
echo strtoupper("hello"); // HELLO
echo strtolower("HELLO"); // hello
4. 去除空格
// 去除两端空格
echo trim(" hello "); // hello
// 去除左侧空格
echo ltrim(" hello"); // hello
// 去除右侧空格
echo rtrim("hello "); // hello
5. 字符串分割
// 分割成数组
$arr = explode(",", "a,b,c");
print_r($arr); // Array([0]=>a [1]=>b [2]=>c)
// 数组合并成字符串
echo implode(",", $arr); // a,b,c
6. 格式化输出
// 格式化字符串
echo sprintf("你好,%s!今年%d岁", "张三", 25);
// 你好,张三!今年25岁
7. HTML 转义
// 转义特殊字符
echo htmlspecialchars("<script>alert(1)</script>");
// <script>alert(1)</script>
8. 常用场景
截取标题:
function subTitle($str, $len = 20) {
if (mb_strlen($str, "UTF-8") > $len) {
return mb_substr($str, 0, $len, "UTF-8") . "...";
}
return $str;
}
过滤空格和特殊字符:
function filterStr($str) {
$str = trim($str);
$str = str_replace(" ", "", $str);
return $str;
}
总结
字符串处理常用函数:
- 长度:strlen / mb_strlen
- 截取:substr / mb_substr
- 查找替换:strpos / str_replace
- 分割合并:explode / implode
- 去除空格:trim
做 PHP 开发这些函数一定要用熟。
PHP 错误处理最佳实践
PHP 错误处理最佳实践
错误处理是 PHP 开发最容易忽略但最重要的环节,写好了排查问题事半功倍,写不好线上出问题抓瞎。
1. 错误级别
PHP 有不同的错误级别:
- E_ERROR:致命错误,脚本停止
- E_WARNING:警告,脚本继续
- E_NOTICE:注意,一般是不规范写法
- E_PARSE:语法解析错误
// 开发环境显示所有错误
error_reporting(E_ALL);
ini_set('display_errors', 1);
// 生产环境不显示错误,只记日志
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', '/var/log/php/error.log');
2. 错误 vs 异常
PHP 里错误和异常是两回事:
- 错误:语法错误、内存不足这种,用 try/catch 抓不住
- 异常:业务层面的错误,比如数据库连接失败
PHP 7+ 大部分错误会抛 Error 异常,也可以抓了。
3. try/catch 用法
try {
// 可能出错的代码
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
} catch (PDOException $e) {
// 捕获异常
echo "数据库连接失败:" . $e->getMessage();
// 记日志
error_log("DB Error: " . $e->getMessage());
}
4. 自定义错误处理
// 设置自定义错误处理器
set_error_handler(function($errno, $errstr, $errfile, $errline) {
// 把错误转成异常抛出
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});
// 设置异常处理器
set_exception_handler(function($e) {
// 所有未捕获的异常都到这里
error_log("Uncaught: " . $e->getMessage());
echo "系统繁忙,请稍后再试";
});
// 注册关闭函数,抓致命错误
register_shutdown_function(function() {
$error = error_get_last();
if ($error && in_array($error['type'], [E_ERROR, E_PARSE])) {
error_log("Fatal: " . $error['message']);
}
});
5. 开发 vs 生产环境
开发环境:
- 打开 display_errors,错误直接显示在页面
- 打开所有错误级别
- 详细的报错信息方便调试
生产环境:
- 关闭 display_errors,不要把错误暴露给用户
- 错误全部写到日志文件
- 页面显示友好的"系统错误"提示
6. 常用错误处理技巧
// 1. 用 @ 抑制错误不好,应该判断
// 不好:
$file = @file_get_contents('config.php');
// 好:
$file = file_exists('config.php') ? file_get_contents('config.php') : null;
// 2. 不要把数据库错误信息直接返回给前端
// 不好:
echo $e->getMessage();
// 好:
error_log($e->getMessage());
echo json(['code' => 500, 'msg' => '系统错误']);
// 3. 日志要分级
error_log('信息:用户登录', 3, '/var/log/info.log');
error_log('警告:登录失败次数过多', 3, '/var/log/warn.log');
error_log('错误:数据库连接失败', 3, '/var/log/error.log');
7. 总结
PHP 错误处理核心:
- 开发环境显示错误,生产环境只记日志
- try/catch 捕获业务异常
- set_exception_handler 兜底
- 不要把错误细节暴露给用户
- 日志分级,方便排查
搞懂这些,线上出问题排查效率翻倍。
Git 常用命令汇总
Git 常用命令汇总
Git 是现在开发必备工具,整理一份常用命令清单,收藏备用。
1. 初始化和克隆
# 初始化新仓库
git init
# 克隆远程仓库
git clone https://github.com/user/repo.git
# 克隆指定分支
git clone -b dev https://github.com/user/repo.git
2. 查看状态
# 查看工作区状态
git status
# 查看提交历史
git log
# 查看简洁历史
git log --oneline --graph
# 查看文件改动
git diff
3. 添加和提交
# 添加所有文件到暂存区
git add .
# 添加指定文件
git add file.php
# 提交到本地仓库
git commit -m "修复bug"
# 提交并跳过验证
git commit --no-verify -m "修复bug"
4. 分支操作
# 查看本地分支
git branch
# 查看所有分支(包括远程)
git branch -a
# 创建新分支
git branch dev
# 切换分支
git checkout dev
# 创建并切换分支
git checkout -b dev
# 删除分支
git branch -d dev
# 强制删除分支
git branch -D dev
5. 远程操作
# 拉取远程更新
git pull
# 推送本地提交
git push
# 推送本地新分支到远程
git push -u origin dev
# 删除远程分支
git push origin --delete dev
6. 撤销操作
# 撤销工作区修改
git checkout -- file.php
# 撤销暂存区
git reset HEAD file.php
# 回退到上一个版本
git reset --hard HEAD^
# 回退到指定版本
git reset --hard commit_id
# 撤销上次提交(保留修改)
git reset --soft HEAD^
7. 合并和变基
# 合并分支
git merge dev
# 变基
git rebase master
# 取消合并
git merge --abort
8. 标签操作
# 打标签
git tag v1.0.0
# 查看标签
git tag
# 推送标签
git push origin v1.0.0
# 推送所有标签
git push origin --tags
总结
Git 常用命令核心:
- 查看:status / log / diff
- 提交:add / commit
- 分支:branch / checkout / merge
- 远程:pull / push
- 撤销:reset / checkout
记住这些,日常 Git 操作基本够用了。
Docker 常用命令大全
Docker 常用命令大全
Docker 命令不多,但记不住还是很麻烦。整理一份常用命令清单,收藏备用。
1. 镜像命令
# 拉取镜像
docker pull nginx:latest
# 查看本地镜像
docker images
# 删除镜像
docker rmi nginx:latest
# 搜索镜像
docker search nginx
# 导出镜像
docker save -o nginx.tar nginx:latest
# 导入镜像
docker load -i nginx.tar
2. 容器命令
# 启动容器(后台运行)
docker run -d --name mynginx -p 80:80 nginx
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 停止容器
docker stop mynginx
# 启动已停止的容器
docker start mynginx
# 重启容器
docker restart mynginx
# 删除容器
docker rm mynginx
# 强制删除运行中的容器
docker rm -f mynginx
3. 进入容器
# 进入容器(bash)
docker exec -it mynginx bash
# 进入容器(sh)
docker exec -it mynginx sh
# 查看容器日志
docker logs mynginx
# 实时查看日志
docker logs -f mynginx
# 查看容器详情
docker inspect mynginx
4. 文件操作
# 从容器复制文件到宿主机
docker cp mynginx:/etc/nginx/nginx.conf ./
# 从宿主机复制文件到容器
docker cp ./index.html mynginx:/usr/share/nginx/html/
5. 端口和网络
# 查看容器端口映射
docker port mynginx
# 查看容器 IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mynginx
6. 清理命令
# 停止所有容器
docker stop $(docker ps -q)
# 删除所有停止的容器
docker container prune
# 删除所有未使用的镜像
docker image prune
# 删除所有未使用的资源(危险操作)
docker system prune -a
7. Docker Compose 常用命令
# 启动所有服务
docker-compose up -d
# 停止所有服务
docker-compose down
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f
# 重启某个服务
docker-compose restart nginx
总结
Docker 常用命令核心:
- 镜像:pull / images / rmi
- 容器:run / ps / stop / start / rm
- 进入:exec -it
- 日志:logs -f
- 清理:prune
记住这些,日常 Docker 操作基本够用了。
PHP Composer 入门指南
PHP Composer 入门指南
Composer 是 PHP 的依赖管理工具,现在做 PHP 开发不用 Composer 几乎不可能。
1. 安装 Composer
# Linux/Mac
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
# Windows 直接下载安装包
# https://getcomposer.org/Composer-Setup.exe
验证安装:
composer -V
2. 换国内镜像(必须)
官方镜像太慢,一定要换国内镜像:
# 阿里云镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
# 腾讯云镜像
composer config -g repo.packagist composer https://mirrors.tencent.com/composer/
3. 初始化项目
# 进入项目目录
cd myproject
# 初始化 composer.json
composer init
或者手动创建 composer.json:
{
"name": "my/project",
"require": {
"monolog/monolog": "^2.0"
}
}
4. 常用命令
# 安装依赖
composer install
# 更新依赖
composer update
# 安装某个包
composer require monolog/monolog
# 卸载某个包
composer remove monolog/monolog
# 自动加载
composer dump-autoload
5. 自动加载
// 引入自动加载文件
require __DIR__ . '/vendor/autoload.php';
// 然后就可以直接用第三方库了
$log = new Monolog\Logger('name');
6. composer.json 详解
{
"name": "项目名",
"description": "项目描述",
"type": "project",
"require": {
"php": ">=7.4",
"monolog/monolog": "^2.0",
"guzzlehttp/guzzle": "^7.0"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
7. 版本号说明
^2.0:兼容 2.0 到 3.0(不包含 3.0)~2.0:兼容 2.0 到 2.1(不包含 2.1)*:任意版本2.0.*:2.0.x 版本
总结
Composer 核心:
- 安装:一行命令
- 换镜像:必须换国内源
- 常用:install / update / require / remove
- 自动加载:require vendor/autoload.php
搞懂这些,Composer 日常开发就够用了。
PHP 字符串处理技巧
PHP 字符串处理常用技巧
字符串处理是 PHP 开发最常用的操作,掌握这些函数,写代码效率翻倍。
1. 截取字符串
// 截取前 5 个字符
substr("hello world", 0, 5); // hello
// 截取从第 6 个开始到结尾
substr("hello world", 6); // world
// 中文字符串截取(用 mb_)
mb_substr("你好世界", 0, 2, "UTF-8"); // 你好
注意:中文要用 mb_substr,不能用 substr,否则会乱码。
2. 替换字符串
// str_replace(替换所有)
str_replace("world", "PHP", "hello world"); // hello PHP
// str_ireplace(不区分大小写)
str_ireplace("WORLD", "PHP", "hello world");
// preg_replace(正则替换)
preg_replace("/\d/", "", "abc123def"); // abcdef
3. 查找字符串
// 查找位置(找不到返回 false)
strpos("hello world", "world"); // 6
// 查找最后出现位置
strrpos("hello world hello", "hello"); // 12
// 判断是否包含(PHP 8+)
str_contains("hello world", "world"); // true
// 判断开头
str_starts_with("hello world", "hello"); // true
// 判断结尾
str_ends_with("hello world", "world"); // true
4. 格式化字符串
// 去除首尾空格
trim(" hello "); // hello
// 只去左边/右边
ltrim(" hello"); // hello
rtrim("hello "); // hello
// 转小写/大写
strtolower("Hello"); // hello
strtoupper("hello"); // HELLO
// 首字母大写
ucfirst("hello"); // Hello
// 每个单词首字母大写
ucwords("hello world"); // Hello World
5. 字符串和数组转换
// 字符串转数组
explode(",", "a,b,c"); // ["a","b","c"]
// 数组转字符串
implode(",", ["a","b","c"]); // a,b,c
// 重复字符串
str_repeat("ab", 3); // ababab
// 字符串长度
strlen("hello"); // 5
mb_strlen("你好", "UTF-8"); // 2
6. 常用技巧
// 生成随机字符串
substr(md5(time()), 0, 8);
// 脱敏手机号
substr_replace("13812345678", "****", 3, 4); // 138****5678
// 截取摘要(带省略号)
mb_strlen($text) > 10 ? mb_substr($text, 0, 10) . "..." : $text;
// 清除 HTML 标签
strip_tags("<p>hello</p>"); // hello
总结
PHP 字符串处理核心函数:
- 截取:substr / mb_substr
- 替换:str_replace / preg_replace
- 查找:strpos / str_contains
- 格式化:trim / strtolower / ucwords
- 转换:explode / implode
记住这些,日常开发基本够用了。