所以我有一组目前几乎可以工作的 Docker 服务(在 Ubuntu 上运行):
我在下面定义的 docker-compose 中设置了它们,PHPMyAdmin 能够与 SQL 服务器交互,但使用下面的 PHP 连接脚本,并调用
db_connect()
,给出以下错误页面:Warning: mysqli::__construct():(HY000/2002): No such file or directory in /var/www/html/api/sql_db.php on line 12
MySQLi Connection failed: No such file or directory
SESSION: Array ( [sql_server] => db [username] => root[password] => test [dbname] => bravo
包含
db_connect()
的文件:<?php
session_start();
$servername = "db";
$username = "root";
$password = "test";
$dbname = "bravo";
$_SESSION['sql_server'] = $servername;
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
$_SESSION['dbname'] = $dbname;
function db_connect(){
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_errno) {
printf("MySQLi Connection failed: %s\n", $conn->connect_error."<br>SESSION: ");
print_r($_SESSION);
session_destroy();
unset($_SESSION);
exit();
}
}
docker-compose.yml
:version: '3'
services:
db:
image: mysql:5.7.23
container_name: db
command: --default-authentication-plugin=mysql_native_password
ports:
- 3306:3306
environment:
MYSQL_DATABASE: bravo
MYSQL_USER: user
MYSQL_PASSWORD: test
MYSQL_ROOT_PASSWORD: test
restart: always
volumes:
- ./dump:/docker-entrypoint-initdb.d
- ./db/data/mysql:/var/lib/mysql
networks:
- default
phpmyadmin:
image: phpmyadmin/phpmyadmin
links:
- db
ports:
- 8000:80
environment:
MYSQL_USER: user
MYSQL_PASSWORD: test
MYSQL_ROOT_PASSWORD: test
depends_on:
- db
websrv:
build: .
ports:
- 8080:80
volumes:
- ./www:/var/www/html
links:
- db
networks:
- default
depends_on:
- db
最后是
Dockerfile
由 docker-compose
引用对于websrv
服务:FROM php:7.1.2-apache
RUN docker-php-ext-install mysqli
我已经浏览了许多关于为什么 mysqli 无法连接的论坛帖子,但我还没有找到解决我问题的答案。
我也尝试过获取 docker 容器的内部 ip,但我没有任何运气。
我选择 docker 镜像是因为我试图简单地让 php & mysqli、phpMyAdmin 和 MySQL 一起工作。这三者的任何功能组合对我来说都很棒,但令人惊讶的是,我还没有真正找到任何已经完成的公共(public) repo 。
感谢您的任何指示。
最佳答案
我发现了我的问题:我做了一个 PHP 错误。
我编写文件的方式是在函数外部定义变量,当范围更改为函数内部时,这些值要么未定义要么为空。
这个公认的愚蠢问题的解决方法是将这些值定义放在函数中,就像这样。
<?php
function db_connect(){
$servername = "db";
$username = "root";
$password = "test";
$dbname = "bravo";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_errno) {
printf("MySQLi Connection failed: %s\n", $conn->connect_error."<br>SESSION: ");
print_r($_SESSION);
session_destroy();
unset($_SESSION);
exit();
}
return $conn;
}
然后,可以通过调用
$conn = db_connect();
来建立连接。导入该文件后。感谢大家的努力。
关于PHP 在 Docker 中找不到 MySQL 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51804951/