Возможная ошибка с PHP PDO и PostgreSQL

При запуске приложения докера (с laravel php) для 1 запроса соединение с базой данных работает нормально. После первого запроса я начинаю получать эту ошибку.

SQLSTATE[08006] [7] could not send SSL negotiation packet: Resource temporarily unavailable (Connection: pgsql, SQL: (select * from ........)

С использованием:

  • Laravel v10 и выше.
  • PHP 8.3 и выше
  • Докер с последней версией Ubuntu

Я отслеживал эту проблему, пока не обнаружил, что PDO на самом деле не открывает соединение с PostgreSQL. Я протестировал это с помощью iptraf, pg_connect и PDO. Когда мы используем PDO, мы получаем вышеуказанную ошибку, но когда я пытаюсь использовать pg_connect, мы можем подключиться и даже сделать запрос.

Итак, мои выводы: при использовании iptraf

  • Невозможно открыть соединение с помощью PDO
  • IPTraf не показывает соединение, открытое с помощью PDO
  • Я могу открыть соединение с помощью pg_connect
  • Я могу открыть соединение из приложения менеджера баз данных.
  • Происходит как в среде разработки, так и в производственной среде.

[РЕДАКТИРОВАТЬ] Новые выводы:

  • Вся установка работает на виртуальной машине, а не на докере.

Состояние SQL 08006 — это Connection_failure. При использовании только PostgreSQL я бы всегда использовал собственные функции PostgreSQL в PHP, а не PDO. Это решит вашу проблему, даст вам больше функциональности и лучшую производительность.

Frank Heikens 25.06.2024 23:26

Это ужасный комментарий, поскольку Laravel требует использования PDO в подключениях к базе данных и ORM. Сказать: «Просто не используйте PDO — это не решение вашей проблемы»

gofish 26.06.2024 03:28

@Frank Да, как я уже говорил, это ошибка соединения. И, к сожалению, этому проекту уже год, и у него много разработчиков, и он не может начать с самого начала.

Harun Barış Bulut 26.06.2024 05:44

Вы пробовали без SSL?

Olivier 26.06.2024 09:00

Да, я попробовал. Когда я пытаюсь использовать SSL, это превращается в проблему с сокетом.

Harun Barış Bulut 27.06.2024 18:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
7
5
1 353
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Я хочу добавить некоторую уточняющую информацию, так как мой клиент и я столкнулись с той же проблемой, которая началась после того, как unattended-upgrades обновил нашу установку PHP с PHP 8.2.19 на PHP 8.2.20.

Нам удалось сделать следующие выводы

  • PHP 8.1.x эта проблема совершенно не затрагивает. Мы создали временный PHP-скрипт, который подключился к базе данных Digital Ocean PostgreSQL и PHP 8.1 успешно смог подключиться.
  • PHP 8.2.20 на Ubuntu 22.04 LTS затронута эта проблема. Тот же скрипт, что описан выше, не работал с PHP 8.2.20
  • Проблему не удалось воспроизвести с использованием точно такой же установки PHP в Amazon для RDS.
  • Проблема не была воспроизведена на PHP 8.2.20 при установке Laravel Herd Windows, подключенной к Digital Ocean PostgreSQL.
  • Проблема была воспроизведена с использованием Digital Ocean PostgreSQL 13, 14, 15 и 16 в Digital Ocean.
  • Используя новую установку Laravel для экземпляра PostgreSQL Digital Ocean, мы запустили php8.2 artisan db и успешно перенесли оболочку в PostgreSQL.
  • Мы заметили, что в PHP 8.2.20 были изменения SSL, но не знаем, связаны ли они между собой.

Я постараюсь это проверить и вернуться к вам как можно скорее.

Harun Barış Bulut 26.06.2024 05:46

Оказывается, на данный момент мы также используем PHP 8.2.20. Но мы уже использовали его, пока он работал правильно. Просто дополнительная информация; Я также пытался использовать php8.3, у него была та же проблема.

Harun Barış Bulut 26.06.2024 05:56

Я попробовал установить приложение на виртуальную машину, и оно заработало без проблем. Я изменил версию Ubuntu на 20.04 в докере, возникла та же ошибка.

Harun Barış Bulut 26.06.2024 06:42
Ответ принят как подходящий

Проверьте версию пакета php-swoole при неудачном развертывании. Если это 6.0.0, возможно, у вас проблема.

Редактировать: У нас также есть эта проблема: мы развернули контейнер, скомпилированный на прошлой неделе, и контейнер с тем же кодом, но скомпилированный на этой неделе, разница заключалась в том, что пакет swoole был обновлен с версии 5x до 6.0.0, которая является альфа-версией. Таинственным образом эта версия проникла в репозиторий Ubuntu и не рекомендуется для производства, а ее журнал изменений указывает на несколько изменений и несовместимостей с PDO.

Из php pecl

  • Больше не поддерживает клиент сопрограммы Swoole\Coroutine\PostgreSQL.
  • Swoole-v6.0.0-alpha является тестовой версией и не может использоваться ни в какой производственной среде; это только для целей тестирования.

КАК РЕШИТЬ: Удалите swoole, если он вам не нужен. Если вам это нужно, то сейчас в репозитории нет предыдущей версии, поэтому вам нужно получить ее альтернативно.

МОЙ БОГ! Я удалил Swoole и все стало работать нормально. В чем проблема?

Harun Barış Bulut 27.06.2024 16:52

Это сработало, чувак! потрясающий. Спасибо.

Harun Barış Bulut 27.06.2024 18:31

Что ж, у нас тоже есть эта проблема. Мы развернули контейнер, скомпилированный на прошлой неделе, и контейнер с тем же кодом, но скомпилированный на этой неделе. Разница заключалась в том, что пакет swoole был обновлен с версии 5x до 6.0.0, которая является альфа-версией. . Таинственным образом эта версия проникла в репозиторий Ubuntu и не рекомендуется для производства, а ее журнал изменений указывает на несколько изменений и несовместимостей с PDO.

alibeam 27.06.2024 21:42

Отредактируйте, добавив дополнительную информацию, у меня не так уж много информации.

alibeam 27.06.2024 21:54

Как удалить этот пакет из проекта? Это на уровне проекта или на уровне ОС?

Eduardo C. K. Ferreira 28.06.2024 20:47

@Eduardo, тебе нужно удалить его, как apt Remove php8.2-swoole. Если вы, конечно, используете Ubuntu. Если вы используете другую ОС, вам следует использовать соответствующую команду удаления.

Harun Barış Bulut 29.06.2024 08:11

Добавлю сюда свои 2 цента. Мы использовали

  • PHP 8.2.20
  • Расширение Swoole (v5) включено
  • База данных DigitalOcean PostgreSQL (v16)
  • Изображение с официального сайта (php:8.2-cli-alpine)
  • Использование PDO для подключения.

У нас были похожие проблемы с этими двумя типами ошибок:

  • с отключенным SSL:
    SQLSTATE[08006] [7] could not send SSL negotiation packet: Resource temporarily unavailable
  • При включенном SSL:
    PDOException: SQLSTATE[08006] [7] could not send SSL negotiation packet: Resource temporarily unavailable

Удаление расширения помогло нам.

То же самое произошло и с нами. И никакой информации об этом в интернете нет. Спасибо, мужик!

Harun Barış Bulut 27.06.2024 18:31

Смотрите мой ответ: stackoverflow.com/a/78685835/5404257 — это тоже может вам помочь.

Арсен Гоян 29.06.2024 13:29

Я запускал свое приложение с Octane и Swoole, и у меня возникла та же проблема, я сменил его на Fraken Php, и все заработало. очевидно, Swoole обновился до версии 6.0.0, удалив поддержку библиотеки PDO. я буду следить, потому что производительность Frankenphp не так уж велика по сравнению со Swoole, но он отлично справляется с той же работой! Спасибо всем, кто прокомментировал, и @Harun за то, что так быстро указали на эту ошибку.

Для моего образа парусного докера я сделал следующее:

  1. Удалите строку с установкой php8.3-swole с помощью apt-get install
  2. Добавьте эти строки
RUN pecl install swoole-5.1.2 \
&& echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/20-swoole.ini

Эти строки установят Swoole версии 5.1.2, которая все еще поддерживает PDO.

  1. Восстановите свой имидж

Я использую парус в своей работе, поэтому эти действия я просто проделал в своем файле докеров. Если вы собираете Laravel через Docker, то это тоже должно вам помочь. Если вы не используете докер, просто удалите/измените версию swoole через pecl, как я показал выше. Это должно помочь

Спасибо, я тоже искал как откатить конкретный пакет. Это может быть решением этой проблемы.

Harun Barış Bulut 29.06.2024 08:09

Эта проблема также возникает в Alpine в версиях Swoole, начиная с 5.1.1.

Вы можете установить более старую версию Swoole на Alpine следующим образом (мне подходит):

RUN apk --no-cache add php82-pecl-swoole=5.0.3-r0 --repository=http://dl-cdn.alpinelinux.org/alpine/v3.18/community

Надеюсь, это кому-то поможет

Если пакет ранее таинственным образом проник в ваш встроенный образ Docker, возможно, он был установлен в ваши базовые образы с помощью PPA с сайта deb.sury.org (ppa:ondrej/php).

Версия 6.0.0 была собрана и распространена ранее на этой неделе. Разработчик перевыпустил стабильную версию (см. https://github.com/oerdnj/deb.sury.org/issues/2152), поэтому попробуйте пересобрать образ Docker, и теперь он может использовать стабильную версию. версия (5.1.3) php-swoole.

У нас была та же проблема. Решено путем удаления расширения php8.3-swoole из нашей установки PHP:

sudo rm /etc/php/8.3/mods-available/swoole.ini
sudo rm /etc/php/8.3/cli/conf.d/25-swoole.ini
sudo rm /etc/php/8.3/fpm/conf.d/25-swoole.ini
sudo systemctl restart php8.3-fpm

Теперь приложение может без ошибок подключаться к базе данных.

Я тоже добавлю сюда свои 1,5 цента. Мы использовали:

  • PHP 8.3.8
  • База данных DigitalOcean PostgreSQL (v16)
  • Расширение Swoole 5.1.3 включено
  • Использование PDO для подключения.

У нас были похожие проблемы с этими двумя типами ошибок:

  • с отключенным SSL:
SQLSTATE[08006] [7] could not send SSL negotiation packet: Resource temporarily unavailable
  • с включенным SSL:
PDOException: SQLSTATE[08006] [7] could not send SSL negotiation packet: Resource temporarily unavailable

Замена расширения swoole с версии 5.1.3 на версию 5.1.2 решила эту проблему.

sudo rm /etc/php/8.2/mods-available/swoole.ini

Это помогло нам.

По сути, это то же самое, что и удаление пакета. Но можно, конечно, и это решить. Спасибо.

Harun Barış Bulut 10.07.2024 12:40

Другие вопросы по теме