带有MySQL查询超时的PHP脚本

带有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

我在运行将数据插入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_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')