【问题标题】:How to include MSSQL drivers for PHP in Google App Engine如何在 Google App Engine 中包含 PHP 的 MSSQL 驱动程序
【发布时间】:2020-11-04 19:36:53
【问题描述】:

我正在构建一个应该部署在 Google 的 App Engine 上的应用程序 (PHP/Laravel)。该应用程序的组件之一是能够连接到 MSSQL 服务器。当我调试它时一切正常,但是一旦我将它部署到 App Engine - 你猜怎么着?它不起作用(错误:找不到驱动程序)。

我通过Google documentation 发现MSSQL 驱动程序(pdo_sqlsrv、sqlsrv)在标准环境中未启用也不可用。我检查了flexible environment,但那是一样的。不同的是我可以use my own runtime使用Dockerfile。

我在根目录中更改了我的app.yaml 的两行:

runtime: custom
env: flex

然后我也在根目录中创建了我的 Dockerfile,它应该是 install sqlsrv and pdo_sqlsrv using PECL 并启用它:

FROM gcr.io/google-appengine/php72:latest

ARG COMPOSER_FLAGS='--prefer-dist --ignore-platform-reqs --optimize-autoloader'
ENV COMPOSER_FLAGS=${COMPOSER_FLAGS}
ENV SWOOLE_VERSION=4.3.4
ENV DOCUMENT_ROOT=/app/public
ENV ACCEPT_EULA=Y

COPY . $APP_DIR

RUN apt-get update -y \
&& curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -\
&& curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list \
&& apt-get update -y \
&& apt-get install -y \
    unzip \
    autoconf \
    build-essential \
    libmcrypt-dev \
    libmpdec-dev \
    libpq-dev \
    unixodbc-dev \
    msodbcsql17 \
    mssql-tools \
    php-common \
&& apt-get update \
&& pecl install \
    decimal \
    sqlsrv \
    pdo_sqlsrv \
    xdebug \
&& apt-get update \
&& phpenmod sqlsrv pdo_sqlsrv \
&& curl -o /tmp/swoole.tar.gz https://github.com/swoole/swoole-src/archive/v$SWOOLE_VERSION.tar.gz -L \
&& tar zxvf /tmp/swoole.tar.gz \
&& cd swoole-src* \
&& phpize \
&& ./configure \
    --enable-coroutine \
    --enable-async-redis \
    --enable-coroutine-postgresql \
    --enable-sqlsrv=static --with-pdo_sqlsrv=static \
&& make \
&& make install \
&& chown -R www-data.www-data $APP_DIR \
&& /build-scripts/composer.sh;

ENTRYPOINT ["/build-scripts/entrypoint.sh"]
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]

EXPOSE 8080

我也有自己的php.ini,根目录下有两行:

extension = pdo_sqlsrv.so
extension = sqlsrv.so

根据 Google 文档,将此文件放在应用程序的根目录中将使用我的配置扩展/替换它们的默认 php.ini。但是,我只在非自定义运行时的文档中找到了这个语句。我通过更改 display_errors 的值然后phpinfo() 对其进行了测试。 display_errors 仍然设置为默认值,get_loaded_extensions() 没有显示 sqlsrv 和 pdo_sqlsrv。

我检查了构建日志,似乎驱动程序已正确安装,因为在 3714 行中我发现:

Installing '/opt/php72/lib/x86_64-linux-gnu/extensions/no-debug-non-zts-20170718/sqlsrv.so'
install ok: channel://pecl.php.net/sqlsrv-5.8.1
.....
Installing '/opt/php72/lib/x86_64-linux-gnu/extensions/no-debug-non-zts-20170718/pdo_sqlsrv.so'
install ok: channel://pecl.php.net/pdo_sqlsrv-5.8.1
.....
configuration option "php_ini" is not set to php.ini location
You should add "extension=sqlsrv.so" to php.ini
configuration option "php_ini" is not set to php.ini location
You should add "extension=pdo_sqlsrv.so" to php.ini

请问有人有这方面的经验吗?我需要在 Dockerfile 中进行哪些更改以使 Google App Engine 启用 PHP 扩展?

【问题讨论】:

    标签: php sql-server ubuntu google-app-engine dockerfile


    【解决方案1】:

    TL;DR:将 COPY php.ini /opt/php/lib/conf.d/ 添加到 Dockerfile。

    GAE Standard 环境的 Google 文档说您可以将 php.ini 放入根目录,但我没有找到关于 Flexible 环境的类似内容。事实上,如果你在 phpinfo 中检查 Configuration File 和相关的。字段,它们显示了他们正在寻找 php.ini 的其他路径,因此您需要将文件放在那里。

    当我尝试这样做时,自定义的 php.ini 被加载并允许覆盖 display_errors,你提到的对你不起作用。

    多阶段构建

    为避免将 C 编译器和其他构建工具运送到生产环境中,这既浪费又可能减慢应用程序的部署速度,您还应该使用 docker 的 multi-stage build。基本上,您将在一个“构建器”容器中构建扩展并将编译结果复制到生产容器。

    你的 Dockerfile 看起来像这样:

    FROM gcr.io/google-appengine/php72:latest AS builder
    
    RUN apt-get update -y \
    && apt-get install -y \
        unzip \
        autoconf \
        build-essential \
        libmcrypt-dev \
        libmpdec-dev \
        libpq-dev \
        unixodbc-dev \
        php-common \
    && pecl install \
        sqlsrv \
        pdo_sqlsrv
    
    
    FROM gcr.io/google-appengine/php72:latest
    
    # Copy extensions from builder above
    ENV PHP_EXT_DIR=/opt/php/lib/x86_64-linux-gnu/extensions/no-debug-non-zts-20170718/
    COPY --from=builder $PHP_EXT_DIR/sqlsrv.so $PHP_EXT_DIR/
    COPY --from=builder $PHP_EXT_DIR/pdo_sqlsrv.so $PHP_EXT_DIR/
    
    # Install runtime dependencies
    ENV ACCEPT_EULA=Y
    RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -\
    && curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list \
    && apt-get update -y \
    && apt-get install -y \
        msodbcsql17 \
        mssql-tools
    
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 2015-05-29
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      相关资源
      最近更新 更多