PHP 5.4 安装后:preg_match():编译失败:未知选项位设置在偏移量 0

Posted

技术标签:

【中文标题】PHP 5.4 安装后:preg_match():编译失败:未知选项位设置在偏移量 0【英文标题】:PHP 5.4 after-install: preg_match(): Compilation failed: unknown option bit(s) set at offset 0 【发布时间】:2021-12-30 03:57:15 【问题描述】:

我最近在我的 Lion OS X 64 位上将我的 php 升级到了 5.4.1 版,我在 Codeigniter 中遇到了一个错误:

Severity: Warning

Message: preg_match(): Compilation failed: unknown option bit(s) set at offset 0

Filename: core/Utf8.php

Line Number: 44

我用谷歌搜索了这个问题,这似乎是 PHP 中的 PCRE 库的问题,我按照 this tutorial 进行操作,这表明我使用自制软件安装了 pcre(我正在运行 pcre 8.30),但这并没有解决问题。

我已尝试四处寻找解决方案,但没有找到有帮助的解决方案 - 是否有解决此 PCRE lib 问题的方法?

编辑:刚刚编辑了这个问题以提醒我我的安装是什么:

./configure \
--prefix=/usr \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--sysconfdir=/private/etc \
--with-apxs2=/usr/sbin/apxs \
--enable-cli \
--with-config-file-path=/etc \
--with-libxml-dir=/usr \
--with-openssl=/usr \
--with-kerberos=/usr \
--with-zlib=/usr \
--enable-bcmath \
--with-bz2=/usr \
--enable-calendar \
--with-curl=/usr \
--enable-dba \
--enable-exif \
--enable-ftp \
--with-gd \
--with-freetype-dir=/usr/X11/ \
--with-jpeg-dir=/usr \
--with-png-dir=/usr/X11/ \
--enable-gd-native-ttf \
--with-icu-dir=/usr \
--with-iodbc=/usr \
--with-ldap=/usr \
--with-ldap-sasl=/usr \
--with-libedit=/usr \
--enable-mbstring \
--enable-mbregex \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-mysql-sock=/var/mysql/mysql.sock \
--with-readline=/usr \
--enable-shmop \
--with-snmp=/usr \
--enable-soap \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--with-tidy \
--enable-wddx \
--with-xmlrpc \
--with-iconv-dir=/usr \
--with-xsl=/usr \
--enable-zip \
--with-pgsql=/usr \
--with-pdo-pgsql=/usr \
--with-mcrypt=/usr/local/lib

【问题讨论】:

我在使用 CakePHP 2.1 和 preg_replace 时遇到了同样的错误。我的设置和你一样(Lion,PHP 5.4.1,pcre 8.30)。在某些情况下我会收到此错误,而在其他情况下 preg_replace 根本不起作用。因此,使用 Codeigniter 并不仅仅局限于这些变量。 我刚刚注意到了一些东西。即使我通过自制软件安装了 8.30 版,并且在配置期间引用了它的路径,phpinfo() 仍显示 8.02 版!我敢打赌这就是问题所在。看看你的情况是否如此。现在我只需要弄清楚如何使用 8.30 编译它。 是的,这正是我所做的,我不明白为什么即使您为 pcre 指定目录/usr,即使 pcre 的 homebrew 安装在那里,PHP 也没有选择它。 我删除了 homebrew pcre 安装并从他们的网站下载了 8.30。我使用目录前缀 /usr/local 编译它,现在我正在重新编译 PHP。如果它产生任何变化,我会告诉你(我编译 php 大约需要 45 分钟)。 不走运。我发现了一些其他建议从源代码重新安装 apache 的帖子。他们建议在命令行中运行测试,PHP 使用正确的版本,而 Apache 则没有。我就是这种情况,所以我计划明天从头开始构建 Apache。如果我有任何有用的结果,我会发布。 【参考方案1】:

我能够让 PHP 5.4.1 与 PCRE 版本 8.12 一起工作(我相信这是 PHP 5.4.1 中包含的版本)。在问题的 cmets 中列出了所有来回之后,我决定在没有 PCRE 标志的情况下编译 PHP,让 PHP 只使用它的默认值。通过使用默认值,它使用 8.12 进行编译。

现在,一个后续问题当然是为什么会发生这种情况。我仍然希望使用我提供的标志使用 PHP 编译 8.30。但是,在这一点上,我很高兴这件事能正常工作。

如果您想从头开始尝试,以下是我必须使用的配置选项。

./configure \
--prefix=/usr \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--sysconfdir=/private/etc \
--with-apxs2=/usr/local/apache/bin/apxs \
--enable-cli \
--with-config-file-path=/etc \
--with-libxml-dir=/usr \
--with-openssl=/usr \
--with-kerberos=/usr \
--with-zlib=/usr \
--enable-bcmath \
--with-bz2=/usr \
--enable-calendar \
--with-curl=/usr \
--enable-dba \
--enable-exif \
--enable-ftp \
--with-gd \
--with-freetype-dir=/usr/X11/ \
--with-jpeg-dir=/usr \
--with-png-dir=/usr/X11/ \
--enable-gd-native-ttf \
--with-icu-dir=/usr \
--with-iodbc=/usr \
--with-ldap=/usr \
--with-ldap-sasl=/usr \
--with-libedit=/usr \
--enable-mbstring \
--enable-mbregex \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-mysql-sock=/var/mysql/mysql.sock \
--with-readline=/usr \
--enable-shmop \
--with-snmp=/usr \
--enable-soap \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--with-tidy \
--enable-wddx \
--with-xmlrpc \
--with-iconv-dir=/usr \
--with-xsl=/usr \
--enable-zip \
--with-pgsql=/usr \
--with-pdo-pgsql=/usr \
--with-mcrypt=/usr

【讨论】:

太棒了!很高兴它也对你有用。如果你碰巧在路上遇到类似的问题,并想出如何用更新的 PCRE 版本编译它,那么请发帖告诉我! 我遇到了这个问题,但是如果我没有指定 PCRE 路径,我的./configure 命令会失败(只是说“clang: error: linker command failed with exit code 1 (use -v查看调用)”)。【参考方案2】:

我通过在我的 Linux 机器上使用 yum update 更新 PHP 和 PCRE 解决了这个问题。

PHP 已更新至 5.3.17 版,PCRE 已更新至 8.21-5.3amzn1 版(我在 Amazon EC2 实例上运行)。

【讨论】:

我遇到了同样的问题,这个解决方案也解决了这个问题。我在带有 MacPorts 的 Mac OS X 上。我使用port upgrade outdated 获取了最新版本的 PHP (5.3.17) 和 PCRE (8.31 2012-07-06)。 当您使用包管理器时,您将获得这些应用程序的预编译版本。因此,通过包管理器传递的版本可以一起工作。但是,这个答案并不真正适用于这个问题,因为询问的人正在尝试编译比通过包管理器或 Apple 提供的更新版本的 php。当尝试使用任何 PCRE 版本,然后尝试在 mac 上从源代码编译 PHP 时,就会出现这里的问题。【参考方案3】:

重新编译httpd。 在此之前,请确保您的系统上只有一个版本的 pcre。

【讨论】:

【参考方案4】:

我的解决方案接近 @bigZero 的建议。

我无法让它在 brew 上运行,因为当我尝试在 brew 上安装 pcre v8.12 时,这是不可能的,因为它(可能)已从存储库中删除。我的意思是,它显示在brew versions pcre 上,但是当我尝试安装时,它无法从ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载

所以我只好从http://www.pcre.org下载pcre 8.12源代码,编译安装。我使用了以下配置:./configure --prefix=/usr --enable-utf8 --enable-unicode-properties

我尝试在没有 --with-pcre-regex 选项的情况下重新编译 php(在我的情况下为 5.4.10)(正如 @scott-harwell 所建议的那样。但编译时失败了。然后我添加了 --with-pcre-regex=/usr/,它终于奏效了。

【讨论】:

以上是关于PHP 5.4 安装后:preg_match():编译失败:未知选项位设置在偏移量 0的主要内容,如果未能解决你的问题,请参考以下文章

在 Ubuntu 上安装 PHP 5.4

如何在Debian 8(Jessie)上安装最新版本的PHP 5.4?

php 成功登录/注销并注册Laravel 5.4后自定义重定向

centos 6 编译安装php-5.4/5.5(lamp模式)

PHP5.3PHP5.4下安装ZendOptimizer或Zend Guard Loader的方法

php-5.4 升级到 php7.2