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

时间:2015-09-09 07:17:54

标签: php mysql long-running-processes

我必须执行一次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);

}

2 个答案:

答案 0 :(得分:1)

通过工作,你可以避免在PHP中做很多事情。是否值得取决于数据和表格声明。

例如,假设该单词在semiresult表中具有唯一索引,并且同义词字段最多包含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))

答案 1 :(得分:0)

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

set_time_limit(0);

此代码计划仅执行一次,否则我没有进行此更改。