## 背景
哈哈,說起來也是挺逗的,在這個AI時代,是個程序員都得變身成全能學霸,不然分分鐘就被時代的巨輪給甩飛了。我呢?作為一個小菜鳥,心里頭那個急啊,生怕一不小心就被AI給“智能”掉了。
結果呢,還沒跟AI大戰三百回合,就先被自己的電腦配置環境給“虐”了。簡直就是一場沒有硝煙的戰爭,安裝包、驅動、兼容性問題……想罵人嘍!
但話說回來,這過程雖然坎坷,卻也樂在其中。畢竟,哪個程序員不是在不斷試錯中成長的呢?
所以啊,雖然被本地環境虐得有點慘,但我也算是痛并快樂著吧。畢竟,每一次的失敗都是向成功邁進的一步嘛!接下來聽我來說說,是怎么一步一步北虐待的!!!
## 開始被虐
### phpy官方鏡像
當我按照phpy官方鏡像`phpswoole/phpy:1.0.5`安裝`torch`
```
pip install torch torchvision torchaudio
```
出現以下的錯誤信息
```
ERROR: Could not find a version that satisfies the requirement torch (from versions: none)
ERROR: No matching distribution found for torch
```
> 這個錯誤信息表明你的Python環境在嘗試安裝PyTorch(一個流行的機器學習庫)時未能找到任何合適的版本。
通過AI也搜索到了問題的解決辦法

下來我們通過指定版本,實際上如果同時確定torch版本以及適合的CUDA版本,應該使用下面的指令:
```ts
pip install torch==2.2.0+cpu torchvision torchaudio -f https://download.pytorch.org/whl/torch_stable.html
```
使用這條指令,可以直接在官方對應的網站檢索相應版本下載。可以看出是按照成功了
```ts
(venv) /var/www # pip install torch==2.2.0+cpu torchvision torchaudio -f https://download.pytorch.org/whl/torch_stable.html
Looking in links: https://download.pytorch.org/whl/torch_stable.html
Collecting torch==2.2.0+cpu
Downloading https://download.pytorch.org/whl/cpu/torch-2.2.0%2Bcpu-cp312-cp312-linux_x86_64.whl (186.7 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 186.7/186.7 MB 4.3 MB/s eta 0:00:00
Collecting torchvision
Downloading https://download.pytorch.org/whl/rocm6.0/torchvision-0.18.1%2Brocm6.0-cp312-cp312-linux_x86_64.whl (65.7 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 65.7/65.7 MB 5.5 MB/s eta 0:00:00
Collecting torchaudio
Downloading https://download.pytorch.org/whl/rocm6.0/torchaudio-2.3.1%2Brocm6.0-cp312-cp312-linux_x86_64.whl (1.7 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 5.1 MB/s eta 0:00:00
Collecting filelock (from torch==2.2.0+cpu)
Downloading filelock-3.15.4-py3-none-any.whl.metadata (2.9 kB)
Collecting typing-extensions>=4.8.0 (from torch==2.2.0+cpu)
Downloading typing_extensions-4.12.2-py3-none-any.whl.metadata (3.0 kB)
Collecting sympy (from torch==2.2.0+cpu)
Downloading sympy-1.13.2-py3-none-any.whl.metadata (12 kB)
Collecting networkx (from torch==2.2.0+cpu)
Downloading networkx-3.3-py3-none-any.whl.metadata (5.1 kB)
Collecting jinja2 (from torch==2.2.0+cpu)
Downloading jinja2-3.1.4-py3-none-any.whl.metadata (2.6 kB)
Collecting fsspec (from torch==2.2.0+cpu)
Downloading fsspec-2024.6.1-py3-none-any.whl.metadata (11 kB)
Collecting numpy (from torchvision)
Downloading numpy-2.1.0-cp312-cp312-musllinux_1_1_x86_64.whl.metadata (60 kB)
INFO: pip is looking at multiple versions of torchvision to determine which version is compatible with other requirements. This could take a while.
Collecting torchvision
Downloading https://download.pytorch.org/whl/rocm5.7/torchvision-0.18.1%2Brocm5.7-cp312-cp312-linux_x86_64.whl (65.5 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 65.5/65.5 MB 1.6 MB/s eta 0:00:00
Downloading https://download.pytorch.org/whl/cu121/torchvision-0.18.1%2Bcu121-cp312-cp312-linux_x86_64.whl (7.0 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.0/7.0 MB 2.2 MB/s eta 0:00:00
Downloading https://download.pytorch.org/whl/cu118/torchvision-0.18.1%2Bcu118-cp312-cp312-linux_x86_64.whl (6.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.3/6.3 MB 2.9 MB/s eta 0:00:00
Downloading https://download.pytorch.org/whl/cpu/torchvision-0.18.1%2Bcpu-cp312-cp312-linux_x86_64.whl (1.6 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 3.0 MB/s eta 0:00:00
Downloading https://download.pytorch.org/whl/rocm6.0/torchvision-0.18.0%2Brocm6.0-cp312-cp312-linux_x86_64.whl (65.7 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 65.7/65.7 MB 5.0 MB/s eta 0:00:00
Downloading https://download.pytorch.org/whl/rocm5.7/torchvision-0.18.0%2Brocm5.7-cp312-cp312-linux_x86_64.whl (65.5 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 65.5/65.5 MB 5.3 MB/s eta 0:00:00
Downloading https://download.pytorch.org/whl/cu121/torchvision-0.18.0%2Bcu121-cp312-cp312-linux_x86_64.whl (7.0 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.0/7.0 MB 5.4 MB/s eta 0:00:00
INFO: pip is still looking at multiple versions of torchvision to determine which version is compatible with other requirements. This could take a while.
Downloading https://download.pytorch.org/whl/cu118/torchvision-0.18.0%2Bcu118-cp312-cp312-linux_x86_64.whl (6.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.3/6.3 MB 2.5 MB/s eta 0:00:00
Downloading https://download.pytorch.org/whl/cpu/torchvision-0.18.0%2Bcpu-cp312-cp312-linux_x86_64.whl (1.6 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 4.7 MB/s eta 0:00:00
Downloading https://download.pytorch.org/whl/rocm5.7/torchvision-0.17.2%2Brocm5.7-cp312-cp312-linux_x86_64.whl (65.5 MB)
━━━━━━━━━━━━━━━━━━━━━?━━━━━━━━━━━━━━━━━━ 35.1/65.5 MB 1.5 MB/s eta 0:00:20
Downloading certifi-2024.8.30-py3-none-any.whl (167 kB)
Downloading charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl (142 kB)
Downloading idna-3.8-py3-none-any.whl (66 kB)
Downloading MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl (33 kB)
Downloading mpmath-1.3.0-py3-none-any.whl (536 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 536.2/536.2 kB 3.9 MB/s eta 0:00:00
Downloading urllib3-2.2.2-py3-none-any.whl (121 kB)
Installing collected packages: mpmath, urllib3, typing-extensions, sympy, pillow, numpy, networkx, MarkupSafe, idna, fsspec, filelock, charset-normalizer, certifi, requests, jinja2, torch, torchvision, torchaudio
Successfully installed MarkupSafe-2.1.5 certifi-2024.8.30 charset-normalizer-3.3.2 filelock-3.15.4 fsspec-2024.6.1 idna-3.8 jinja2-3.1.4 mpmath-1.3.0 networkx-3.3 numpy-2.1.0 pillow-10.4.0 requests-2.32.3 sympy-1.13.2 torch-2.2.0+cpu torchaudio-2.2.0+rocm5.7 torchvision-0.17.0+rocm5.7 typing-extensions-4.12.2 urllib3-2.2.2
```
### opencv-python
接下來我們安裝`opencv-python`這個庫
```
pip install opencv-python
```
安裝錯誤信息
```ts
# pip install opencv-python
Collecting opencv-python
Using cached opencv-python-4.10.0.84.tar.gz (95.1 MB)
Installing build dependencies ... done
Getting requirements to build wheel ... error
error: subprocess-exited-with-error
× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─> [33 lines of output]
Traceback (most recent call last):
File "/path/to/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module>
main()
File "/path/to/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main
json_out['return_val'] = hook(**hook_input['kwargs'])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/path/to/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 112, in get_requires_for_build_wheel
backend = _build_backend()
^^^^^^^^^^^^^^^^
File "/path/to/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 77, in _build_backend
obj = import_module(mod_path)
^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.12/importlib/__init__.py", line 90, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
File "<frozen importlib._bootstrap>", line 1310, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 995, in exec_module
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "/tmp/pip-build-env-tj3_9lus/overlay/lib/python3.12/site-packages/setuptools/__init__.py", line 16, in <module>
import setuptools.version
File "/tmp/pip-build-env-tj3_9lus/overlay/lib/python3.12/site-packages/setuptools/version.py", line 1, in <module>
import pkg_resources
File "/tmp/pip-build-env-tj3_9lus/overlay/lib/python3.12/site-packages/pkg_resources/__init__.py", line 2172, in <module>
register_finder(pkgutil.ImpImporter, find_on_path)
^^^^^^^^^^^^^^^^^^^
AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'?
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error
× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─> See above for output.
note: This error originates from a subprocess, and is likely not a problem with pip.
```
錯誤信息
```
note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error
× Getting requirements to build wheel did not run successfully.
這個錯誤是由于 Python 3.12 中的`pkgutil`模塊與某些舊版本的`setuptools`或其他依賴包不兼容所導致的。在 Python 3.12 中,`pkgutil.ImpImporter`已經被移除,這導致了`AttributeError`。
```
**解決方案**
1. 升級 setuptools :`pip install --upgrade setuptools`
2. 清除 pip 的緩存:`pip cache purge`
3. 其他N種解決方案都不行
> 結論是:解決不了!解決不了!解決不了!我放棄了。時間不早了

### 構建自己的phpy鏡像
由于官方默認鏡像庫基礎鏡像是使用`Base image php:8.2-alpine`,會有各種不兼容問題。

所以這里拉取官方倉庫重新構建,使用基礎鏡像`Base image php:8.2.13-cli-bullseye`
```
git clone git@github.com:swoole/phpy.git
```
構建
```
docker build -t tinywan/docker-php-phpy:8.2.13 .
```

運行容器
```
docker run -it -v d:/dnmp/www/ai:/opt tinywan/docker-php-phpy:8.2.13
```
進入容器
```
docker exec -it fab440ffc331ca9d47f09 sh
```
接下來我們安裝`opencv-python`這個庫
```
apt install pip
pip install opencv-python
```
可以看到很快速的安裝成功了

## 基礎鏡像版本區別
|版本|說明|案例|
|--|-----------------|--|
|alpine|Alpine Linux 操作系統,它是一個獨立發行版本,相比較 Debian 操作系統來,更加輕巧|`python:3.11.4-alpine`|
|slim|基于Debian操作系統最小操作系統,刪除了許多非必需的軟件包,優化了體積|`python:3.11.4-slim`|
|bookworm|Debian 12 |`python:3.11.4-bookworm`|
|bullseye|Debian 11 |`python:3.11.4-bullseye`|
通過`docker images | sort -k7 -h` 比較鏡像大小
```ts
docker pull --quiet python:3.11.4
docker pull --quiet python:3.11.4-slim
docker pull --quiet python:3.11.4-alpine
docker pull --quiet python:3.11.4-bookworm
docker pull --quiet python:3.11.4-slim-bookworm
```
### 完整官方鏡像
根據 DockerHub 的說法,沒有合格標簽的完整鏡像是事實上的鏡像,如果你不確定并且剛開始,應該使用它。
例如:`python:3.11.4 node:20.3.0` 這些鏡像基于最新的穩定 Debian 操作系統版本。我通常在嘗試在開發環境中快速啟動一個項目時,首先使用其中之一。
完整鏡像是最安全的選擇,當你試圖在開發環境中快速啟動某事時,你應該使用它。原因是,它可能包含你的應用程序或腳本運行所需的一切。但是,在部署到生產之前,一定要選擇對你來說最小最安全的鏡像。
### alpine
Alpine 鏡像基于 Alpine Linux 項目,該項目是專門為容器內部使用而構建的操作系統。很長一段時間以來,這些是最受歡迎的鏡像變體,因為它們的體積非常小。
然而,一些團隊正在棄用alpine鏡像,因為這些鏡像可能會導致難以調試的兼容性問題。具體來說,如果使用python鏡像,一些 `wheels`將被構建成與Debian兼容,并且需要重新編譯,才能與基于apline的鏡像一起工作。
使用 Alpine 鏡像的主要原因是使你的結果鏡像盡可能小。基礎鏡像將小于 5MB。當前的 python 基礎鏡像(將 python 添加到基礎 alpine 鏡像)為 78.9MB。那仍然相對較小。
### slim
slim 鏡像是完整鏡像的精簡版本。這個鏡像通常只安裝運行你特定工具所需的最小內容。就 Python 而言,那就是運行 python 所需的最少包,對于 node.js 也是如此。
通過省略不常用的工具,鏡像變得更小。如果你有空間限制,不需要完整版本,請使用此鏡像。
### bullseye
帶有 bullseye、bookworm、stretch、buster 或 jessie 標簽的鏡像是不同 Debian 版本的代號。
如果你的代碼與特定版本的 Debian 操作系統兼容,請選擇其中一個鏡像。通常情況下,當你安裝超出基礎操作系統提供的包時,就會這樣。在這種情況下,你要確保你留在同一個 Debian 版本上,這樣你就不會在將來破壞你的構建。
## 本地鏡像
```
$ docker images |grep phpy
tinywan/docker-php-phpy 8.2.13 5110f1243760 1.64GB
phpswoole/phpy 1.0.5 3b7e3abc6948 143MB
```
### phpy 官方鏡像
```ts
docker pull phpswoole/phpy:1.0.5
```
通過`docker scout quickview phpswoole/phpy:1.0.5`查看鏡像大小

> 基礎鏡像`Base image php:8.2-alpine`
### phpy 本地構建鏡像
```
docker scout quickview tinywan/docker-php-phpy:8.2.13
```

> 基礎鏡像`Base image php:8.2-bullseye`
- 設計模式系列
- 工廠方法模式
- 序言
- Windows程序注冊為服務的工具WinSW
- 基礎
- 安裝
- 開發規范
- 目錄結構
- 配置
- 快速入門
- 架構
- 請求流程
- 架構總覽
- URL訪問
- 容器和依賴注入
- 中間件
- 事件
- 代碼層結構
- 四個層次
- 路由
- 控制器
- 請求
- 響應
- 數據庫
- MySQL實時同步數據到ES解決方案
- 阿里云DTS數據MySQL同步至Elasticsearch實戰
- PHP中的MySQL連接池
- PHP異步非阻塞MySQL客戶端連接池
- 模型
- 視圖
- 注解
- @SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})
- @EnableFeignClients(basePackages = "com.wotu.feign")
- @EnableAspectJAutoProxy
- @EnableDiscoveryClient
- 錯誤和日志
- 異常處理
- 日志處理
- 調試
- 驗證
- 驗證器
- 驗證規則
- 擴展庫
- 附錄
- Spring框架知識體系詳解
- Maven
- Maven和Composer
- 構建Maven項目
- 實操課程
- 01.初識SpringBoot
- 第1章 Java Web發展史與學習Java的方法
- 第2章 環境與常見問題踩坑
- 第3章 springboot的路由與控制器
- 02.Java編程思想深度理論知識
- 第1章 Java編程思想總體
- 第2章 英雄聯盟的小案例理解Java中最為抽象的概念
- 第3章 徹底理解IOC、DI與DIP
- 03.Spring與SpringBoot理論篇
- 第1章 Spring與SpringBoot導學
- 第2章 Spring IOC的核心機制:實例化與注入
- 第3章 SpringBoot基本配置原理
- 04.SprinBoot的條件注解與配置
- 第1章 conditonal 條件注解
- 第2章 SpringBoot自動裝配解析
- 05.Java異常深度剖析
- 第1章 Java異常分類剖析與自定義異常
- 第2章 自動配置Url前綴
- 06.參數校驗機制與LomBok工具集的使用
- 第1章 LomBok工具集的使用
- 第2章 參數校驗機制以及自定義校驗
- 07.項目分層設計與JPA技術
- 第1章 項目分層原則與層與層的松耦合原則
- 第2章 數據庫設計、實體關系與查詢方案探討
- 第3章 JPA的關聯關系與規則查詢
- 08.ORM的概念與思維
- 第1章 ORM的概念與思維
- 第2章 Banner等相關業務
- 第3章 再談數據庫設計技巧與VO層對象的技巧
- 09.JPA的多種查詢規則
- 第1章 DozerBeanMapper的使用
- 第2章 詳解SKU的規格設計
- 第3章 通用泛型Converter
- 10.令牌與權限
- 第1章 通用泛型類與java泛型的思考
- 常見問題
- 微服務
- demo
- PHP中Self、Static和parent的區別
- Swoole-Cli
- 為什么要使用現代化PHP框架?
- 公眾號
- 一鍵部署微信公眾號Markdown編輯器(支持適配和主題設計)
- Autodesigner 2.0發布
- Luya 一個現代化PHP開發框架
- PHPZip - 創建、讀取和管理 ZIP 文件的簡單庫
- 吊打Golang的PHP界天花板webman壓測對比
- 簡潔而強大的 YAML 解析庫
- 推薦一個革命性的PHP測試框架:Kahlan
- ServBay下一代Web開發環境
- 基于Websocket和Canvas實現多人協作實時共享白板
- Apipost預執行腳本如何調用外部PHP語言
- 認證和授權的安全令牌 Bearer Token
- Laradock PHP 的 Docker 完整本地開發環境
- 高效接口防抖策略,確保數據安全,避免重復提交的終極解決方案!
- TIOBE 6月榜單:PHP穩步前行,編程語言生態的微妙變化
- Aho-Corasick字符串匹配算法的實現
- Redis鍵空間通知 Keyspace Notification 事件訂閱
- ServBay如何啟用并運行Webman項目
- 使用mpdf實現導出pdf文件功能
- Medoo 輕量級PHP數據庫框架
- 在PHP中編寫和運行單元測試
- 9 PHP運行時基準性能測試
- QR碼生成器在PHP中的源代碼
- 使用Gogs極易搭建的自助Git服務
- Gitea
- webman如何記錄SQL到日志?
- Sentry PHP: 實時監測并處理PHP應用程序中的錯誤
- Swoole v6 Alpha 版本已發布
- Proxypin
- Rust實現的Redis內存數據庫發布
- PHP 8.4.0 Alpha 1 測試版本發布
- 121
- Golang + Vue 開發的開源輕量 Linux 服務器運維管理面板
- 內網穿透 FRP VS Tailscale
- 新一代開源代碼托管平臺Gitea
- 微服務系列
- Nacos云原生配置中心介紹與使用
- 輕量級的開源高性能事件庫libevent
- 國密算法
- 國密算法(商用密碼)
- GmSSL 支持國密SM2/SM3/SM4/SM9/SSL 密碼工具箱
- GmSSL PHP 使用
- 數據庫
- SQLite數據庫的Web管理工具
- 阿里巴巴MySQL數據庫強制規范
- PHP
- PHP安全測試秘密武器 PHPGGC
- 使用declare(strict_types=1)來獲得更健壯的PHP代碼
- PHP中的魔術常量
- OSS 直傳阿里騰訊示例
- PHP源碼編譯安裝APCu擴展實現數據緩存
- BI性能DuckDB數據管理系統
- 為什么別人可以是架構師!而我卻不是?
- 密碼還在用 MD5 加鹽?不如試試 password_hash
- Elasticsearch 在電商領域的應用與實踐
- Cron 定時任務入門
- 如何動態設置定時任務!而不是寫死在Linux Crontab
- Elasticsearch的四種查詢方式,你知道多少?
- Meilisearch vs Elasticsearch
- OpenSearch vs Elasticsearch
- Emlog 輕量級開源博客及建站系統
- 現代化PHP原生協程引擎 PRipple
- 使用Zephir編寫C擴展將PHP源代碼編譯加密
- 如何將PHP源代碼編譯加密,同時保證代碼能正常的運行
- 為什么選擇Zephir給PHP編寫動態擴展庫?
- 使用 PHP + XlsWriter實現百萬級數據導入導出
- Rust編寫PHP擴展
- 阿里云盤開放平臺對接進行文件同步
- 如何構建自己的PHP靜態可執行文件
- IM后端架構
- RESTful設計方法和規范
- PHP編譯器BPC 7.3 發布,成功編譯ThinkPHP8
- 高性能的配置管理擴展 Yaconf
- PHP實現雪花算法庫 Snowflake
- PHP官方現代化核心加密庫Sodium
- pie
- 現代化、精簡、非阻塞PHP標準庫PSL
- PHP泛型和集合
- 手把手教你正確使用 Composer包管理
- JWT雙令牌認證實現無感Token自動續期
- 最先進PHP大模型深度學習庫TransformersPHP
- PHP如何啟用 FFI 擴展
- PHP超集語言PXP
- 低延遲雙向實時事件通信 Socket.IO
- PHP OOP中的繼承和多態
- 強大的現代PHP高級調試工具Kint
- PHP基金會
- 基于webman+vue3高質量中后臺框架SaiAdmin
- 開源免費的定時任務管理系統:Gocron
- 簡單強大OCR工具EasyOCR在PHP中使用
- PHP代碼抽象語法樹工具PHP AST Viewer
- MySQL數據庫管理工具PHPMyAdmin
- Rust編寫的一款高性能多人代碼編輯器Zed
- 超高性能PHP框架Workerman v5.0.0-beta.8 發布
- 高并發系列
- 入門介紹及安裝
- Lua腳本開發 Hello World
- 執行流程與階段詳解
- Nginx Lua API 接口開發
- Lua模塊開發
- OpenResty 高性能的正式原因
- 記一次查找 lua-resty-mysql 庫 insert_id 的 bug
- 包管理工具OPM和LuaRocks使用
- 異步非阻塞HTTP客戶端庫 lua-resty-http
- Nginx 內置綁定變量
- Redis協程網絡庫 lua-resty-redis
- 動態HTML渲染庫 lua-testy-template
- 單獨的
- StackBlitz在線開發環境
- AI
- 基礎概念
- 12312
- 基礎鏡像的坑
- 利用phpy實現 PHP 編寫 Vision Transformer (ViT) 模型
- 語義化版本 2.0.0