我有一个 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 mode
sql_mode=""
log-error=/var/lib/mysql/host.myhost.com.err
performance_schema=1
query_cache_type=0
query_cache_size=0
query_cache_limit=0
key_buffer_size=16M
max_connections=200
max_tmp_tables=1
table_open_cache=2000
local-infile=0
thread_cache_size=4
innodb_file_per_table=1
default-storage-engine=MyISAM
innodb_use_native_aio=0
max_allowed_packet=1024M
innodb_buffer_pool_size=800M
open_files_limit=10000
#wait_timeout=500
tmp_table_size=256M
max_heap_table_size=256M
innodb_buffer_pool_instances=1
#general_log=on
#general_log_file = /var/lib/mysql/all-queries.log
slow-query-log=0
slow-query-log-file=/var/lib/mysql/slow_queries.log
long_query_time=1.0
#log_queries_not_using_indexes=1
这是来自我的 PHP.INI(对于我正在使用的 PHP 7.2):
max_execution_time = 240
max_input_time = 60
max_input_vars = 1000
memory_limit = 512M
德玛西亚99