2012-07-20 98 views
2

如何执行该循环:PHP冻结:如何循环连接到2个MySQL数据库

while ($row = mysql_fetch_array($result)) { 
    collectData($row['NAME']); 
} 

30秒后未冻结我的PHP?

我认为可以通过将整个数据库转换为数组或* .temp文件来处理它,而不是每次我想要输入/输出时连接。但是我在文件和数组上遇到了问题,所以我就这样问:为什么最好/最好的方法快速而无痛地做到这一点?

<?php 

//fiveMin - Database that data is taken form 
//HighCharts - Database that data is transferred to 

$fiveMin=mysql_connect($fiveMin_host,$fiveMin_user,$fiveMin_pass); 
mysql_select_db($fiveMin_db,$fiveMin) or die (mysql_error());    

$query="SELECT * FROM BetterShopItemStock"; 
$result = mysql_query($query); 
while ($row = mysql_fetch_array($result)) { 
    collectData($row['NAME']); 
} 

function collectData($itemID) { 

    global $fiveMin_host, $fiveMin_user, $fiveMin_pass, $fiveMin_db, $week_host, $week_user, $week_pass, $week_db; 

    $fiveMin=mysql_connect($fiveMin_host,$fiveMin_user,$fiveMin_pass); //Load and store data from fiveMin Database 
    mysql_select_db($fiveMin_db,$fiveMin) or die (mysql_error()); 
    $function_Query="SELECT AMT FROM BetterShopItemStock WHERE NAME = '$itemID'"; 
    $function_Ask = mysql_query($function_Query); 
    $function_Result = mysql_fetch_row($function_Ask, 0); 
    $dataReadyToImport = "," . $function_Result[0]; 
    @mysql_close($fiveMin); 

    $HighCharts=mysql_connect($week_host,$week_user,$week_pass); //Save stored data to weekly Database 
    mysql_select_db($week_db,$HighCharts) or die (mysql_error()); 
    $function_Query="SELECT AMT FROM BetterShopItemStock WHERE NAME = '$itemID'"; 
    $function_Ask = mysql_query($function_Query); 
    $function_Result = mysql_fetch_row($function_Ask, 0); 
    $storedData = $function_Result[0]; 
    $dataReadyToImport = $storedData . $dataReadyToImport; 
    mysql_query("UPDATE BetterShopItemStock SET AMT='$dataReadyToImport' WHERE NAME='$itemID'"); 

    @mysql_close($HighCharts); 

} 

?> 
+0

由于30秒的(默认)最大执行时间已经过去,PHP是否冻结或死亡? – drew010 2012-07-20 00:34:08

+0

它的停止速度甚至超过了30秒,但表示它延长了它。 – IlikeITalot 2012-07-20 06:53:42

回答

1

(1)你不必打开和关闭,每次查询的连接 - 开一个连接到每个服务器,并多次mysql_query()调用它们。这应该会加快你的速度。 (2)不要使用“SELECT * FROM BetterShopItemStock”...只选择你需要的行。 (这里是'NAME')。如果您已经在查询该表的'NAME',请同时选择'AMT',而不是再次打电话给它。

(3)您可以将您的选择和更新呼叫组合到一个查询中。

总之,一切都应该是这个样子:

<?php 

    //fiveMin - Database that data is taken form 
    $fiveMin=mysql_connect($fiveMin_host,$fiveMin_user,$fiveMin_pass); 
    mysql_select_db($fiveMin_db,$fiveMin) or die (mysql_error()); 

    //HighCharts - Database that data is transferred to 
    $HighCharts=mysql_connect($week_host,$week_user,$week_pass); //Save stored data to weekly Database 
    mysql_select_db($week_db,$HighCharts) or die (mysql_error()); 

    $query="SELECT NAME,AMT FROM BetterShopItemStock"; 
    $result = mysql_query($query,$fiveMin); 
    while ($row = mysql_fetch_row($result)) { 
     collectData($row[0],$row[1],$HighCharts); 
    } 

    function collectData($itemID, $itemAmt, $mysql) { 
     $id = mysql_real_escape_string($itemID); 
     $amt = mysql_real_escape_string($itemAmt); 
     $q = "UPDATE BetterShopItemStock SET ". 
      "AMT=CONCAT(AMT,',','$amt') WHERE NAME='$id'"; 
     $r = mysql_query($q,$mysql); 
     return (!$r ? false : true); 


    } 

    //now close the databases 
    @mysql_close($HighCharts); 
    @mysql_close($fiveMin); 
?> 

(4)最后,如果您有执行超时错误,看看PHP的set_time_limit延长你的执行时间

+0

请问我在哪里有多个mySqlquery?你为什么要改变我的方法?我将数据从一个数据库附加到另一个数据库。 '函数collectData($ itemID,$ itemAmt,$ mysql)' - 这是生病的。为什么我需要增加$ itemAmt和$ mysql? – IlikeITalot 2012-07-20 07:02:15

+0

包括'$ itemAmt'可以防止您必须进行第二次'SELECT'调用才能获得'AMT'列。 '$ mysql'就是你要更新的数据库的mysql连接(这里是'$ HighCharts') – cegfault 2012-07-21 05:11:24

0

独立每份进入上课后和他们一起工作。它使它们更有效地运行,并且查询不会互相影响:

<?php 
class class1{ 
    function fivemin(){ 
      **code0** 
    } 
    function collectdata1-fivemin() { 
      class1::fivemin(); 
      **code** 
    } 
    function collectdataHighcharts(){ 
      class1::fivemin(); 
      **code2** 
    } 
} 
$a = new class1; 
$a->collectdata1-fivemin(); 
$a->collectdata1HighCharts(); 
?> 
+0

'$ a-> collectdata1-fivemin();'是做什么的? – IlikeITalot 2012-07-20 07:03:38