我正在使用官方的docker php:apache鏡像,但我無法在php中使用mysqli。
每當我嘗試這樣做的時候,我都會得到 "沒有找到'mysqli'類 "的結果:
$conn = new mysqli($servername, $username, $password, $dbname)。)
我看到很多地方都在談論在dockerfile中添加mysqli的安裝。 我真的不確定這是否是必要的,原因如下:
當我打開bug的時候,我就會發現我的bug已經被洗掉了。
當我在我的容器上打開bash時,我看到mysqlnd作為一個php模塊被安裝。
下面是我的docker-compose.yml中的片段:
lamp-www:
depends_on:
- DB
image: php:apache
卷軸:
- "./www:/var/www/html"/span>
埠:
- 8080: 80
當我做PhpInfo()時,我看到"--enable-mysqlnd",我看到一個mysqlnd部分。
它說明了版本名稱:"mysqlnd 8.0.10".
我沒有看到任何東西表明舊的mysqli和mysqlnd之間的語法是不同的,它表明它是一樣的。我試著用 "mysqlnd "和 "mysql "代替,但它們都產生了與 "mysqli "相同的錯誤。
我也沒有看到任何東西表明當使用 "image: php:apache "時你可以使用DockerFile。我也不想進入我的容器來安裝或改變東西,并重新提交,我想使用官方的影像。
當我在docker-compose.yml中使用 "image "引數時,我可以制作一個DockerFile嗎? 是否有一個更簡潔的方法來做到這一點,比如只是在我的組合中添加一個引數,安裝我所缺少的任何神秘的東西?
最后一個問題。這是官方的php鏡像,而且安裝的模塊似乎表明mysql是由php支持的。我是否只是想使用一些不被推薦的函式/類?如果是這樣,我應該用什么來代替呢?
uj5u.com熱心網友回復:
根據檔案這里,它說:
它不是什么東西盡管MySQL Native Driver是作為一個PHP擴展而撰寫的,但重要的是要注意它并沒有提供任何的功能。 重要的是要注意,它并沒有向PHP程式員提供新的API。 程式員提供新的API。用于MySQL資料庫連接的程式員API是 由MySQL擴展、mysqli和PDO MYSQL提供。這些 這些擴展現在可以使用MySQL本地驅動的服務來與MySQL服務器通信。 與MySQL服務器通信。因此,你不應該把 MySQL Native Driver是一個API。。
基本上,mysqlnd是在mysqli或pdo_mysql下面的一層,它沒有在PHP中添加函式/類來讓你連接到MySql db。
這可以通過運行一些命令來檢查(我假設是Linux或WSL的味道):
這可以通過運行一些命令來檢查。
docker pull php:apache #downloading the official image。
docker run --rm -it php:apache bash #并在時態容器中運行它。
一旦進入容器:
php -m #checking the modules for php
php -a #執行一個php互動式控制臺。
(注意在php -m的輸出中,mysqlnd是存在的,但mysqli或pdo_mysql不是。)
然后,在php控制臺中運行這幾行:
$conn = new mysqli('localhost', 'root', 'pass', 'db')。) //用mysqli連接到MySql資料庫。
$dbh = new PDO('mysql: host=localhost;dbname=test', 'user', 'pass'); //與pdo_mysql相同。
這兩行都會拋出一個錯誤:
。Warning: Uncaught Error: Class "mysqli"未找到 in php shell code: 1/mysqli
Warning。未捕獲 PDOException。could not find driver in php shell code:1 /pdo_mysql
即使在野外的標準安裝中,mysqli和pdo_mysql都沒有默認捆綁,因為你可能想使用其他的資料庫(PostgreSQL、SQLite、Oracle等......)或者根本就沒有,所以你需要為你的資料庫安裝特定的驅動程式。
用Docker檔案安裝MySQL驅動
。問:你應該使用哪一個,mysqli還是pdo_mysql?
答:不,我不會碰這個問題,請使用你個人感覺最舒服的那個你。這個問題與 "選項卡還是空格?"、"vi、vim還是emacs?"、"披薩上的菠蘿?"、"Ross和Rachel在休息嗎?"或者 "禮服是藍色和黑色還是白色和金色?"在分歧方面,兩者都有其優點和缺點,沒有錯誤的答案(除非你把菠蘿放在披薩上,說真的,你有什么毛病?
要安裝任何一個或兩個驅動程式,您需要創建一個 Docker 檔案,以創建一個包含 php 和驅動程式的新鏡像供使用。你不需要從頭開始或在每次運行容器時都進入容器,因為你可以在官方鏡像的基礎上擴展它。
在官方鏡像的readme中,有關于這樣做的說明,他們提到了鏡像中的輔助命令,但我已經做了腿部作業: 這就是了!現在你有了一個Dockerfile,你需要把它保存在一個名字為 現在你有了這個檔案,你可以執行 但是這里有一個問題, 因此,這意味著我們可以在編譯檔案中設定 這可以使用影像和構建鍵來完成: 這可以使用影像和構建鍵。
就這樣,現在你第一次 為了檢查所有的事情,你可以使用 為了檢查一切是否順利,你可以重復之前的命令。
在這個容器中你可以運行 在php終端上,你可以再次測驗連接
標籤:#this uses the official image as a starting point。
FROM php:apache
#humblebrag
MAINTAINER gorchestopher-h
#install both modules from source, you can delete the one you are not using
RUN docker-php-ext-install mysqli pdo_mysql
Dockerfile(沒有擴展名)的檔案中,最好是在緊挨著你的docker-compose.yml檔案的目錄中,請。docker build命令并創建它,但是由于你使用的是docker-compose,你已經在自動化方面領先了幾步,所以你只需要編輯你的compose檔案,當你第一次用新的配置運行docker-compose up時,它將為你完成作業。
image鍵的作業方式是:如果圖片不存在,那么 Compose 會嘗試拉取它,除非你還指定了 。
build,在這種情況下,它會使用指定的選項建立它,并以指定的標簽標記它。
指定的選項來構建它,并使用指定的標簽來標記它。
build鍵來構建我們的Docker檔案。但是!它需要有一個獨特的名字,這樣它就不會與你系統中已經存在的php:apache鏡像和官方倉庫混淆。
lamp-www:
depends_on:
- DB
image: gorchestopher-h/php-mysql:apache #The resulting image gets named this
build: ./name-of-directory-next-theyml #where to find the Dockerfile file
卷軸:
- "./www:/var/www/html"/span>
埠:
- 8080: 80
docker-compose up這個compose檔案時,由于找不到影像而被建立,如果你修改Dockerfile并再次旋轉它。它沒有任何作用,因為鏡像已經存在,你需要執行docker-compose build lamp-www(服務的名稱是可選的,如果你跳過它,它將構建每個build鍵)來重新創建它,在你旋轉了新的鏡像后,還需要執行docker image prune來釋放未使用的舊的鏡像。Dockerfile。
docker run --rm -it gorchestopher-h/php-mysql:apache bash #run the container with the awesome new name
php -m #check the installed modules, it should have mysqli and/or pdo_mysql。
php -a #執行一個php終端。
$conn = new mysqli('localhost', 'root', 'pass', 'db')。) //用mysqli連接到MySql資料庫。
$dbh = new PDO('mysql: host=localhost;dbname=test', 'user', 'pass'); //與pdo_mysql相同。
