【问题标题】:execute long lasting php code with connection to database通过连接到数据库执行持久的 php 代码
【发布时间】:2023-03-11 13:15:01
【问题描述】:

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

}

【问题讨论】:

  • 你有什么问题?
  • 你的问题是什么,你能显示这个“代码”吗?
  • 我认为您的代码可能过于复杂。给我们一个你的代码例子......说20行左右。那么我们将能够更好地为您提供帮助。
  • 问题是如何执行它
  • 请输入代码...没有代码我们无法为您提供任何帮助。

标签: php mysql long-running-processes


【解决方案1】:

通过工作,您可以避免在 php.ini 中做很多这样的事情。是否值得取决于数据和表声明。

例如,假设单词在 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))

【讨论】:

    【解决方案2】:

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

    set_time_limit(0);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 2011-12-08
      • 2010-11-10
      • 2013-08-06
      相关资源
      最近更新 更多