## composer
**last update: 2022-05-26 10:23:11**
----
[TOC=3,8]
----
### 前言

[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"
~~~

----
### 使用技巧
----
### 相關工具鏈
[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版本,以及包版本使用的情況,幫助我們預測社區走向,及時調整方向。

https://packagist.org/packages/guzzlehttp/guzzle/stats#dev-master

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. 定期備份完整代碼庫
#### 如何審查開源協許可證,避免授權風險?

[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 接口自動化測試指南