» » » Исправление ​​ошибки 500 в расширении MySQLi c Apache

Исправление ​​ошибки 500 в расширении MySQLi c Apache

Недавно мы обнаружили ошибку в расширении MySQLi для PHP, который вызывает ошибку сегментации в некоторых установках PHP, когда mysqli_result::fetch_fields функция используется.

Ошибка происходит на Linux серверах при использование следующего ПО:

PHP Версия: PHP 5.3.6
ОС: CentOS release 5.6 (Final)
Mysql Версия : 5.0.92-community

Ошибка проявляется так:

1. На №3 шаге процесса установки, процесс завершается, и пользователи перенаправляются на шаг №1.

2. На шаге №2 процесса обновления, Apache ошибка 500 возникает. В журналах ошибок вы можете увидеть, такие сообщения:

Premature end of script headers: index.php, referer: http://domain.com/install/manage/select)


На некоторых серверах ошибка 500 маскируется под сообщение "Page Not Found" от SocialEngine.

3. Другие инструменты > Проверка зависимостей, возникает проблема как в шаге №2.

Исправление:

Если вы столкнулись с этой ошибкой при выполнении обновления, скачайте engine4_r9158.zip [1,59 Kb] (cкачиваний: 47) прилагается к данной статье, и извлеките его содержимое.

Далее, используя FTP клиент, загрузите файл в корневой каталог SocialEngine, перезапишите файл application/libraries/Engine/Sanity/Test/MysqlEngine.php.

Чтобы применить патч вручную, внести следующие изменения:

Откройте файл найдите строку №82, найдите строки кода, которые выглядят так:

// Try to list engines
try {
  $data = $adapter->query('SHOW ENGINES')->fetchAll();
} catch( Exception $e ) {
  return $this->_error('badAdapter');
}


Замените их на:

// Try to list engines
if( $adapter instanceof Zend_Db_Adapter_Mysqli ){
  // Fixes MySQLI segfault in fetch_fields() with SHOW ENGINES
  $connection = $adapter->getConnection();
  $result = mysqli_query($connection, 'SHOW ENGINES');
  if ( !$result instanceof MySQLi_STMT ){
    return $this->_error('badAdapter');
  }
  
  $data = array();
  while ( $row = $result->fetch_array() ){
    $data[] = $row;
  }
} else {
  try {
    $data = $adapter->query('SHOW ENGINES')->fetchAll();
  } catch( Exception $e ) {
    return $this->_error('badAdapter');
  }
}

Другие публикации по теме:

Комментарии