加载 CSV 文件时,PHP 在完成脚本之前终止(?)

标签 php mysql file csv load

我有一个 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()\">";
?>

怎么了?我该如何调试?

最佳答案

这是一个超时问题,因为您使用的是 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”(用于 header 命令)

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');
}

关于加载 CSV 文件时,PHP 在完成脚本之前终止(?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17133207/

相关文章:

mysql - 左连接和,组麻烦

C: fseek() 未指向定义的字节数

javascript - 从mysql查询生成的多个文本区域中选择一个文本区域

php - 如果已经使用了 mysql_select_db,你能对两个数据库进行查询吗?

mysql - 优化 MySQL 查询

php - 未知的 mysql 语法错误代码在工作台中运行良好,但在 php mysqli 中抛出错误

java - 调用restTemplate.exchange()时出现IllegalStateException

java - 如何从资源文件夹加载文件?

php - Laravel 使用 Sum 和 Groupby

javascript - 为什么同一个功能在不同浏览器显示不同