亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PDOException:數據包亂序。預期收到 0 1。數據包大小=23

PDOException:數據包亂序。預期收到 0 1。數據包大小=23

PHP
慕絲7291255 2023-09-15 21:49:30
我有一個 Laravel Spark 項目,它使用 Horizon 來管理 Redis 的作業隊列。在本地(在我的 Homestead 盒子、Mac OS 上)一切都按預期工作,但在我們新的 Digital Ocean(Forge 配置)Droplet(內存優化的 256GB、32vCPU、10TB 和 1x 800GB VPS)上,我不斷收到錯誤:PDOException: Packets out of order. Expected 0 received 1. Packet size=23或者該錯誤的某些變體,其中數據包大小信息可能不同。經過數小時/數天的調試和研究,我在 StackOverflow 和其他地方看到了許多帖子,這些帖子似乎表明可以通過執行以下列出的許多操作來解決此問題:在我的 database.php 配置中設置PDO::ATTR_EMULATE_PREPARES為 true。這對問題絕對沒有影響,實際上引入了另一個問題,即整數被轉換為字符串。設置DB_HOST為127.0.0.1而不是localhost,以便它使用 TCP 而不是 UNIX 套接字。同樣,這沒有任何效果。DB_SOCKET通過登錄 MySQL (MariaDB) 并運行將套接字路徑列出為 來設置為 MySQL 中show variables like '%socket%';列出的套接字路徑/run/mysqld/mysqld.sock。我也離開DB_HOST設置為localhost。這也沒有效果。我確實注意到的一件事是,變量pdo_mysql.default_socket設置為/var/run/mysqld/mysqld.sock,我不確定這是否是問題的一部分?我已將 MySQL 配置設置大幅增加到/etc/mysql/mariadb.conf.d/50-server.cnf以下內容:key_buffer_size = 2048Mmax_allowed_packet = 2048Mmax_connections = 1000thread_concurrency = 100query_cache_size = 256M我必須承認,改變這些設置是最后的手段/抓住稻草類型的場景。然而,這確實在一定程度上緩解了這個問題,但并沒有完全解決它,因為 MySQL 在 99% 的情況下仍然會失敗,盡管是在后期。就隊列而言,我總共分為1,136 workers6 個主管/隊列,并且全部通過 Laravel Horizon 處理,它作為守護進程運行。我還使用 Laravel Websockets PHP 包進行廣播,同樣,它也作為守護進程運行。我當前的環境配置如下(敏感信息省略)。服務器設置如下:最大文件上傳大?。?024最大執行時間:300PHP 版本:7.4MariaDB 版本:10.3.22我檢查了 MySQL 服務器崩潰/消失時的所有日志(見下文),MySQL 日志中根本沒有任何內容。沒有任何錯誤。我也沒有看到任何內容:/var/log/nginx/error.log/var/log/nginx/access.log/var/log/php7.4-fpm.log我目前仍在挖掘和調試,但現在,我被難住了。這是我第一次遇到這個錯誤。這可能是因為訪問數據庫(讀/寫)太快嗎?有關隊列如何工作的一些信息。我有一個初始控制器,它將作業分派到隊列。一旦該作業完成,它就會觸發一個事件,然后啟動按順序運行其他幾個偵聽器/事件的過程,所有這些都取決于在觸發新事件和新偵聽器/作業占用工作之前完成的先前作業??偣膊コ隽?30 個事件??偣灿?30 名聽眾??偣灿?個職位。這些都根據運行的偵聽器/作業及其觸發的事件按順序工作。我還監控了laravel.log現場情況,當崩潰發生時,根本沒有記錄任何內容。雖然,我偶爾會得到production.ERROR: Failed to connect to Pusher.MySQL是否崩潰的信息,所以我認為這與這個問題沒有任何關系。我什至注意到 Laravel API 速率限制已達到,因此我確保將其從 60 大幅增加到 500。仍然沒有高興。最后,運行哪個事件、作業或監聽器似乎并不重要,因為錯誤是隨機發生的。因此,不確定它是特定于代碼的,但很可能是。希望我已經提供了足夠的背景和詳細信息來獲得一些幫助,但如果我錯過了任何內容,請告訴我,我會將其添加到問題中。謝謝。
查看完整描述

4 回答

?
慕神8447489

TA貢獻1780條經驗 獲得超1個贊

對我來說,解決這個問題的是增加最大數據包大小。

在 中my.cnf,我添加了:

max_allowed_packet=200M

然后service mysql stop,,,service mysql start它成功了:)


查看完整回答
反對 回復 2023-09-15
?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

我們收到了類似的關于數據包亂序的 PHP 警告。為我們解決這個問題的是增加MySQL my.cnf 中的max_connections 。您當前的 max_connections 可能是 1024。我們將其增加到 4096,警告消失了。在 MySQL 中,您可以使用以下命令查看當前的 max_connections:

SHOW VARIABLES LIKE "%max_connections%";
or
mysqladmin variables | grep max_connections


查看完整回答
反對 回復 2023-09-15
?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

我遇到了一個可重現的類似問題,這是一個編程錯誤:
我使用的是無緩沖的數據庫游標,并且在觸發其他數據庫操作之前沒有關閉游標。拋出的確切錯誤是Packets out of order. Expected 1 received 2.

查看完整回答
反對 回復 2023-09-15
?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

首先要檢查的是wait_timeoutMySQL 服務器的時間,與應用程序在查詢之間花費的時間有關。通過在 SQL 查詢之間休眠時間超過wait_timeout秒,我能夠一致地重新創建此錯誤。

如果您的應用程序執行查詢,然后在一段時間內執行其他操作,并且花費的時間超過該時間,則 MySQL 服務器將終止連接,但您的 PHP 代碼可能不知道服務器已斷開連接。如果 PHP 應用程序隨后嘗試使用關閉的連接發出另一個查詢,它將生成此錯誤(在我的測試中,與Expected 0 received 1.

您可以通過以下方式解決此問題:

  • wait_timeout在服務器上全局擴展或使用命令在每個會話的基礎上擴展SET session wait_timeout=<new_value>;

  • 捕獲錯誤并重試一次

  • wait_timeout當您知道查詢之間已經過去了超過幾秒時,搶先重新連接到服務器。

此錯誤也可能由于其他問題而發生。我會檢查您是否使用持久連接,而不是一遍又一遍地連接到服務器。有時,連接過程,尤其是許多并發工作人員的連接過程,會導致大量網絡開銷,從而可能導致此類問題。

另外,有時,在生產、高交易量的服務器中,會發生奇怪的網絡問題,并且這種情況可能只是偶爾發生,甚至在您的情況下似乎是通過環回接口發生的。

無論如何,最好編寫您的代碼,以便它可以優雅地處理錯誤并重試。通常,您可以將 SQL 查詢包裝在 a 中try..catch,以便在發生此錯誤時捕獲它并重試。


查看完整回答
反對 回復 2023-09-15
  • 4 回答
  • 0 關注
  • 335 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號