2

そのループを実行する方法:

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

PHP が 30 秒後にフリーズしないようにするには?

何かを入出力するたびに接続するのではなく、データベース全体を配列または *.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);

}

?>
4

2 に答える 2

1

(1) クエリごとに接続を開いたり閉じたりする必要はありません。各サーバーに対して 1 つの接続を開き、複数のmysql_query()呼び出しを行います。これでかなりスピードアップするはずです。

(2) "SELECT * FROM BetterShopItemStock" を使用しないでください。必要な行のみを選択してください。(ここでは「名前」)。また、すでにそのテーブルで「NAME」を照会している場合は、2 回目の呼び出しを行うのではなく、同時に「AMT」を選択してください。

(3) HighCharts への select 呼び出しと update 呼び出しを 1 つのクエリに組み合わせることができます。

全体として、すべてが次のようになります。

<?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を調べて実行時間を延長してください。

于 2012-07-20T00:37:25.267 に答える
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();
?>
于 2012-07-20T00:43:25.947 に答える