У меня есть небольшая проблема с подключением сервера Postgres от php. Я только начал работать с Postgres + PHP комбо, и я понял, что установление соединения очень медленное.
Для простого соединения обычно требуется 1 с, а иногда и более 2 секунд. И это только сервер разработки, поэтому нет реального трафика. Хорошо, сервер не самый лучший, но соединение с MySQL намного быстрее.
После подключения все идет хорошо, каждый запрос работает так, как я ожидаю. Время работы приложения составляет около 10%, а соединение – около 90%. Действительно странно, потому что с уровнем базы данных mysql это очень быстро.
В чем проблема?
Я пытался с PDO, pg_pconnect, pg_connect, но каждый раз результат тот же.
Это может быть ошибка конфигурации Postgres? Но запросы выполняются быстро, только установление соединения происходит медленно. Понятия не имею.
PG: PostgreSQL 8.3.9
PHP: 5.2.6
Заранее спасибо!
Конфигурация:
#------------------------------------------------------------------------------ # CONNECTIONS AND AUTHENTICATION #------------------------------------------------------------------------------ # - Connection Settings - #listen_addresses = 'localhost' # what IP address(es) to listen on; # comma-separated list of addresses; # defaults to 'localhost', '*' = all # (change requires restart) port = 5432 # (change requires restart) max_connections = 100 # (change requires restart) # Note: Increasing max_connections costs ~400 bytes of shared memory per # connection slot, plus lock space (see max_locks_per_transaction). You might # also need to raise shared_buffers to support more connections. #superuser_reserved_connections = 3 # (change requires restart) unix_socket_directory = '/var/run/postgresql' # (change requires restart) #unix_socket_group = '' # (change requires restart) #unix_socket_permissions = 0777 # begin with 0 to use octal notation # (change requires restart) #bonjour_name = '' # defaults to the computer name # (change requires restart) # - Security and Authentication - #authentication_timeout = 1min # 1s-600s ssl = true # (change requires restart) #ssl_ciphers = 'ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH' # allowed SSL ciphers # (change requires restart) #password_encryption = on #db_user_namespace = off # Kerberos and GSSAPI #krb_server_keyfile = '' # (change requires restart) #krb_srvname = 'postgres' # (change requires restart, Kerberos only) #krb_server_hostname = '' # empty string matches any keytab entry # (change requires restart, Kerberos only) #krb_caseins_users = off # (change requires restart) #krb_realm = '' # (change requires restart) # - TCP Keepalives - # see "man 7 tcp" for details #tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; # 0 selects the system default #tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; # 0 selects the system default #tcp_keepalives_count = 0 # TCP_KEEPCNT; # 0 selects the system default #------------------------------------------------------------------------------ # RESOURCE USAGE (except WAL) #------------------------------------------------------------------------------ # - Memory - shared_buffers = 24MB # min 128kB or max_connections*16kB # (change requires restart) #temp_buffers = 8MB # min 800kB #max_prepared_transactions = 5 # can be 0 or more # (change requires restart) # Note: Increasing max_prepared_transactions costs ~600 bytes of shared memory # per transaction slot, plus lock space (see max_locks_per_transaction). #work_mem = 1MB # min 64kB #maintenance_work_mem = 16MB # min 1MB #max_stack_depth = 2MB # min 100kB # - Free Space Map - max_fsm_pages = 153600 # min max_fsm_relations*16, 6 bytes each # (change requires restart) #max_fsm_relations = 1000 # min 100, ~70 bytes each # (change requires restart) # - Kernel Resource Usage - #max_files_per_process = 1000 # min 25 # (change requires restart) #shared_preload_libraries = '' # (change requires restart) # - Cost-Based Vacuum Delay - #vacuum_cost_delay = 0 # 0-1000 milliseconds #vacuum_cost_page_hit = 1 # 0-10000 credits #vacuum_cost_page_miss = 10 # 0-10000 credits #vacuum_cost_page_dirty = 20 # 0-10000 credits #vacuum_cost_limit = 200 # 1-10000 credits # - Background Writer - #bgwriter_delay = 200ms # 10-10000ms between rounds #bgwriter_lru_maxpages = 100 # 0-1000 max buffers written/round #bgwriter_lru_multiplier = 2.0 # 0-10.0 multipler on buffers scanned/round
Всегда отключите SSL, если вы его не используете. И если вы хотите использовать SSL, убедитесь, что pg_hba.conf
имеет правильные настройки для обеспечения безопасного соединения.
Если PostGres находится на одном сервере, попробуйте настроить соединение для использования сокетов Unix вместо стека TCP. Скорее всего, ваша задержка вызвана либо обратным DNS-разрешением, либо задержкой аутентификации на сервере Postgres, поэтому, если сокеты Unix не являются опцией, я бы включил регистрацию отладки в postgres и проверил, что там происходит.