带有MySQL查询超时的PHP脚本
我在运行将数据插入MySQL的PHP脚本时遇到问题。我得到的错误是504网关超时nginx,当PHP页面被此超时卡住时,10102行数据已输入到数据库。我计划在一次脚本加载中插入160000行 通过使用SQL语句,我的代码更加高效。 SQL也设置在此结构中:带有MySQL查询超时的PHP脚本,php,mysql,nginx,mysqli,Php,Mysql,Nginx,Mysqli,我在运行将数据插入MySQL的PHP脚本时遇到问题。我得到的错误是504网关超时nginx,当PHP页面被此超时卡住时,10102行数据已输入到数据库。我计划在一次脚本加载中插入160000行 通过使用SQL语句,我的代码更加高效。 SQL也设置在此结构中: INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9); 我读过很多书 我尝试在代码的开头添加,但似乎没有什么不同: set_time_limit(0); ignore_use
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
我读过很多书
我尝试在代码的开头添加,但似乎没有什么不同:
set_time_limit(0);
ignore_user_abort(1);
是否有人可以向我展示数据,将数据集拆分为多个数据块,并为每个数据块插入数据
我将在下面展示插入MySQL的代码部分
// prepare and bind
$stmt = $link->prepare("INSERT INTO MyGuests (`eventID`,`location`,`date`,`barcode`,`runner`,`time`,`Run Points`,`Volunteer Points`,`Gender`, `Gender pos`) VALUES (?,?,?,?,?,?,?,?,?,?)");
$stmt->bind_param("isssssiisi", $eventID,$location,$date,$barcode,$runner,$time,$runpoints,$volpoints,$gender,$genderpos);
// set parameters and execute
for( $x=0; $x < count($array_runner); $x++ ){
$eventID=null;
$barcode=$array_barcode[$x];
$runner=$array_runner[$x];
$time=$array_time[$x];
$runpoints=$array_score[$x];
$volpoints=' ';
$gender=$array_gender[$x];
$genderpos=$array_gender_pos[$x];
$stmt->execute();
}
$stmt->close();
$link->close();
我刚接触MySQL,正在寻找一些关于这个问题的指导;执行时重置计数。它不会更改php.ini中的max_execution_time,因此要使其产生任何有用的效果,您必须在循环中运行它
// prepare and bind
$stmt = $link->prepare("INSERT INTO MyGuests (`eventID`,`location`,`date`,`barcode`,`runner`,`time`,`Run Points`,`Volunteer Points`,`Gender`, `Gender pos`) VALUES (?,?,?,?,?,?,?,?,?,?)");
$stmt->bind_param("isssssiisi", $eventID,$location,$date,$barcode,$runner,$time,$runpoints,$volpoints,$gender,$genderpos);
// set parameters and execute
for( $x=0; $x < count($array_runner); $x++ ){
$eventID=null;
$barcode=$array_barcode[$x];
$runner=$array_runner[$x];
$time=$array_time[$x];
$runpoints=$array_score[$x];
$volpoints=' ';
$gender=$array_gender[$x];
$genderpos=$array_gender_pos[$x];
$stmt->execute();
// every 5000 times through the loop reset the timeout
if ( $x % 5000 == 0 ) {
set_time_limit(30);
}
}
$stmt->close();
$link->close();
当然,您可以使用值5000进行播放,这样重置的频率就会降低
从手册中:
调用set_time_limit时,set_time_limit将从零重新启动超时计数器。换句话说,如果超时是默认的30秒,并且在脚本执行25秒后进行了诸如set_time_limit20之类的调用,则脚本将在超时之前总共运行45秒
如果您在一个包含如此多行的循环中使用查询,它肯定会卡住 我建议的最好的方法是简单地处理要插入到PHP字符串中的所有数据,然后启动一个查询来插入数据 让我详细说明一下
$data_to_insert = '' // will contain all data to inserted
$count = 1;
$eventID = null; // if it is null for all rows
for( $x=0; $x < count($array_runner); $x++ )
{
if($count == 1) // checking if it is the first value to be inserted
{
$data_to_insert = "(";
$count = 2;
}
else // with second value onwards
{
$data_to_insert = ",(" ;
}
$data_to_insert = $data_to_insert . $eventID . ",";
$data_to_insert = $data_to_insert . "'". $barcode . "'";
$data_to_insert = $data_to_insert . "'". $array_runner[$x] . "'";
$data_to_insert = ")";
}
// so in the last $data_to_insert should look like this
// $data_to_insert = (eventid1 , 'barcode1', 'runner1'), (eventid2 , 'barcode2', 'runner2') and so on...
注:
我的代码中可能有一些语法错误,但您可以在这里找到逻辑。我认为您无权更改php时间限制,在这种情况下,您没有任何机会以这种方式解决此问题。您可以将SQL查询拆分为单独的部分扫描您将此脚本作为PHP CLI运行,即从命令行!没有适用于CLI的最长执行时间。谢谢您的评论,Peter。啊,没有权限很烦人,这个项目只托管在共享服务器上的iPage上,没有使用专用服务器/VPS的计划。您能提供任何将SQL拆分为不同部分的代码吗?set_time_limit与504网关超时无关nginx@YourCommonSense据我所知,这可能是因为超过了最大执行时间!虽然我承认还有很多其他原因,感谢@RiggsFolly编写了这段代码,但我已经尝试在循环中使用set_time_limit,但脚本仍然停留在10102行数据上。@Jeancraude运气不好,很抱歉这不是您的代码issue@RiggsFolly不用担心,我正在尝试相同的代码,但有更长的时间限制。所以我刚刚用set_time_limit360运行了代码,它在剪切之前已经完成了15374行数据。这是我插入数据库的最大数据量,只运行了一次!另一方面,iPageWebHosting的工作人员告诉我,在共享托管服务器上,我不能使用set_time_limit。因此,也许我没有太多的控制权,但脚本刚刚用您提到的代码完成了这么多数据。再次感谢
mysqli_query("INSERT INTO MyGuests (`eventID`,`barcode`,`runner`) values" . $data_to_insert);
// which would look like
// INSERT INTO MyGuests (`eventID`,`barcode`,`runner`) values (eventid1 , 'barcode1', 'runner1'), (eventid2 , 'barcode2', 'runner2')