## composer
**last update: 2022-05-26 10:23:11**
----
[TOC=3,8]
----
### 前言
![](https://getcomposer.org/img/logo-composer-transparent3.png)
[composer](https://getcomposer.org/) 之如 php,正如 npm 之如 nodejs,composer 是一个项目[依赖包](https://packagist.org/)管理工具。本文旨在全面介绍它的用法,学习目标是从此不会再惧怕任何php项目的包依赖管理问题,并且能够自己维护开源包。
---
### 架构
~~~shell
$ composer -v
______
/ ____/___ ____ ___ ____ ____ ________ _____
/ / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
/_/
Composer version 2.2.13 2022-05-25 21:37:25
~~~
~~~
app
├─vendor
│ ├─composer
│ │ ├─autoload_classmap.php
│ │ ├─autoload_namespaces.php
│ │ ├─autoload_psr4.php
│ │ ├─autoload_real.php
│ │ ├─autoload_static.php
│ │ ├─ClassLoader.php
│ │ ├─installed.json
│ │ ├─installed.php
│ │ ├─InstalledVersions.php
│ │ ├─LICENSE
│ │ └─platform_check.php
│ │
│ ├─monolog
│ │ └─monolog
│ │ ├─src
│ │ ├─LICENSE
│ │ ├─composer.json
│ │ └─...
│ │
│ ├─autoload.php
│ │
│ └─...
│
├─composer.json
└─composer.lock
~~~
----
### 常用命令
**命令原型:**
~~~shell
composer command [options] [arguments]
命令 选项 参数
~~~
**基础命令选项:**
以下命令选项可以在每条命令中使用:
~~~shell
-h, --help 查看帮助信息
-q, --quiet 不输出任何信息
-V, --version 查看版本号
--ansi 强制ANSI编码格式输出
--no-ansi 取消ANSI编码格式输出
-n, --no-interaction 不询问何互动问题
--profile 显示耗时和内存使用信息
--no-plugins 不使用插件
--no-scripts 不执行 composer.json 文件中定义的所有脚本
-d, --working-dir=WORKING-DIR 如果指定,使用给定目录作为工作目录
--no-cache 不使用缓存
-v|vv|vvv, --verbose 显示提示信息:-v正常输出,-vv更多的粗略输出,-vvv调试
~~~
**查看某个命令的使用帮助信息:**
~~~shell
composer require -h
~~~
----
**全部命令:**
~~~shell
about 显示关于Composer的简短信息。
archive 创建这个作曲家软件包的存档。
browse 在你的浏览器中打开软件包的存储库URL或主页。
cc 清除 composer 的内部软件包缓存。
check-platform-reqs 检查平台要求是否得到满足。
clear-cache 清除 composer 的内部软件包缓存。
clearcache 清除 composer 的内部软件包缓存。
config 设置配置选项。
create-project 从软件包中创建新的项目到指定的目录。
depends 显示包的被依赖信息
diagnose 诊断系统以识别常见错误。
dump-autoload 转储自动加载器。
dumpautoload 转储自动加载器。
exec 执行一个出售的二进制文件/脚本。
fund 发现如何为维护你的依赖关系提供资金。
global 允许在全局 composer 目录($COMPOSER_HOME)中运行命令。
help 显示一个命令的帮助
home 在浏览器中打开软件包的存储库 URL 或主页。
i 从 composer.lock 文件中安装项目的依赖关系(如果有的话),或者回到 composer.json 文件中。
info 显示软件包的信息。
init 在当前目录下创建一个基本的 composer.json 文件。
install 如果存在的话,从 composer.lock 文件中安装项目的依赖性,或者回到 composer.json 文件中。
licenses 显示依赖项的许可信息。
list 列举命令
outdated 显示有更新的已安装软件包的列表,包括其最新版本。
prohibits 显示哪些软件包阻止了给定的软件包被安装(检查已安装的包是否会与给定目标冲突,以验证是否可以升级)
reinstall 卸载和重新安装给定的软件包名称
remove 从 require 或 require-dev 中删除一个软件包。
require 将需要的软件包添加到你的 composer.json 中并安装它们。
run 运行 composer.json 中定义的脚本。
run-script 运行 composer.json 中定义的脚本。
search 搜索软件包。
self-update 将 composer.phar 更新到最新版本。
self-update 将 composer.phar 更新到最新的版本。
show 显示软件包的信息。
status 显示本地修改的软件包的列表。
suggests 显示软件包的建议。
u 根据 composer.json 将你的依赖项升级到最新版本,并更新 composer.lock 文件。
update 根据 composer.json 将你的依赖关系升级到最新版本,并更新 composer.lock 文件。
upgrade 根据 composer.json 将你的依赖关系升级到最新的版本,并更新 composer.lock 文件。
validate 验证 composer.json 和 composer.lock。
why 显示哪些软件包会导致给定的软件包被安装。
why-not 显示哪些软件包阻止给定的软件包被安装。
~~~
----
**返回结果码**
~~~
0: OK 正确码
1: 通常/未知错误码
2: 需要解决的错误码
~~~
----
#### 命令使用详解
##### init
----
##### require
~~~shell
composer require [options] [--] [<packages>]...
~~~
~~~shell
composer require --prefer-dist foo/bar
~~~
|选项|说明|
|--|--|
| --dev |添加需求到require-dev。|
| --dry-run |输出操作,但不会执行任何东西(隐含地启用 --verbose)。|
| --prefer-source |在可能的情况下,强制从软件包源头安装,包括VCS信息。|
| --prefer-dist |强制从软件包dist安装(默认行为)。|
| --prefer-install=PREFER-INSTALL |强制从软件包dist|source|auto中安装(开发版本自动选择source,其他版本选择dist)。|
| --fixed |将固定版本写入 composer.json。|
| --no-suggest |DEPRECATED: 这个标志已经不存在了。|
| --no-progress |不输出下载进度。|
| --no-update |禁用自动更新依赖项(意味着--不安装)。|
| --no-install |在更新composer.lock文件后跳过安装步骤。|
| --update-no-dev |使用 --no-dev 选项运行依赖性更新。|
|-w, --update-with-dependencies |准许继承的依赖关系被更新,但那些属于根需求的除外。|
|-W, --update-with-all-dependencies |允许更新所有继承的依赖,包括那些属于根需求的依赖。|
| --with-dependencies |--update with-dependencies的别名|
| --with-all-dependencies |--update with-all-dependencies的别名。|
| --ignore-platform-req=IGNORE-PLATFORM-REQ |忽略一个特定的平台需求(php和ext-包)。(允许多个值)|
| --ignore-platform-reqs |忽略所有的平台要求(php & ext- packages)。|
| --prefer-stable |优先选择稳定版本的依赖项。|
| --prefer-lowest |优先选择最低版本的依赖关系。|
| --sort-packages |在添加/更新新的依赖关系时对软件包进行排序|
|-o, --optimize-autoloader |在自动加载器转储时优化自动加载器|
|-a, --classmap-authoritative |只从classmap上自动加载类。隐含地启用 `--优化自动加载器 `。|
| --apcu-autoloader |使用APCu来缓存找到/未找到的类。|
| --apcu-autoloader-prefix=APCU-AUTOLOADER-PREFIX |为APCu自动加载器缓存使用一个自定义前缀。隐式启用 --apcu-autoloader|
|-h, --help |显示此帮助信息|
|-q, --quiet |不输出任何信息|
|-V, --version |显示此应用程序版本|
| --ansi |强制ANSI输出|
| --no-ansi |禁用ANSI输出|
|-n, --no-interaction |不提出任何互动问题|
| --profile |显示时间和内存使用信息|
| --no-plugins |是否禁用插件。|
| --no-scripts |跳过composer.json文件中定义的所有脚本的执行。|
|-d, --working-dir=WORKING-DIR |如果指定,使用给定的目录作为工作目录。|
| --no-cache |防止使用缓存|
|-v|vv|vvv, --verbose |增加信息的粗略程度。1表示正常输出,2表示更多的粗略输出,3表示调试。|
----
##### serach
~~~
composer search monolog
~~~
----
##### show
~~~
composer show topthink/* -a
composer show topthink/think 5.0.* -a
composer show overtrue/wechat ~5.0 -a
~~~
----
##### install
----
##### prohibits
~~~
composer prohibits symfony/symfony 3.1
composer prohibits php 5.2
~~~
----
##### update
~~~
# 会有网络检查最新的版本
$: composer update
Loading composer repositories with package information
Updating dependencies
Nothing to modify in lock file
Installing dependencies from lock file (including require-dev)
Nothing to install, update or remove
Generating autoload files
# 很快有本地安装缓存的话不需要网络请求
$: composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Nothing to install, update or remove
Generating autoload files
~~~
----
##### remove
----
##### dump-autoload
~~~
composer dump-autoload -o -a --no-dev --apcu
~~~
----
##### status
`status` 命令可以检查你本地代码中的修改内容:
~~~
composer status -v
~~~
----
##### list
----
~~~shell
composer --version
composer self-update
composer diagnose
composer show --platform
composer check-platform-reqs
composer config -g -l
composer global config bin-dir --absolute
composer clear
composer install
composer require xxx/xxx --dry-run
composer remove xxx/xxx
composer update
composer dump-autoload
composer status
composer search xxx
~~~
----
### 加载器
你也可以查阅 optimizing the autoloader 了解关于自动加载器的优化.
> 注意:Composer 提供自己的加载器,但如果你不想使用那个而想自己配置加载器的话,你可以试试 include vendor/composer/autoload_*.php 这些文件所返回的关联数组来实现。
----
#### 依赖管理
[Versions and constraints - Composer](https://getcomposer.org/doc/articles/versions.md#versions-and-constraints)
[Package Semver Checker - madewithlove](https://semver.madewithlove.com/?package=overtrue%2Fwechat&constraint=~5.0.0&stability=stable)(`包:"约束@稳定性"`)
~~~
composer require overtrue/wechat:"~5.0.0@dev"
~~~
![](http://cdn.aipin100.cn/54a73640c30ac99da8de85ccb9fcabc2)
----
### 使用技巧
----
### 相关工具链
[Packagist / Composer 中国全量镜像](https://pkg.xyz/#tip2)
> 如果你的 package 源码托管在 Github 或 Bitbucket 上,可以通过设置 service hook 让 packagist.org 在你每次 commit 后抓取更新。
----
### 语义化版本
[语义化版本 2.0.0 | Semantic Versioning](https://semver.org/lang/zh-CN/)
x.y.z 大版本.次版本.修订版
版本格式:主版本号.次版本号.修订号,版本号递增规则如下:
主版本号:当你做了不兼容的 API 修改。
次版本号:当你做了向下兼容的功能性新增。
修订号:当你做了向下兼容的问题修正。
先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。
`*` 等价于 0 或无限增长的版本号
`1` 等价于 `1.*.*`
`1.0` 等价于 `1.0.*`
`1.0.*` 等价于 `>=1.0.0 <1.1.0`
`>1.0` 等价于 `>1.0.0`
----
#### 申明所需版本范围:最新的和稳定的
##### 波形符 ~: 保守的使用最新版,但对于非稳定版阶段可能会破坏兼容性
`~1.2` 等价于 `>=1.2.0 and <2.0.0`
`~1.2.0` 等价于 `>=1.2.0 and <1.3.0`
`~1.2.3` 等价于 `>=1.2.3 and <1.3.0`
`~0.3` 等价于 `>=0.3.0 and <1.0.0` (非稳定版本时可能会破坏兼容性)
> 用 ~ 指定一个最小版本,但允许指定的最后一个数字无限增长。
>[tip] 注意: `~1` 与 `~1.0` 是相同的,因为它不会允许主版本号增加以试图保持向后兼容性。
----
##### 脱字符 ^: 保证兼容性的前提下积极使用最新版
`^1.2` 等价于 `>=1.2.0 and <2.0.0`
`^1.2.0` 等价于 `>=1.2.0 and <2.0.0`
`^1.2.3` 等价于 `>=1.2.3 and <2.0.0`
`^0.3` 等价于 `>=0.3.0 and <0.4.0` (而不是 `>=0.3.0 and <1.0.0
`)
> `^` 尽量使用最新版本,但保证不产生兼容问题。只限定不会超过下一个主版本就行(对于非 `0.*` 的稳定版)。
在 `x.y` 的情况下 `^` 、 `~` 是一样的,都代表 `>=x.y and <(x+1).0.0`。(`x > 0` 时)
**要重点注意的一点是,主版本号为 `0` 表示这是一个非稳定版本(unstable),如果处于非稳定状态,次版本号是允许不向下兼容的!,即不同的次版本可能是不保证兼容性的,所以 `^` 要保证兼容性就要固定次版本号了**,这点需要注意。所以 `^0.3.0` 等价于 `>=0.3.0 and <0.4.0`,而不是 `<1.0.0`。
https://blog.csdn.net/youcijibi/article/details/81939418
https://blog.csdn.net/u013866352/article/details/105412462
https://blog.csdn.net/eebaicai/article/details/88047833
----
### 优化
#### 类映射加载优化
~~~
composer dump-autoload -a --apcu --no-dev
# 优化级别1:类映射生成
composer dump-autoload --optimize --no-dev
# 优化级别 2/A :权威类映射
composer dump-autoload --classmap-authoritative --no-dev
# 优化级别 2/B: APCu 缓存
composer dump-autoload --apcu --no-dev
~~~
~~~
"optimize-autoloader": true
"classmap-authoritative": true
"apcu-autoloader": true
~~~
~~~
Administrator@PC-201908081131 MINGW64 /d/web/composer-yf
$ composer dump-autoload --optimize --no-dev
Generating optimized autoload files
Generated optimized autoload files containing 23388 classes
Administrator@PC-201908081131 MINGW64 /d/web/composer-yf
$ composer dump-autoload --classmap-authoritative --no-dev
Generating optimized autoload files (authoritative)
Generated optimized autoload files (authoritative) containing 23388 classes
Administrator@PC-201908081131 MINGW64 /d/web/composer-yf
$ composer dump-autoload --apcu --no-dev
Generating autoload files
Generated autoload files
~~~
类映射生成实质上是将 PSR-4/PSR-0 规则转换为类映射规则。这使得一切都快很多,因为已知的类映射会立即返回路径,而 Composer 可以保证类在那里,因此不需要文件系统检查。
在 PHP 5.6+ 中,类映射也缓存在 opcache 中,这大大改善了初始化时间。如果确保启用了 opcache ,那么类映射应该会立即加载,类加载也会很快。
[3.2. 自动加载器优化 - Composer 中文文档 - 文江博客](https://www.wenjiangs.com/doc/s5h0aqva#2b8a101b03db9ddb90d951b1355f9d7d)
[cachetool | Deployer](https://deployer.org/docs/7.x/contrib/cachetool#usage) 由于 APCu 和 OPcache 处理编译和缓存文件,它们应该在为新版本创建符号链接后立即执行
https://learnku.com/articles/10985/deployer-real-experience-sharing
~~~
apcu_clear_cache();
apc.enabled
opcache_reset();
~~~
~~~
即使立即执行可能还会有问题,应该这样:
发布前,关闭op缓存,清除op缓存
发布后,开启op缓存
~~~
#### 权威类映射加载优化
#### APCu 缓存加载优化
#### 镜像加速
恢复
~~~
composer config -g --unset repos.packagist
~~~
项目中配置:
```
{
"repositories": [
{
"type": "composer",
"url": "https://mirrors.cloud.tencent.com/composer/",
"canonical": false
},
{
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/",
"canonical": false
}
],
"require": {
"monolog/monolog": "1.0.*"
}
}
```
全局配置:
~~~
composer clear
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
~~~
[阿里云Composer镜像站-阿里云开发者社区](https://developer.aliyun.com/composer)
> 腾讯云镜像 `https://mirrors.cloud.tencent.com/composer/`
----
### 开发自己的包
----
### 分析社区的趋势
使用 统计功能 可以很方便的帮助我们分析 [社区](https://packagist.org) 主流php版本,以及包版本使用的情况,帮助我们预测社区走向,及时调整方向。
![](http://cdn.aipin100.cn/87accd08b2d3f13a8a299157050e1543)
https://packagist.org/packages/guzzlehttp/guzzle/stats#dev-master
![](http://cdn.aipin100.cn/3c2230a4bc1c0db822150cbb1f6e81f3)
https://packagist.org/packages/guzzlehttp/guzzle/php-stats
----
### 常见问题
#### 如果管理和使用非标准的库?
#### 如果使用自定义储存库的包?
https://stackoverflow.com/questions/21314381/how-to-correctly-require-a-specific-commit-in-composer-so-that-it-would-be-avail
```json
"repositories": [
{
"type": "composer",
"url": "https://mirrors.cloud.tencent.com/composer/",
"canonical": false
},
{
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/",
"canonical": false
},
{
"type": "vcs",
"url": "https://github.com/walkor/workerman"
}
],
"require": {
"workerman/workerman": "dev-master#84b7cb514003aee563ee4c13fad5895b67173707"
},
```
#### 包之间出现版本依赖冲突怎么办?
1. 取舍
2. 提 request pull
3. 有能力自己 fock一个版本单独维护
#### 三方包的安全性如何保证?
1. 使用知名的包
2. 引入项目前做必要的代码安全审查
3. 锁定使用版本
#### 三方包仓库作者删库跑路了怎么办?
1. fock github 仓库
2. 定期备份完整代码库
#### 如何审查开源协许可证,避免授权风险?
![](https://img-blog.csdnimg.cn/20190619094018567.jpeg)
[GPL、MIT、Apache...开发者如何选择开源协议?一文讲清根本区别!_走神的阿圆的博客-CSDN博客](https://blog.csdn.net/yhan_shen/article/details/122505465)
#### root 安全
[How do I install untrusted packages safely? Is it safe to run Composer as superuser or root? - Composer](https://getcomposer.org/doc/faqs/how-to-install-untrusted-packages-safely.md)
~~~
vi /etc/profile
COMPOSER_ALLOW_SUPERUSER=1
export COMPOSER_ALLOW_SUPERUSER
source /etc/profile
~~~
----
~~~
composer status 怎么知道文件变化了,它是如何工作的,文件 md5 只跟内容变化有关吗,复制文件,内容一样修改日期不一样,文件MD5一样吗。 https://www.zhihu.com/question/295147561/answer/496545059
1. 根据安装缓存中记录每个文件的MD5?经测试删除缓存,依然能检测到文件内容修改了。
2. 猜测是在其它地方有相关的缓存,暂时没有找到,可能要去看源码才行
3. 难道它用了网络去检查?能把你删除的 .md 文件都能检查出来,即使你不是在当前机器上安装的,如果不是网络,那就说明 还是 vendor 中记录了什么
~~~
----
~~~
https://developer.aliyun.com/composer
composer config repo.packagist composer https://mirrors.aliyun.com/composer/
composer config --unset repos.packagist
composer self-update
composer clear
composer update --lock
~~~
~~~
https://mirrors.tencent.com/composer/
~~~
----
### 扩展
[Composer Documentation](https://getcomposer.org/doc/)
[2.1. 简介 - Composer 中文文档 - 文江博客](https://www.wenjiangs.com/doc/k5u5ciqg)
[PHP-FIG — PHP Framework Interop Group - PHP-FIG](https://www.php-fig.org/)
[PHP 开发者该知道的 5 个 Composer 小技巧 - SegmentFault 思否](https://segmentfault.com/a/1190000000355928)
[Fast, disk space efficient package manager | pnpm](https://pnpm.io/zh/)
> 一个老牌的 node.js 包管理器,支持 npm 的所有功能,用来替代 npm。它的模块是全局存储,每个项目内部使用硬链接,所以很省空间,而且安装速度快。
[【Linux】硬链接、软链接及inode详解_长着胡萝卜须的栗子的博客-CSDN博客](https://blog.csdn.net/lixungogogo/article/details/52176571)
> 3 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
> 第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。
[1.1. 翻译说明 | 基础信息 |《Composer 中文文档 2018》| PHP 技术论坛](https://learnku.com/docs/composer/2018/about/2080)
----
~~~shell
$: composer diagnose
Checking platform settings: PHP was compiled with --with-curlwrappers which will cause issues with HTTP authentication and GitHub.
Recompile it without this flag if possible
Checking git settings: OK
Checking http connectivity to packagist: OK
Checking https connectivity to packagist: OK
Checking github.com rate limit: OK
Checking disk free space: OK
Checking pubkeys:
Tags Public Key Fingerprint: 57815BA2 7E54DC31 7ECC7CC5 573090D0 87719BA6 8F3BB723 4E5D42D0 84A14642
Dev Public Key Fingerprint: 4AC45767 E5EC2265 2F0C1167 CBBB8A2B 0C708369 153E328C AD90147D AFE50952
OK
Checking composer version: OK
Composer version: 2.3.5
PHP version: 7.2.16
PHP binary path: /usr/local/php/bin/php
OpenSSL version: OpenSSL 1.0.2k 26 Jan 2017
cURL version: 7.37.0 libz 1.2.8 ssl OpenSSL/1.0.2k
zip: extension present, unzip present, 7-Zip not available
~~~
[NixOS 的包管理设计(英文)
](https://blog.wesleyac.com/posts/the-curse-of-nixos)
> NixOS 是一个 Linux 发行版,具有独一无二的包管理机制,**彻底解决了版本冲突问题,不同版本的软件可以同时运行,新版本也可以无痛回滚到任意老版本。**
- 开始
- 公益
- 更好的使用看云
- 推荐书单
- 优秀资源整理
- 技术文章写作规范
- SublimeText - 编码利器
- PSR-0/PSR-4命名标准
- php的多进程实验分析
- 高级PHP
- 进程
- 信号
- 事件
- IO模型
- 同步、异步
- socket
- Swoole
- PHP扩展
- Composer
- easyswoole
- php多线程
- 守护程序
- 文件锁
- s-socket
- aphp
- 队列&并发
- 队列
- 讲个故事
- 如何最大效率的问题
- 访问式的web服务(一)
- 访问式的web服务(二)
- 请求
- 浏览器访问阻塞问题
- Swoole
- 你必须理解的计算机核心概念 - 码农翻身
- CPU阿甘 - 码农翻身
- 异步通知,那我要怎么通知你啊?
- 实时操作系统
- 深入实时 Linux
- Redis 实现队列
- redis与队列
- 定时-时钟-阻塞
- 计算机的生命
- 多进程/多线程
- 进程通信
- 拜占庭将军问题深入探讨
- JAVA CAS原理深度分析
- 队列的思考
- 走进并发的世界
- 锁
- 事务笔记
- 并发问题带来的后果
- 为什么说乐观锁是安全的
- 内存锁与内存事务 - 刘小兵2014
- 加锁还是不加锁,这是一个问题 - 码农翻身
- 编程世界的那把锁 - 码农翻身
- 如何保证万无一失
- 传统事务与柔性事务
- 大白话搞懂什么是同步/异步/阻塞/非阻塞
- redis实现锁
- 浅谈mysql事务
- PHP异常
- php错误
- 文件加载
- 路由与伪静态
- URL模式之分析
- 字符串处理
- 正则表达式
- 数组合并与+
- 文件上传
- 常用验证与过滤
- 记录
- 趣图
- foreach需要注意的问题
- Discuz!笔记
- 程序设计思维
- 抽象与具体
- 配置
- 关于如何学习的思考
- 编程思维
- 谈编程
- 如何安全的修改对象
- 临时
- 临时笔记
- 透过问题看本质
- 程序后门
- 边界检查
- session
- 安全
- 王垠
- 第三方数据接口
- 验证码问题
- 还是少不了虚拟机
- 程序员如何谈恋爱
- 程序员为什么要一直改BUG,为什么不能一次性把代码写好?
- 碎碎念
- 算法
- 实用代码
- 相对私密与绝对私密
- 学习目标
- 随记
- 编程小知识
- foo
- 落盘
- URL编码的思考
- 字符编码
- Elasticsearch
- TCP-IP协议
- 碎碎念2
- Grafana
- EFK、ELK
- RPC
- 依赖注入
- 开发笔记
- 经纬度格式转换
- php时区问题
- 解决本地开发时调用远程AIP跨域问题
- 后期静态绑定
- 谈tp的跳转提示页面
- 无限分类问题
- 生成微缩图
- MVC名词
- MVC架构
- 也许模块不是唯一的答案
- 哈希算法
- 开发后台
- 软件设计架构
- mysql表字段设计
- 上传表如何设计
- 二开心得
- awesomes-tables
- 安全的代码部署
- 微信开发笔记
- 账户授权相关
- 小程序获取是否关注其公众号
- 支付相关
- 提交订单
- 微信支付笔记
- 支付接口笔记
- 支付中心开发
- 下单与支付
- 支付流程设计
- 订单与支付设计
- 敏感操作验证
- 排序设计
- 代码的运行环境
- 搜索关键字的显示处理
- 接口异步更新ip信息
- 图片处理
- 项目搭建
- 阅读文档的新方式
- mysql_insert_id并发问题思考
- 行锁注意事项
- 细节注意
- 如何处理用户的输入
- 不可见的字符
- 抽奖
- 时间处理
- 应用开发实战
- python 学习记录
- Scrapy 教程
- Playwright 教程
- stealth.min.js
- Selenium 教程
- requests 教程
- pyautogui 教程
- Flask 教程
- PyInstaller 教程
- 蜘蛛
- python 文档相似度验证
- thinkphp5.0数据库与模型的研究
- workerman进程管理
- workerman网络分析
- java学习记录
- docker
- 笔记
- kubernetes
- Kubernetes
- PaddlePaddle
- composer
- oneinstack
- 人工智能 AI
- 京东
- pc_detailpage_wareBusiness
- doc
- 电商网站设计
- iwebshop
- 商品规格分析
- 商品属性分析
- tpshop
- 商品规格分析
- 商品属性分析
- 电商表设计
- 设计记录
- 优惠券
- 生成唯一订单号
- 购物车技术
- 分类与类型
- 微信登录与绑定
- 京东到家库存系统架构设计
- crmeb
- 命名规范
- Nginx https配置
- 关于人工智能
- 从人的思考方式到二叉树
- 架构
- 今日有感
- 文章保存
- 安全背后: 浏览器是如何校验证书的
- 避不开的分布式事务
- devops自动化运维、部署、测试的最后一公里 —— ApiFox 云时代的接口管理工具
- 找到自己今生要做的事
- 自动化生活
- 开源与浆果
- Apifox: API 接口自动化测试指南