2017-06-14 3 views
0

このコードは、ブラウザで実行すると動作します。私はcronを介してスクリプトを実行すると、配列を通過せず途中で停止しますか?どうしてこれなの?mysqlはforeachループ内に挿入され、cronは動作しません。

$url_array = array("eur-gbp","eur-aud","usd-chf","eur-usd","eur-jpy","gbp-jpy","eur-cad","eur-chf","usd-cad","usd-jpy","cad-chf","cad-jpy","gbp-usd","aud-usd","gbp-chf","chf-jpy","gbp-cad","aud-cad","aud-chf","aud-jpy","aud-nzd","eur-nzd","gbp-aud","gbp-nzd","nzd-chf","nzd-usd","nzd-cad","nzd-jpy"); 
$option_array = array(1,2,3,4,5,6,7); 

$type_array = array(1,2,3,4,5,6); 

foreach($url_array as $url_type) { 
    //code 
    foreach($option_array as $option) { 
     //code 
     foreach($duration_array as $duration) { 
      //code 
      foreach($type_array as $type) { 
       //mysql insert 

       $sql = "SELECT * FROM `data_analysis` WHERE date_time='".$date."' AND type='".$url_type."' LIMIT 1"; 
       $query = $this->db->query($sql); 

       $result = $query->fetch_assoc(); 

       if($result){ 
        $sql = "UPDATE `data_analysis` SET value='".$percentage."', price_change='".$price."', parent='1' WHERE date_time='".$date."' AND type='".$url_type."'"; 
       } else { 
        $sql = "INSERT IGNORE INTO `data_analysis` (date_time,value,price_change,type,parent) VALUES ('".$date."','".$percentage."','".$price."','".$url_type."','1')"; 
       } 
      } 
     } 
    } 
} 

これは、投稿するには時間がかかりすぎるほど正確なコードではありません。コードはブラウザで完全に動作しますか? cron経由で実行すると、gbp-jpyで停止しますか?どうしてこれなの?

mysqlクエリ制限はありますか?

+0

スクリプトはしばらく実行されますか?どのようにcron経由でPHPを呼びますか? php-cliのphp.iniファイルで 'max_execution_time'や' memory_limit'の値を調整する必要があるかもしれません。ウェブサーバー上で設定が異なるかもしれません。 – chrki

+0

私はcpanel経由でスクリプトを呼び出します。 max_execution_timeは2時間、メモリの制限は無制限(-1)です。php.iniに設定しました。スクリプトは約15分かかります。 – mdnba50

+0

'SELECT'の後に' INSERT'または 'UPDATE'を使用する代わりに、' INSERT ... ON DUPLICATE KEY UPDATE'を使用してください。 – Barmar

答えて

1

(type, date_time)にユニークなインデックスを追加してください。次に、2つのクエリを1に結合します。また、準備済みのステートメントを使用します。

$stmt = $this->db->prepare(" 
    INSERT INTO data_analysis (date_time, value, price_change, type, parent) 
    VALUES (?, ?, ?, ?, '1') 
    ON DUPLICATE KEY UPDATE value = VALUES(value), price_change = VALUES(price_change), parent = VALUES(parent)"); 

$stmt->bind_param("ssss", $date, $percentage, $price, $url_type); 

foreach($url_array as $url_type) { 
    //code 
    foreach($option_array as $option) { 
     //code 
     foreach($duration_array as $duration) { 
      //code 
      foreach($type_array as $type) { 
       //mysql insert 
       $stmt->execute(); 
      } 
     } 
    } 
} 
関連する問題