1

一連の CSV ファイルを MYSQL データベースにロードする PHP スクリプト ファイルがあります。

コマンドラインからスクリプトを実行するとすべてうまくいきますが、ブラウザから実行すると途中で終了し(約65000レコード後)、4つのファイルが表示されます。

<?

if (isset($argv)) 
{
    $_GET['load_date'] = $argv[1];
}

LoadFile('file1.csv');
LoadFile('file2.csv');
LoadFile('file3.csv');
LoadFile('file4.csv');
LoadFile('file5.csv');
LoadFile('file6.csv');
LoadFile('file7.csv');

function LoadFile($File_Name) 
{

    //global $serverinfo, $username, $password, $database, $dir_path, $dir_env;
    include("datacon.inc.php");

    mysql_connect($serverinfo, $username, $password);
    @mysql_select_db($database) or die("Unable to select database");

    //check if the file is existed
    if (file_exists($File_Name) == FALSE) {
        ECHO "<FONT COLOR=\"red\"> <b> " . $File_Name . " wasn't found </b> </FONT> <br>";
        return;
    } else {
        ECHO $File_Name . " was found, start loading...<br>";
    }

    //Import uploaded file to Database
    $file_handle = fopen($File_Name, "r");

    while (($line_of_data = fgetcsv($file_handle, 0, ",", "\"", "\r\n")) !== FALSE) {


        $line_import_query = "INSERT STATEMENT...";

        //echo $line_import_query . "<BR><br>"; 
        mysql_query($line_import_query) or die(mysql_error());
    }

    $Count_records_query =
            "SELECT COUNT(*) AS COUNTS FROM `" . $database . "`.`TBL_TABLE`";

    $Count_records_query_result = mysql_query($Count_records_query);
    $Count_records = mysql_result($Count_records_query_result, 0, "COUNTS");

    if ($Count_records <= 0) {
        mysql_close();
        echo "No records were loaded on " . $File_Name . ", somthing is wrong, check the file location/structure <br>";
    } else {
        echo "<FONT COLOR=\"red\"> <b> " . $File_Name . " were inserted </b> </FONT> <br>";
        # Disconnect from the database.
    }

    fclose($File_Name, "r");
    // close the connection
    mysql_close();
    return;
}

echo "Disconnected from database successfully! <br><br>
           <input type=\"Button\" value=\"Ok, Finished! Back\" onclick=\"history.back()\">";
?>

どうしたの?どうすればこれをデバッグできますか?

4

2 に答える 2

3

これは、IIS サーバーを使用しているため、タイムアウトの問題です。プロセス全体の最大実行時間は 30 秒で、max_execution_timephp.ini またはset_time_limit()php コードの設定は無視されます。

Apache サーバーでは、30 秒はスクリプトの実行のみに使用されます。IO (ファイル読み取り、SQL 要求など) に費やされた時間は差し引かれます。

ただし、php.ini を変更することはお勧めできません。max_execution_timeこれは、すべての php スレッドに影響を与え、タイムアウトの期限が切れるまで多くの要求が開かれたままになるため、サーバーが過負荷になる可能性があるためです。

例外的set_time_limit();に、php コードでこの設定をローカルに変更する場合があります

別の解決策は、ページの更新を使用してプロセスを分割することです。

このサンプルでは、​​ファイルは「LoadCSV.php」です (ヘッダー コマンドで使用)。

If (isset($_SESSION['ProcessId'])){  // process Phase    
  $P=$_SESSION['ProcessId'];
  LoadFile($_SESSION['ProcessArray'][$P]);  //All echo must be removed from LoadFile !!! 
  $P+=1;
  if ($P<(count($_SESSION['ProcessArray'])-1)){
    header('location: LoadCSV.php?Action=ImportFiles');
  }
  else{  // end Phase
     unset($_SESSION['ProcessArray']);
     unset($_SESSION['ProcessId']);

     echo 'Finished';

  }
}
else{  // Init Phase
  $LoadArray=array(
    'file1.csv',
    'file2.csv',
    'file3.csv',
    'file4.csv',
    'file5.csv',
    'file6.csv',
    'file7.csv'
  );
  $_SESSION['ProcessArray']=$LoadArray;
  $_SESSION['ProcessId']=0;
  header('location: LoadCSV.php?Action=ImportFiles');
}
于 2013-06-16T13:23:40.483 に答える
0

ini_set('max_execution_time', 0);完了するまでphpスクリプトを実行するように設定してみてください。

于 2013-06-16T12:31:38.053 に答える