【问题标题】:PHP script takes too long and times out [closed]PHP脚本花费太长时间并且超时[关闭]
【发布时间】:2013-03-17 10:49:07
【问题描述】:

当我将下面的函数添加到我的 PHP 页面时,尝试执行脚本会超时。它有什么问题?

include ('config.php');

function GenerateTransID() {    
    $unique_ref_length = 9;  
    $unique_ref_found = false;  
    $possible_chars = "23456789BCDFGHJKMNPQRSTVWXYZ";  
    while (!$unique_ref_found) {  
        $unique_ref = "";  
        $i = 0;  
        while ($i < $unique_ref_length) {  
            $char = substr($possible_chars, mt_rand(0, strlen($possible_chars)-1), 1);  
            $unique_ref .= $char;  
            $i++;  
        }

        $tmp_id = "TR-" . $unique_ref;
        $unique_ref = $tmp_id;
        $query = "SELECT `transactionID` FROM `payment` WHERE `transactionID`='$unique_ref'";  
        $result = mysql_query($query) or die(mysql_error().' '.$query); 

        if (mysql_num_rows($result)==0) {  
            $unique_ref_found = true;  

        }  

    }  
    return $unique_ref;         
}

【问题讨论】:

    标签: php mysql phpmyadmin payment-gateway


    【解决方案1】:

    更改为以下内容:-

    function GenerateTransID() {    
        $unique_ref_length = 9;  
        $unique_ref_found = false;  
        $possible_chars = "23456789BCDFGHJKMNPQRSTVWXYZ";
        while (!$unique_ref_found) {  
            $unique_ref = "";  
            for($i = 0; $i < $unique_ref_length; $i++) {  
                $char = substr($possible_chars, mt_rand(0, strlen($possible_chars)-1), 1);  
                $unique_ref .= $char;  
            }
    
            $tmp_id = "TR-" . $unique_ref;
            $unique_ref = $tmp_id;
            $query = "SELECT `transactionID` FROM `payment` WHERE `transactionID`='$unique_ref'";  
            $result = mysql_query($query) or die(mysql_error().' '.$query); 
    
            if(mysql_num_rows($result)==0)
            {
                $unique_ref_found = true;  
            }
        }
        return $unique_ref;
    }
    

    对代码进行了一些改进。除此之外,该功能应该按预期工作。您还有另一个与此代码无关的问题,很可能是由于某些其他代码或您的数据库连接造成的。

    【讨论】:

    • 你所做的只是从while更改为for,这也解决不了问题。虽然我确实同意 for 对他来说会更好。
    • @fredrik 执行该函数,它会返回一个有效的事务 ID,请务必注释掉唯一 ID db 检查部分
    【解决方案2】:

    该函数只有在mysql_num_rows($result) == 0 时才会返回,这在程序超时之前可能不会发生。

    尝试在 if 中添加一个 echo 以查看它是否被执行。如果我是你,我会考虑生成 GUID。

    【讨论】:

    • 是的,或者把return $unique_ref;放到while范围内
    • 他也可以这样做——但如果他从不进入关键的 if,那也没关系......
    • 也许我误解了你,但如果你这样输入,函数将返回结果并且不会导致无限循环
    • 他设置while 的方式应该在他将$unique_ref_found 设置为true 时立即停止,他在if 中这样做了。仅当 mysql_num_rows() 曾经返回 0 时,将 return 移到 if 中才会有所帮助。
    • 我写的是移动返回到外部while,而不是if
    【解决方案3】:

    可能是 SQL 查询。但是,除非您对其进行分析,否则您永远不会知道。检查 xdebug:

    http://xdebug.org/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 2013-05-07
      相关资源
      最近更新 更多