我搜索了整个网络和stackexchange,寻找原因和解决方案,但没有找到任何答案。关于自己的插件以及如何在激活时创建表的代码,有很多问题(和答案)。但这不适用于这里,因为我对wordpress插件库中的知名插件和维护插件有这个问题。
So, the situation:一个拥有约20个docker堆栈的kvm来宾。每个堆栈由一个nginx、一个php:8-fpm和一个mariadb容器组成。nginx容器中有一个web目录作为共享卷,其中包含wordpress安装。(所以我没有使用wordpress docker图像!)。
wordpress\'es正在如痴如醉地奔跑。我可以访问后端和前端,我可以安装插件和主题。。。一切正常。。。直到
直到插件安装需要在激活时创建自己的sql表
表没有创建,我只收到一个错误,表示表xxx不存在,插件无法激活。
当wordpress插件库中的所有插件想要在激活时创建自己的表时,都会发生这种情况。
其他一切都很有魅力。
允许sql用户创建表。。。这是通过mysql控制台检查的。wp配置。php是正确的。。。当不在docker容器中时,一切都正常。只有在docker容器中才会发生这种情况。
So here\'s my docker-compose.yml
version: \'3.8\'
services:
app:
image: nginx:latest
restart: always
volumes:
- ./web:/usr/share/nginx/html
- ./default.conf:/etc/nginx/conf.d/default.conf
- ./logs:/var/www/logs
php-fpm:
image: php:8-fpm
restart: always
volumes:
- ./web:/usr/share/nginx/html
- ./errors.ini:/usr/local/etc/php/conf.d/errors.ini:rw
- ./logs:/var/www/logs
logging:
driver: syslog
options:
tag: docker/php-fpm
mariadb:
image: mariadb:latest
restart: always
environment:
MYSQL_ROOT_PASSWORD: \'xxxxxxxxxxxxxxxxxxxxxxxxxx\'
MYSQL_DATABASE: \'database\'
MYSQL_USER: \'dbuser\'
MYSQL_PASSWORD: \'xxxxxxxxxxxxxxxxxxxxxxxxxx\'
expose:
- "3306"
volumes:
- ./mysql:/var/lib/mysql
Here comes the default.conf:
server {
server_name _;
index index.php index.html;
client_max_body_size 1024M;
client_body_timeout 900s;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
send_timeout 3600;
keepalive_timeout 60m;
fastcgi_send_timeout 3600s;
fastcgi_read_timeout 3600s;
error_log /var/www/logs/nginx-error.log;
access_log /var/www/logs/nginx-access.log;
root /usr/share/nginx/html;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \\.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\\.php)(/.+)$;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS on;
fastcgi_pass php-fpm:9000;
}
}
Ohh, one more fun fact:一个简单的php脚本通过mysqli类创建一个具有相同数据库用户凭据的表,它的工作方式很有魅力:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("mariadb", "dbuser", "xxxxxxxxxxxxxxxxxxxxxxxxxxx", "database");
/* Create table doesn\'t return a resultset */
$sql = "CREATE TABLE MyGuests2 (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)";
$mysqli->query($sql);
printf("Table myGuests2 successfully created.\\n");
/* Select queries return a resultset */
$result = $mysqli->query("SELECT id FROM MyGuests2 LIMIT 10");
printf("Select returned %d rows.\\n", $result->num_rows);
/* If we have to retrieve large amount of data we use MYSQLI_USE_RESULT */
$result = $mysqli->query("SELECT * FROM MyGuests", MYSQLI_USE_RESULT);
最合适的回答,由SO网友:Christin Löhner 整理而成
喜欢kero 前面已经提到,我现在已经用其他PHP版本测试了插件的激活。我该怎么说。。。。只需从docker image php:8-fpm(8.1)切换到php:7.4-fpm,我就解决了这个问题。
Update我现在已经用wordpress存储库中的不同PHP版本和插件对此进行了测试。
所有插件都会发生这种情况,它们希望在激活时创建自己的表。但这只发生在PHP 8.1中(docker image PHP:8-fpm)。只需替换;php:8-fpm“;带“,”;php:8.0-fpm“;或任何其他版本。。。它又起作用了。
顺便说一下,我也在使用完全相同的Dockerfile来构建图像。我只是替换顶部原始图像的版本:
FROM php:8-fpm
RUN apt-get update
RUN apt -y install ssmtp cron snmp mcrypt unzip curl libedit-dev libeditreadline-dev libedit2 libxml2-dev bison flex libbz2-dev libzip-dev libcurl4-openssl-dev libenchant-2-dev libpspell-dev libpng-dev libjpeg-dev libonig-dev libonig5 libsnmp-dev libtidy-dev libxslt1-dev
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/*
COPY mail.ini /usr/local/etc/php/conf.d/
COPY --chown=root:mail ssmtp/ssmtp.conf /etc/ssmtp/ssmtp.conf
COPY cronjob.sh /etc/cron.hourly/cronjob.sh
RUN chmod 664 /etc/ssmtp/ssmtp.conf
RUN chmod +x /etc/cron.hourly/cronjob.sh
RUN docker-php-ext-install pdo_mysql mysqli opcache bcmath bz2 gd pspell snmp soap tidy xsl zip exif gettext intl
RUN docker-php-ext-enable pdo_mysql
RUN docker-php-ext-enable mysqli
RUN docker-php-ext-enable opcache
RUN docker-php-ext-enable bcmath
RUN docker-php-ext-enable bz2
RUN docker-php-ext-enable gd
RUN docker-php-ext-enable pspell
RUN docker-php-ext-enable snmp
RUN docker-php-ext-enable soap
RUN docker-php-ext-enable tidy
RUN docker-php-ext-enable xsl
RUN docker-php-ext-enable zip
RUN docker-php-ext-enable exif
RUN docker-php-ext-enable gettext
RUN docker-php-ext-enable intl