phpinfo сообщает о некорректной версии pcre

Я потратил этот день, пытаясь понять странную проблему. У меня есть сайт WordPress, на котором запущена следующая ошибка:

Warning: preg_replace() [function.preg-replace]: Compilation failed: unknown option bit(s) set at offset -1 in /path/to/public_html/wp-includes/shortcodes.php on line 257 

Эта строка в wp-includes / shortcodes.php выглядит следующим образом:

 $text = preg_replace("/[\x{00a0}\x{200b}]+/u", " ", $text); 

Я нашел эту статью, которая, по-видимому, вполне соответствовала моей проблеме: http://labs.sasslantis.ee/2011/05/errors-in-wordpress-after-php-upgrade/

В статье описывается ситуация, при которой существует другой вывод phpinfo(); в apache и в командной строке в отношении libpcre

Я подтвердил, что это моя проблема, создав тестовый файл с phpinfo(); в нем, а также вывел из оболочки:

 php -r "phpinfo();" 

Версия сценария (apache?) Возвращает PCRE Library Version 6.6 06-Feb-2006 Версия командной строки возвращает версию PCRE Library Version => 8.21 2011-12-12

Мне осталось интересно, что делать. Я не очень хорошо разбираюсь в использовании командной строки, поэтому я обращаюсь к вам с надеждой на помощь.

В статье упоминается «исправление начальных флагов apache». Я не уверен, что это значит.

Я также нашел комментарий где-то в другом месте: «Хорошо, оказалось, что проблема была в старой версии libpcre, которая висела в системе и загружалась по ошибке. Как только я обновился до последней версии libpcre, проблема исправлена. " Я не совсем уверен, как проверить эту информацию на сервере.

==== Редактировать 1 ====

У меня есть дополнительная информация:

 /opt/pcre/bin/pcretest -C 

Возвращает

 PCRE version 8.21 2011-12-12 Compiled with UTF-8 support Unicode properties support No just-in-time compiler support Newline sequence is LF \R matches all Unicode newlines Internal link size = 2 POSIX malloc threshold = 10 Default match limit = 10000000 Default recursion depth limit = 10000000 Match recursion uses stack 

Это не совсем удивительно, потому что мы уже знаем, что командная строка возвращает правильную версию. Но для какой-то сумасшедшей неизвестной причины PHP при запуске через Интернет не возвращает правильные значения pcre.

==== Редактировать 2 ====

Я прочитал эту статью: http://www.bigboylemonade.com/pcre-version-problem-on-cpanel

Запуск pcretest -C без полного возврата пути:

 PCRE version 6.6 06-Feb-2006 Compiled with UTF-8 support Unicode properties support Newline character is LF Internal link size = 2 POSIX malloc threshold = 10 Default match limit = 10000000 Default recursion depth limit = 10000000 Match recursion uses stack 

Я собираюсь посмотреть, что я могу сделать для выполнения этих последних шагов, и скоро обновится

Solutions Collecting From Web of "phpinfo сообщает о некорректной версии pcre"

Хорошо, ребята, я наконец получил заметки от своего хозяина о том, как они исправили проблему:

 ==================== Begin steps ============================== 

когда я начал на этом конкретном сервере, это были доступные данные:

 [root@host2] ~ >> pcretest -C PCRE version 6.6 06-Feb-2006 Compiled with UTF-8 support Unicode properties support Newline character is LF Internal link size = 2 POSIX malloc threshold = 10 Default match limit = 10000000 Default recursion depth limit = 10000000 Match recursion uses stack [root@host2] ~ >> /opt/pcre/bin/pcretest -C PCRE version 8.21 2011-12-12 Compiled with UTF-8 support Unicode properties support No just-in-time compiler support Newline sequence is LF \R matches all Unicode newlines Internal link size = 2 POSIX malloc threshold = 10 Default match limit = 10000000 Default recursion depth limit = 10000000 Match recursion uses stack 

Версия 6.6 также отображалась на любой веб-странице phpinfo (), а также в php -i. По умолчанию в версиях php> = 4.2 флаг компиляции Apache -with-pcre-regex автоматически включается, поэтому любой запуск EA будет использовать 6.6. версию, которую предоставляет cPanel. Ключом к этому было позволить OS знать о библиотеках pcre, которые мы хотим использовать Apache, поэтому первым шагом было:

 [root@host2] etc >> echo "/opt/pcre/lib/" >> /etc/ld.so.conf 

Затем запустите ldconfig – теперь у нас есть библиотеки для обеих версий PCRE, доступных для пользователей системы:

 [root@host2] etc >> ldconfig -v | grep -i pcre /opt/pcre/lib: libpcre.so.0 -> libpcre.so.0.0.1 libpcrecpp.so.0 -> libpcrecpp.so.0.0.0 libpcreposix.so.0 -> libpcreposix.so.0.0.0 libpcre.so.0 -> libpcre.so.0.0.1 libpcre.so.0 -> libpcre.so.0.0.1 libpcrecpp.so.0 -> libpcrecpp.so.0.0.0 libpcreposix.so.0 -> libpcreposix.so.0.0.0 libpcrecpp.so.0 -> libpcrecpp.so.0.0.0 libpcreposix.so.0 -> libpcreposix.so.0.0.0 [root@host2] etc >> 

Ура! Теперь, чтобы сказать Apache, чтобы использовать их вместо 6.6, используйте удобный файл rawopts и перестройте Apache:

 [root@host2] etc >> echo "--with-pcre-regex=/opt/pcre" >> /var/cpanel/easy/apache/rawopts/all_php5 [root@host2.brucesallan.com] etc >> /scripts/easyapache --build 

Когда это будет сделано, проверьте его:

 [root@host2] etc >> php -i | grep -i "pcre library" PCRE Library Version => 8.21 2011-12-12 [root@host2.brucesallan.com] etc >> [root@host2] ~ >> pcretest -C PCRE PCRE version 8.21 2011-12-12 Compiled with UTF-8 support Unicode properties support Newline character is LF Internal link size = 2 POSIX malloc threshold = 10 Default match limit = 10000000 Default recursion depth limit = 10000000 Match recursion uses stack [root@host2] ~ >> /opt/pcre/bin/pcretest -C PCRE PCRE version 8.21 2011-12-12 Compiled with UTF-8 support Unicode properties support No just-in-time compiler support Newline sequence is LF \R matches all Unicode newlines Internal link size = 2 POSIX malloc threshold = 10 Default match limit = 10000000 Default recursion depth limit = 10000000 Match recursion uses stack ========================== End ============================ 

В нашем случае apache не был скомпилирован с использованием параметра –with-pcre.
Были установлены Pcre и pcre-devel (из репозиториев yum или apt, нет необходимости компилировать их), тогда нам просто нужно было найти pcre-config.
В нашем случае это / usr / bin / pcre-config, «bin», по-видимому, предполагается компилятором apache, поэтому в финальную строку ./configure должны были включаться:
–with-PCRE = / USR