【问题标题】:PHP teminates(?) before finishing the script while loading CSVsPHP teminates(?) 在加载 CSV 时完成脚本之前
【发布时间】:2013-06-12 13:29:24
【问题描述】:

我有一个 PHP 脚本文件,它将一系列 CSV 文件加载到 MYSQL 数据库中。

当我从命令行运行脚本时一切顺利,但当我从浏览器运行它时,它在中间退出(大约 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()\">";
?>

怎么了?我该如何调试?

【问题讨论】:

  • mysql_* 函数已弃用...请使用 pdo 或 mysqli
  • 使用phpinfo()查看:max_execution_time的值请看:stackoverflow.com/questions/6932179/…
  • ini_set('display_errors',1);调试或 set_time_limit(0);ini_set('memory_limit','100M');可能解决终止问题
  • 如果您正在从 CSV 大量导入到 mySQL,您应该考虑使用 mySQL 的 LOAD DATA INFILE 功能;它会大量比通过 PHP 循环更快(快几个数量级)。你仍然可以使用 PHP 来运行它;但无需加载文件并循环 65000 次插入,您只需进行一次 SQL 查询并为其指定文件名。

标签: php mysql file csv load


【解决方案1】:

尝试ini_set('max_execution_time', 0); 将 php 脚本设置为运行直到完成。

【讨论】:

    【解决方案2】:

    这是一个超时问题,因为您使用的是 IIS 服务器。整个进程最长执行时间为30秒,php.ini中的max_execution_time或php代码中的set_time_limit()会被忽略。

    在Apache服务器下,30秒只用于脚本执行; IO(文件读取,SQL请求,...)使用的时间被扣除。

    但在 php.ini 中更改 max_execution_time 并不是一个好主意,因为这会影响所有 php 线程,并且可能会由于许多请求在超时到期之前保持打开状态而使服务器过载。

    您可能会在本地使用 php 代码中的 set_time_limit(); 更改此设置

    另一种解决方案是使用页面刷新来划分进程。

    在这个示例中,文件是“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');
    }
    

    【讨论】:

    • 您好,谢谢您的回答。我在 Ubuntu 下使用 Apache .. 你的回答还有意义吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多