При запуске приложения докера (с laravel php) для 1 запроса соединение с базой данных работает нормально. После первого запроса я начинаю получать эту ошибку.
SQLSTATE[08006] [7] could not send SSL negotiation packet: Resource temporarily unavailable (Connection: pgsql, SQL: (select * from ........)
С использованием:
Я отслеживал эту проблему, пока не обнаружил, что PDO на самом деле не открывает соединение с PostgreSQL. Я протестировал это с помощью iptraf, pg_connect и PDO. Когда мы используем PDO, мы получаем вышеуказанную ошибку, но когда я пытаюсь использовать pg_connect, мы можем подключиться и даже сделать запрос.
Итак, мои выводы: при использовании iptraf
[РЕДАКТИРОВАТЬ] Новые выводы:
Это ужасный комментарий, поскольку Laravel требует использования PDO в подключениях к базе данных и ORM. Сказать: «Просто не используйте PDO — это не решение вашей проблемы»
@Frank Да, как я уже говорил, это ошибка соединения. И, к сожалению, этому проекту уже год, и у него много разработчиков, и он не может начать с самого начала.
Вы пробовали без SSL?
Да, я попробовал. Когда я пытаюсь использовать SSL, это превращается в проблему с сокетом.
Я хочу добавить некоторую уточняющую информацию, так как мой клиент и я столкнулись с той же проблемой, которая началась после того, как 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 8.2.20
при установке Laravel Herd Windows, подключенной к Digital Ocean PostgreSQL.php8.2 artisan db
и успешно перенесли оболочку в PostgreSQL.PHP 8.2.20
были изменения SSL, но не знаем, связаны ли они между собой.Я постараюсь это проверить и вернуться к вам как можно скорее.
Оказывается, на данный момент мы также используем PHP 8.2.20. Но мы уже использовали его, пока он работал правильно. Просто дополнительная информация; Я также пытался использовать php8.3, у него была та же проблема.
Я попробовал установить приложение на виртуальную машину, и оно заработало без проблем. Я изменил версию Ubuntu на 20.04 в докере, возникла та же ошибка.
Проверьте версию пакета php-swoole при неудачном развертывании. Если это 6.0.0, возможно, у вас проблема.
Редактировать: У нас также есть эта проблема: мы развернули контейнер, скомпилированный на прошлой неделе, и контейнер с тем же кодом, но скомпилированный на этой неделе, разница заключалась в том, что пакет swoole был обновлен с версии 5x до 6.0.0, которая является альфа-версией. Таинственным образом эта версия проникла в репозиторий Ubuntu и не рекомендуется для производства, а ее журнал изменений указывает на несколько изменений и несовместимостей с PDO.
Из php pecl
КАК РЕШИТЬ: Удалите swoole, если он вам не нужен. Если вам это нужно, то сейчас в репозитории нет предыдущей версии, поэтому вам нужно получить ее альтернативно.
МОЙ БОГ! Я удалил Swoole и все стало работать нормально. В чем проблема?
Это сработало, чувак! потрясающий. Спасибо.
Что ж, у нас тоже есть эта проблема. Мы развернули контейнер, скомпилированный на прошлой неделе, и контейнер с тем же кодом, но скомпилированный на этой неделе. Разница заключалась в том, что пакет swoole был обновлен с версии 5x до 6.0.0, которая является альфа-версией. . Таинственным образом эта версия проникла в репозиторий Ubuntu и не рекомендуется для производства, а ее журнал изменений указывает на несколько изменений и несовместимостей с PDO.
Отредактируйте, добавив дополнительную информацию, у меня не так уж много информации.
Как удалить этот пакет из проекта? Это на уровне проекта или на уровне ОС?
@Eduardo, тебе нужно удалить его, как apt Remove php8.2-swoole. Если вы, конечно, используете Ubuntu. Если вы используете другую ОС, вам следует использовать соответствующую команду удаления.
Добавлю сюда свои 2 цента. Мы использовали
У нас были похожие проблемы с этими двумя типами ошибок:
SQLSTATE[08006] [7] could not send SSL negotiation packet: Resource temporarily unavailable
PDOException: SQLSTATE[08006] [7] could not send SSL negotiation packet: Resource temporarily unavailable
Удаление расширения помогло нам.
То же самое произошло и с нами. И никакой информации об этом в интернете нет. Спасибо, мужик!
Смотрите мой ответ: stackoverflow.com/a/78685835/5404257 — это тоже может вам помочь.
Я запускал свое приложение с Octane и Swoole, и у меня возникла та же проблема, я сменил его на Fraken Php, и все заработало. очевидно, Swoole обновился до версии 6.0.0, удалив поддержку библиотеки PDO. я буду следить, потому что производительность Frankenphp не так уж велика по сравнению со Swoole, но он отлично справляется с той же работой! Спасибо всем, кто прокомментировал, и @Harun за то, что так быстро указали на эту ошибку.
Для моего образа парусного докера я сделал следующее:
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.
Я использую парус в своей работе, поэтому эти действия я просто проделал в своем файле докеров. Если вы собираете Laravel через Docker, то это тоже должно вам помочь. Если вы не используете докер, просто удалите/измените версию swoole через pecl, как я показал выше. Это должно помочь
Спасибо, я тоже искал как откатить конкретный пакет. Это может быть решением этой проблемы.
Эта проблема также возникает в 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 цента. Мы использовали:
У нас были похожие проблемы с этими двумя типами ошибок:
SQLSTATE[08006] [7] could not send SSL negotiation packet: Resource temporarily unavailable
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
Это помогло нам.
По сути, это то же самое, что и удаление пакета. Но можно, конечно, и это решить. Спасибо.
Состояние SQL 08006 — это Connection_failure. При использовании только PostgreSQL я бы всегда использовал собственные функции PostgreSQL в PHP, а не PDO. Это решит вашу проблему, даст вам больше функциональности и лучшую производительность.