执行连接到数据库的持久PHP代码



我必须执行一个PHP代码只是一次,使我的数据库有更好的表一些变化。代码太繁重,向数据库发送了超过190000个查询(包括选择和插入)。

现在的问题是,当我在浏览器上执行它时,在数据库和我设置为echo的单词上形成结果来检查它是否以正确的方式进行,我可以发现它被部分执行。页面上没有出现错误/警告/通知。

我将最大执行时间和所有相关设置设置为1小时,但它只需要30分钟,并且立即停止for循环。

这是我的一部分代码的示例:

    for ($i=9;$i<=19909; $i++){
        $j=0;
        $select= "select synonym from synonym where x_=". $i ."";
        //echo $select;
        //echo "</br>";
        $select_result= mysqli_query($connection,$select);
        if (mysqli_num_rows($select_result)>0) {
            $row = mysqli_fetch_assoc($select_result);
            $arra = explode("،",$row["synonym"]);
        }
        while ($arra[$j]){
            $text=trim($arra[$j]);
            $search="select word from semiresult where word='". $text ."'";
            $search_result= mysqli_query($connection,$search);
            if (mysqli_num_rows($search_result)==0) {
                $insert="insert into semiresult (x, word, synonym) values ('','". $text."','".$syn."')";
            }elseif (mysqli_num_rows($search_result)>0){
                 $repeat="UPDATE semiresult SET synonym=CONCAT(synonym,'".$syn2."') where word like'".$arra[$j]."'";
                 $repeat_result=mysqli_query($connection,$repeat) or die ('request "Could not execute SQL query" '.$repeat);

}

通过工作,您可以避免在php中执行这些操作。是否值得取决于数据和表的声明。

例如,假设word在半结果表中有一个唯一的索引,同义词字段最多有1000个分隔字段,您可以这样做(未经测试):-
INSERT INTO semiresult (x, word, synonym)
SELECT '',
        '". $text."',
        SUBSRTING_INDEX(SUBSRTING_INDEX(t1.synonym, '،', (hundreds.aCnt * 100 + tens.aCnt * 10 + units.aCnt + 1)), '،', -1)
FROM synonym t1
CROSS JOIN
(
    SELECT 0 aCnt UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) AS units
CROSS JOIN
(
    SELECT 0 aCnt UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) AS tens
CROSS JOIN
(
    SELECT 0 aCnt UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) AS hundreds
WHERE t1.x_ BETWEEN 9 AND 19909
AND LENGTH(t1.synonym) - LENGTH(REPLACE(t1.synonym, '،', '')) > (hundreds.aCnt * 100 + tens.aCnt * 10 + units.aCnt)
ON DUPLICATE KEY UPDATE synonym=CONCAT(synonym, VALUES(synonym))

毕竟我解决了!!
在php设置中将时间限制(如最大执行时间和任何其他时间限制)更改为两个小时后,我在代码的开头添加了这行代码,然后它执行直到代码结束。

set_time_limit(0);

这段代码计划只执行一次,否则我没有做这些更改。

相关内容

  • 没有找到相关文章