2012-03-14 14 views
1

私のクライアントがmysql Webサイトデータベースにmsアクセスデータベースを(定期的に)インポートする必要がある特定の状況があります(リモートデータベースなので)。MysqlデータベースのMicrosoft Accessデータベースのインポート

ホスティングプランは共有ホスティング(vpsではない)なので、ホスティングにODBCをサポートしていないため、SQLを使ってPHPを実行する唯一の方法です。

私の現在の考えは、この1である(obviuslyクライアントはMS-WindowsのOSが持っている):

  • ファイルに書かれた大きなSQLクエリにMS-Accessデータベースを変換する小型のC#アプリケーションを作成します
  • アプリケーションは、PHPスクリプトは、最終的にデータベース
にインポートする、(30分ごとなど)を定期的に実行し、ファイルが存在するかどうかを確認します
  • ウェブサイト上で指定したディレクトリにファイルを送信するFTP情報を使用します。

    私はそれが最良の方法ではないことを知っていますので、この問題の別の回避策を作成するための質問を提案しています。クライアントは既に、自分のms-accessデータベースを使い続けたいと言っています。

    私がもっている最大の問題は、スクリプトを30秒間しか使用できないことです。これは、データをインポートするには問題になります。

  • +0

    前と同じようなプロセスです。 Accessデータベースを有効なMySQLインポートSQLファイルにエクスポートするスクリプトを使用し、リモートサイト上の別のスクリプトが毎晩実行されてファイルが存在するかどうかを確認するFTPサイトにアップロードします。もしそうなら、(何らかのセキュリティチェックの後で)SQLファイルをインポートするでしょう。 –

    +0

    30秒のスクリプト実行制限をどのように扱いますか?どのくらいデータベースが大きくなるか分かりません –

    +0

    http://php.net/manual/en/function.set-time-limit.php – horatio

    答えて

    1

    30秒の制限を回避するには、データをチャンクに分割します。

    if(!file_exists('upload.sql')) exit(); 
    
    $max = 2000; // the maximum number you want to execute. 
    
    if(file_exists('progress.txt')) { 
        $progress = file_get_contents('progress.txt'); 
    } else { 
        $progress = 0; 
    } 
    
    $file = file('upload.sql'); 
    
    foreach($file as $current => $query) { 
        if($current < $progress) continue; // skip the ones we've done 
        if($current - $progress >= $max) break; // stop before we hit the max 
        mysql_query($query); 
    } 
    
    // did we finish the file? 
    if($current == count($file) - 1) { 
        unlink('progress.txt'); 
        unlink('upload.sql'); 
    } else { 
        file_put_contents('progress.txt', $current); 
    } 
    
    +0

    うん、それは私が考えたのと同じアプローチですが、私はあなたがコードでそれを扱う方法が好きです(特に$現在の$進行状況)、私はあなたに数日で結果を教えてくれます。 –

    関連する問題