我有一個 PHP 腳本正在啟動一個 SQL 查詢,在根據我服務器上名為table.獲得結果后,應該將這些記錄插入(使用替換)到我服務器上的另一個數據庫表中。當table是一個簡單的核心表時,該腳本可以完美地工作。我后來修改了 SQL 查詢以使用 VIEW 表中的數據,我們可以稱之為 VIEW 表,它view_table基于table但有一個額外的列,它是動態計算的。這使得腳本開始崩潰我的整個 SQL 服務器,每隔一段時間,拋出這個錯誤:PHP 警告:mysqli::query(): MySQL server has gone away in /home/user/script.php on line 109下面是第 109 行:function getRecordsFromDB(){ logMemoryUtilizationDetails(); file_put_contents(LOG_DIRECTORY.'service.log', date("d/m:H:i").':'."getRecordsFromDB::Entry".PHP_EOL, FILE_APPEND); global $sourceConn; $selectQuery = file_get_contents(__DIR__.'/my-query.sql'); $items = array(); $result = $sourceConn->query($selectQuery); // LINE 109 if ($result){ if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $item = new Item(); $item->id = $row['id']; $item->itemId = $row['itemid'];我嘗試記錄創建以查看腳本在啟動和退出時使用了多少內存,當它成功時,它在峰值時只使用了大約 37MB 的 RAM。我的服務器在 4 個內核上有 6GB 的 RAM。我的服務器上沒有運行其他腳本會導致 SQL 服務器像這樣崩潰,所以我確信這個腳本會導致崩潰。這是我的服務器的 MY.CNF:[mysqld]# disable mysql strict modesql_mode=""log-error=/var/lib/mysql/host.myhost.com.errperformance_schema=1query_cache_type=0query_cache_size=0query_cache_limit=0key_buffer_size=16Mmax_connections=200max_tmp_tables=1table_open_cache=2000local-infile=0thread_cache_size=4innodb_file_per_table=1default-storage-engine=MyISAMinnodb_use_native_aio=0max_allowed_packet=1024Minnodb_buffer_pool_size=800Mopen_files_limit=10000#wait_timeout=500tmp_table_size=256Mmax_heap_table_size=256Minnodb_buffer_pool_instances=1#general_log=on#general_log_file = /var/lib/mysql/all-queries.logslow-query-log=0slow-query-log-file=/var/lib/mysql/slow_queries.loglong_query_time=1.0#log_queries_not_using_indexes=1這是來自我的 PHP.INI(對于我正在使用的 PHP 7.2):max_execution_time = 240max_input_time = 60max_input_vars = 1000memory_limit = 512M
1 回答

德瑪西亞99
TA貢獻1770條經驗 獲得超3個贊
看起來像一個超時或失敗的查詢。請粘貼您正在使用的 sql 查詢。您也可以嘗試通過將查詢粘貼到您的 mysql IDE(我最喜歡 Navicat)并在其前面加上“解釋擴展”(不帶引號)來查看查詢可能導致此問題的位置。所以你的查詢看起來像'解釋擴展選擇......(所有 300 行)' 尋找高于 4 的鍵,沒有主鍵和查詢的行對于初學者來說非常高。此外,您可能希望考慮創建一個存儲過程而不是視圖,在該存儲過程中您可以將所有內容選擇到臨時表中,然后在下一個查詢中執行即時計算值。當然,您需要配置 my.cnf 以識別臨時表,以便在會話完成后將其銷毀。此外,如果您有任何復制或服務器集群,
如果您愿意,請粘貼您的 my.cnf(mysql 配置文件)以確保您的配置最適合大型查詢。
此外,出于故障排除的目的,您可能希望暫時增加 php.ini 中的最大執行時間。
- 1 回答
- 0 關注
- 118 瀏覽
添加回答
舉報
0/150
提交
取消