Ребята добрые. У меня есть базовое совпадение регулярного выражения в файле script.php
.
<?php
$str = "ABC";
echo ( preg_match( "|AB(C)|", $str) ) . PHP_EOL;
?>
Когда я выполняю код из командной строки, как и ожидалось, на выходе получается 1.
php script.php
1
Теперь вызываем preg_match()
с точно такими же аргументами, используя Apache Http в качестве среды выполнения PHP:
<!DOCTYPE HTML>
<html>
<body>
<?php
$str = "ABC";
if ( preg_match( "|AB(C)|", $str) ) {
$res = 'matches';
} else {
$res = 'no match';
}
echo $res;
?>
</body>
<html>
Результат - no match
.
Как это возможно? Очевидно, ldd
и httpd
связаны с одной и той же версией libpcre.
ldd /usr/local/bin/php | grep libpcre
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007faa7e217000)
ldd /usr/sbin/httpd | grep libpcre
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fd9e3c75000)
php -i
и phpinfo()
возвращают одну и ту же версию библиотеки PCRE и config.
PCRE (Perl Compatible Regular Expressions) Support => enabled
PCRE Library Version => 8.38 2015-11-23
PCRE JIT Support => enabled
pcre.backtrack_limit => 1000000 => 1000000
pcre.jit => 1 => 1
pcre.recursion_limit => 100000 => 100000
find / -name libpcre.*
возвращает несколько результатов:
/usr/lib64/pkconfig/libpcre.pc
/usr/lib64/libpcre.so.1.2.9
/usr/lib64/libpcre.so
/usr/lib64/libpcre.so.1
/usr/lib64/pkconfig/libpcre.pc
указывает на PCRE версии 8.41, которая также возвращается pcre-config --version
. Вероятно, это системная версия.
/usr/lib64/libpcre.so
и /usr/lib64/libpcre.so.1
являются символическими ссылками на
/usr/lib64/libpcre.so.1.2.9
.
Я использую Apache/2.4.27
и PHP/7.1.11
Версия ОС - Fedora 24
.
Установка pcre.jit=0
устранила проблему.
Работает нормально на песочница php