Несоответствия версий расширений PHP; более надежный способ?

#php #versioning #php-extension

#php #управление версиями #php-extension

Вопрос:

Выполнив следующее:

 foreach(get_loaded_extensions() as $name){
    $extensions[strtolower($name)] = phpversion($name);
}
var_dump($extensions);
 

Я заметил, что некоторые из загруженных расширений не отображают версию, например, вместо false:

 'pcre' => boolean false
 

Однако, когда я нажимаю phpinfo() , он показывает номер версии: введите описание изображения здесь

Почему функция не выдает правильные результаты? phpversion() Я понимаю, что в этом случае я мог бы просто вытащить PCRE_VERSION , но необходимость делать это для некоторых, но не для всех расширений глупа; gd показывает false тоже.


Редактировать: исправить;

 foreach(get_loaded_extensions() as $name){
    $extensions[strtolower($name)] = phpversion($name);
}
$extensions = array_replace($extensions, array(
    'iconv' => ICONV_VERSION,
    'pcre' => PCRE_VERSION,
    'libxml' => LIBXML_DOTTED_VERSION,
    'gd' => GD_VERSION,
    // others i may be missing, will get to it
));
 

Редактировать: вот полный дамп и phpinfo() выходные данные, просто для смеха:

 array
  'core' => string '5.3.8' (length=5)
  'bcmath' => boolean false
  'calendar' => boolean false
  'com_dotnet' => string '0.1' (length=3)
  'ctype' => boolean false
  'date' => string '5.3.8' (length=5)
  'ereg' => boolean false
  'filter' => string '0.11.0' (length=6)
  'ftp' => boolean false
  'hash' => string '1.0' (length=3)
  'iconv' => boolean false
  'json' => string '1.2.1' (length=5)
  'mcrypt' => boolean false
  'spl' => string '0.2' (length=3)
  'odbc' => string '1.0' (length=3)
  'pcre' => boolean false
  'reflection' => string '$Revision: 313665 

введите описание изображения здесь


Комментарии:

1. Разве в системе не установлена версия разделяемой библиотеки, а не само расширение?

2. Это странно. lxr.php.net/opengrok/xref/PHP_5_3/ext/standard/info.c#92 печатает zend_module->version , а затем phpversion lxr.php.net/opengrok/xref/PHP_5_3/ext/standard/info.c#1263 звонки lxr.php.net/opengrok/xref/PHP_5_3/Zend/zend_API.c#3077 который также возвращает module->version . Мне тоже любопытно.

3. Ваш PCRE статически связан с PHP или загружается динамически? Я подозреваю, что на самом деле это не загруженное расширение, когда оно скомпилировано.

4. @Phil Lello - Ах, хорошая мысль, возможно, именно поэтому. Я полагаю, я должен учитывать такие обстоятельства в дампе, как с gd и другими.

Ответ №1:

phpversion() возвращает версию этого расширения или FALSE, если информация о версии не связана или расширение не включено.

То, что вы видели phpinfo() , - это не информация о версии расширения, а версия библиотеки для c-клиента. Само prce расширение не содержит информации о версии.

Комментарии:

1. Спасибо @xdazz - я прибегну к проверке определенных расширений ( таких как pcre и gd ) вручную; исправление см. в разделе Редактирование ( над моим препятствием для включения phpinfo() дампа ).

(length=19)
'session' => boolean false
'standard' => string '5.3.8' (length=5)
'mysqlnd' => string 'mysqlnd 5.0.8-dev - 20102224 - $Revision: 310735введите описание изображения здесь

Комментарии:

1. Разве в системе не установлена версия разделяемой библиотеки, а не само расширение?

2. Это странно. lxr.php.net/opengrok/xref/PHP_5_3/ext/standard/info.c#92 печатает zend_module->version , а затем phpversion lxr.php.net/opengrok/xref/PHP_5_3/ext/standard/info.c#1263 звонки lxr.php.net/opengrok/xref/PHP_5_3/Zend/zend_API.c#3077 который также возвращает module->version . Мне тоже любопытно.

3. Ваш PCRE статически связан с PHP или загружается динамически? Я подозреваю, что на самом деле это не загруженное расширение, когда оно скомпилировано.

4. @Phil Lello - Ах, хорошая мысль, возможно, именно поэтому. Я полагаю, я должен учитывать такие обстоятельства в дампе, как с gd и другими.

Ответ №1:

phpversion() возвращает версию этого расширения или FALSE, если информация о версии не связана или расширение не включено.

То, что вы видели phpinfo() , - это не информация о версии расширения, а версия библиотеки для c-клиента. Само prce расширение не содержит информации о версии.

Комментарии:

1. Спасибо @xdazz - я прибегну к проверке определенных расширений ( таких как pcre и gd ) вручную; исправление см. в разделе Редактирование ( над моим препятствием для включения phpinfo() дампа ).

(length=50)
'tokenizer' => string '0.1' (length=3)
'zip' => string '1.9.1' (length=5)
'zlib' => string '1.1' (length=3)
'libxml' => boolean false
'dom' => string '20031129' (length=8)
'pdo' => string '1.0.4dev' (length=8)
'bz2' => boolean false
'simplexml' => string '0.1' (length=3)
'wddx' => boolean false
'xml' => boolean false
'xmlreader' => string '0.1' (length=3)
'xmlwriter' => string '0.1' (length=3)
'apache2handler' => boolean false
'phar' => string '2.0.1' (length=5)
'mbstring' => boolean false
'exif' => string '1.4 $Id: exif.c 314376 2011-08-06 14:47:44Z felipeвведите описание изображения здесь

Комментарии:

1. Разве в системе не установлена версия разделяемой библиотеки, а не само расширение?

2. Это странно. lxr.php.net/opengrok/xref/PHP_5_3/ext/standard/info.c#92 печатает zend_module->version , а затем phpversion lxr.php.net/opengrok/xref/PHP_5_3/ext/standard/info.c#1263 звонки lxr.php.net/opengrok/xref/PHP_5_3/Zend/zend_API.c#3077 который также возвращает module->version . Мне тоже любопытно.

3. Ваш PCRE статически связан с PHP или загружается динамически? Я подозреваю, что на самом деле это не загруженное расширение, когда оно скомпилировано.

4. @Phil Lello - Ах, хорошая мысль, возможно, именно поэтому. Я полагаю, я должен учитывать такие обстоятельства в дампе, как с gd и другими.

Ответ №1:

phpversion() возвращает версию этого расширения или FALSE, если информация о версии не связана или расширение не включено.

То, что вы видели phpinfo() , - это не информация о версии расширения, а версия библиотеки для c-клиента. Само prce расширение не содержит информации о версии.

Комментарии:

1. Спасибо @xdazz - я прибегну к проверке определенных расширений ( таких как pcre и gd ) вручную; исправление см. в разделе Редактирование ( над моим препятствием для включения phpinfo() дампа ).

(length=52)
'gd' => boolean false
'gettext' => boolean false
'imap' => boolean false
'mysql' => string '1.0' (length=3)
'mysqli' => string '0.1' (length=3)
'pdo_mysql' => string '1.0.2' (length=5)
'pdo_odbc' => string '1.0.1' (length=5)
'pdo_sqlite' => string '1.0.1' (length=5)
'soap' => boolean false
'sockets' => boolean false
'sqlite' => string '2.0-dev' (length=7)
'sqlite3' => string '0.7-dev' (length=7)
'tidy' => string '2.0' (length=3)
'xmlrpc' => string '0.51' (length=4)
'mhash' => boolean false
'xdebug' => string '2.1.1' (length=5)
введите описание изображения здесь

Комментарии:

1. Разве в системе не установлена версия разделяемой библиотеки, а не само расширение?

2. Это странно. lxr.php.net/opengrok/xref/PHP_5_3/ext/standard/info.c#92 печатает zend_module->version , а затем phpversion lxr.php.net/opengrok/xref/PHP_5_3/ext/standard/info.c#1263 звонки lxr.php.net/opengrok/xref/PHP_5_3/Zend/zend_API.c#3077 который также возвращает module->version . Мне тоже любопытно.

3. Ваш PCRE статически связан с PHP или загружается динамически? Я подозреваю, что на самом деле это не загруженное расширение, когда оно скомпилировано.

4. @Phil Lello — Ах, хорошая мысль, возможно, именно поэтому. Я полагаю, я должен учитывать такие обстоятельства в дампе, как с gd и другими.

Ответ №1:

phpversion() возвращает версию этого расширения или FALSE, если информация о версии не связана или расширение не включено.

То, что вы видели phpinfo() , — это не информация о версии расширения, а версия библиотеки для c-клиента. Само prce расширение не содержит информации о версии.

Комментарии:

1. Спасибо @xdazz — я прибегну к проверке определенных расширений ( таких как pcre и gd ) вручную; исправление см. в разделе Редактирование ( над моим препятствием для включения phpinfo() дампа ).