我有一個 PHP 腳本正在啟動一個 SQL 查詢,在根據(jù)我服務(wù)器上名為table.獲得結(jié)果后,應(yīng)該將這些記錄插入(使用替換)到我服務(wù)器上的另一個數(shù)據(jù)庫表中。當(dāng)table是一個簡單的核心表時,該腳本可以完美地工作。我后來修改了 SQL 查詢以使用 VIEW 表中的數(shù)據(jù),我們可以稱之為 VIEW 表,它view_table基于table但有一個額外的列,它是動態(tài)計算的。這使得腳本開始崩潰我的整個 SQL 服務(wù)器,每隔一段時間,拋出這個錯誤: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'];我嘗試記錄創(chuàng)建以查看腳本在啟動和退出時使用了多少內(nèi)存,當(dāng)它成功時,它在峰值時只使用了大約 37MB 的 RAM。我的服務(wù)器在 4 個內(nèi)核上有 6GB 的 RAM。我的服務(wù)器上沒有運行其他腳本會導(dǎo)致 SQL 服務(wù)器像這樣崩潰,所以我確信這個腳本會導(dǎo)致崩潰。這是我的服務(wù)器的 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貢獻(xiàn)1770條經(jīng)驗 獲得超3個贊
看起來像一個超時或失敗的查詢。請粘貼您正在使用的 sql 查詢。您也可以嘗試通過將查詢粘貼到您的 mysql IDE(我最喜歡 Navicat)并在其前面加上“解釋擴(kuò)展”(不帶引號)來查看查詢可能導(dǎo)致此問題的位置。所以你的查詢看起來像'解釋擴(kuò)展選擇......(所有 300 行)' 尋找高于 4 的鍵,沒有主鍵和查詢的行對于初學(xué)者來說非常高。此外,您可能希望考慮創(chuàng)建一個存儲過程而不是視圖,在該存儲過程中您可以將所有內(nèi)容選擇到臨時表中,然后在下一個查詢中執(zhí)行即時計算值。當(dāng)然,您需要配置 my.cnf 以識別臨時表,以便在會話完成后將其銷毀。此外,如果您有任何復(fù)制或服務(wù)器集群,
如果您愿意,請粘貼您的 my.cnf(mysql 配置文件)以確保您的配置最適合大型查詢。
此外,出于故障排除的目的,您可能希望暫時增加 php.ini 中的最大執(zhí)行時間。
- 1 回答
- 0 關(guān)注
- 124 瀏覽
添加回答
舉報
0/150
提交
取消