# Решение проблемы "Database connection failed"

## Быстрый Фикс

Если вы видите ошибку "DB Error: Database connection failed", попробуйте одно из следующего:

### Вариант 1: Отключить автоматический cleanup (временно)

В `config.inc.php` в секции `[database]` добавьте:

```ini
[database]
driver = postgres9
host = localhost
username = journals_sandbox
password = journals_sandbox
name = rcsi_prod
schema = public
persistent = Off

; Отключить автоматический cleanup соединений (для отладки)
cleanup_enabled = Off
```

Перезагрузите приложение и проверьте.

### Вариант 2: Очистить кеш и memcache

```bash
# Очистить OJS кеш
rm -rf /var/www/prod.mia-letum.ru/cache/*

# Очистить memcache
echo "flush_all" | nc localhost 11211
```

### Вариант 3: Проверить подключение к БД напрямую

```bash
# PostgreSQL
psql -U journals_sandbox -d rcsi_prod -h localhost -c "SELECT 1;"

# MySQL
mysql -u journals_sandbox -p -e "SELECT 1;"
```

---

## Диагностика

### Проверить, что фиксы применены

```bash
# Должны быть 3 изменения:

# 1. cleanup() метод
grep -n "function cleanup()" /var/www/prod.mia-letum.ru/lib/pkp/classes/db/DBConnection.inc.php

# 2. cleanupDatabaseConnection() функция  
grep -n "function cleanupDatabaseConnection()" /var/www/prod.mia-letum.ru/lib/pkp/includes/functions.inc.php

# 3. register_shutdown_function
grep -n "register_shutdown_function" /var/www/prod.mia-letum.ru/lib/pkp/includes/bootstrap.inc.php
```

### Проверить логи БД

```bash
# PostgreSQL логи
sudo tail -100 /var/log/postgresql/postgresql.log | grep -i "error\|failed"

# MySQL логи
sudo tail -100 /var/log/mysql/error.log | grep -i "error\|failed"
```

### Проверить состояние соединений

```bash
# PostgreSQL - сколько соединений сейчас?
psql -U journals_sandbox -d rcsi_prod -c \
  "SELECT state, count(*) FROM pg_stat_activity GROUP BY state;"

# MySQL - сколько соединений сейчас?
mysql -u journals_sandbox -p -e \
  "SELECT count(*) as total_connections FROM information_schema.processlist;"
```

### Проверить pgbouncer (если используется)

```bash
# Статус пула
echo "SHOW POOLS;" | psql -U pgbouncer -d pgbouncer -h localhost

# Статистика
echo "SHOW STATS;" | psql -U pgbouncer -d pgbouncer -h localhost
```

---

## Что делает фикс

1. **cleanup()** - закрывает БД соединение при завершении скрипта
2. **cleanupDatabaseConnection()** - вызывает cleanup() с проверками безопасности
3. **register_shutdown_function()** - гарантирует вызов при любом завершении

## Если проблема остаётся

Попробуйте **полностью отключить фикс**:

В `config.inc.php`:
```ini
[database]
cleanup_enabled = Off
```

Если приложение работает нормально без фикса, то проблема в самом фиксе.  
Если остаётся проблема - значит проблема в самой БД или конфиге.

## Проверка статуса фикса

```bash
# Узнать, включен ли cleanup (должен быть "On" или пусто - по умолчанию включен)
grep -i "cleanup_enabled" /var/www/prod.mia-letum.ru/config.inc.php
```

---

## Если отключили фикс

Чтобы вернуть фиксы, просто удалите строку из config.inc.php или установите:

```ini
cleanup_enabled = On
```

---

## Мониторинг эффективности

Когда фикс работает правильно, вы должны увидеть:

```bash
# ДО фикса:
$ psql -U journals_sandbox -d rcsi_prod -c \
    "SELECT state, count(*) FROM pg_stat_activity GROUP BY state;"
 state | count 
-------+-------
 idle  |   450    ← МНОГО IDLE
 active|     5

# ПОСЛЕ фикса (когда включен):
$ psql -U journals_sandbox -d rcsi_prod -c \
    "SELECT state, count(*) FROM pg_stat_activity GROUP BY state;"
 state | count 
-------+-------
 idle  |    8     ← МАЛО IDLE
 active|     2
```

---

## Контакт для отладки

Если проблема не решена:

1. Проверьте, работает ли сама БД: `psql` или `mysql` напрямую
2. Проверьте конфиг: корректное имя БД, пользователь, пароль, хост
3. Проверьте firewall: может ли Apache/PHP подключиться к БД
4. Проверьте логи PostgreSQL/MySQL на явные ошибки
5. Временно отключите фикс и проверьте, решит ли это проблему
