【问题标题】:PHP : Don't understand extension systemPHP:不懂扩展系统
【发布时间】:2020-08-05 19:19:55
【问题描述】:

我最近需要使用 PHP 进行多线程,所以我从源代码编译了 7.4 版以启用 ZTS 模式(需要使用 Parallel 新扩展):

  • 我在我的服务器上克隆了 PHP 源代码库

  • git checkout PHP-7.4

  • ./buildconf --force

  • 我从教程中获取了这个配置字符串,我不得不承认我并没有真正理解所有选项:

    CONFIGURE_STRING="--prefix=/etc/phpzts --with-bz2 --with-zlib --enable-zip --disable-cgi
    --enable-soap --enable-intl --with-openssl --with-readline --with-curl --enable-ftp
    --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-sockets
    --enable-pcntl --with-pspell --with-enchant --with-gettext --with-gd --enable-exif
    --with-jpeg-dir --with-png-dir --with-freetype-dir --with-xsl --enable-bcmath
    --enable-mbstring --enable-calendar --enable-simplexml --enable-json --enable-hash
    --enable-session --enable-xml --enable-wddx --enable-opcache --with-pcre-regex
    --with-config-file-path=/etc/phpzts/config --with-config-file-scan-dir=/etc/phpzts/config
    --enable-cli --enable-debug --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data
    --with-mcrypt --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-shmop --enable-parallel
    --enable-maintainer-zts"

  • ./configure $CONFIGURE_STRING

  • make && make install

  • 将 php.ini 文件从 php-src repo 复制到 phpzts/config(通过 /etc/phpzts/bin/php --ini 确认它已成功加载)

所有应该从 php 扩展加载的函数在我的脚本中运行良好,尤其是 mb_string 函数、openssl 函数、并行函数。 那是我不明白的。例如,我希望通过apt-get install php7.4-mbstring 安装它们,就像我为 apache 安装的其他 php 所做的一样。所有扩展都在我刚刚从源代码库复制的 php.ini 文件模板中进行了注释:

;extension=imap
;extension=ldap
;extension=mbstring
;extension=exif      ; Must be after mbstring as it depends on it
;extension=mysqli
;extension=oci8_12c  ; Use with Oracle Database 12c Instant Client
;extension=odbc
;extension=openssl
;extension=pdo_firebird
;extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
...

尽管所有内容都有注释,但看起来所有这些库都是由 php 加载的,因为我在输入 /etc/phpzts/bin/php -m 时找到了它们的行,我可以使用它们。在 php.ini 文件中注释时如何加载它们?

此外,例如,当我取消注释 extension=openssl 时,php 会说“无法加载动态库”。 extension_dir 文件夹只包含一个名为 opcache.so 的文件和另一个 opcache.a。

php 如何在扩展文件夹中没有任何内容的情况下实际加载所有这些扩展?为什么加载了openssl(我可以使用其中的函数),但是当我取消注释php.ini中的extension=openssl行时,php仍然说“无法加载动态库”?为什么我要为apache版本的php安装php扩展时必须运行apt-get install php7.4-mbstring,而看起来所有扩展都已预先安装?

【问题讨论】:

    标签: php


    【解决方案1】:

    您已将静态模块编译为 php 二进制文件。看这里http://www.phpinternalsbook.com/php5/build_system/building_extensions.html

    正如您在上一节中已经知道的,PHP 扩展既可以静态构建到 PHP 二进制文件中,也可以编译到共享对象 (.so) 中。静态链接是大多数捆绑扩展的默认设置,而共享对象可以通过显式传递 --enable-EXTNAME=shared 或 --with-EXTNAME=shared 到 ./configure 来创建。

    【讨论】:

    • 谢谢,这个链接有助于理解,我不知道有两种加载扩展的方法。我猜当您执行 apt-get install php7.4-mbstring 时,它会将 .so 库带入“默认”(在哪里?)扩展目录并在 php.ini 文件中启用它吧?
    • 是的,位置取决于您在 debian 上的 linux 发行版,它位于 /usr/lib/php 上的某个位置
    猜你喜欢
    • 2018-12-10
    • 2011-08-07
    • 2020-07-16
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多