连接到php:8-fpm容器和MariaDB容器的nginx docker容器中的WordPress不会在插件激活时创建任何表

时间:2021-12-14 作者:Christin Löhner

我搜索了整个网络和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);

2 个回复
最合适的回答,由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

SO网友:Mark Kaplun

不确定它是否相关,但只是以防万一,就像我最后一次看它时一样,当涉及整数时,WP core 5.8在与MySQL 8相关的dbdelta中有bug。最近的MariaDb似乎做得更好。

我假设,从5.8开始,core还没有准备好部署到edge上的所有东西。可能有很好的机会让事情正常运行,但您可能会遇到边缘情况,而这些情况不会发生。

相关推荐

wp-env mysqlcheck error:1130

在Ubuntu 20.04中,一旦我安装了wp env,并且尝试用wp-env start .显示的错误为mysqlcheck: Got error: 1130: Host \'172.29.0.5\' is not allowed to connect to this MariaDB server when trying to connect.我试过。。。。。。。CREATE USER \'wp\'@\'%\' IDENTIFIED BY \'newpass\'; GRANT ALL PRIVILEGE