1万件のCSVを読み込ませるPHPコード雛形です。
動作環境はPHP8系
- Read_csv_class.php…CSV読み込みを行っているファイル(雛形です)。
- index.php…ajaxを使用しRead_csv_class.phpを呼び出しているファイル
- こちらのCSVダミーデータを改変して動作確認をしています。
※ fgetcsv($this->handle, null, ",");の箇所はバージョンより要確認!
追記:テーブルに保存するコードを新たに作りました。
1万件のCSVを読み込みテーブルに保存する雛形コード #PHPCode
Read_csv_class.php
<?php
//ini_set("display_errors","On");
session_start();
class Read_csv{
var $max=10000;
var $cnt=0;
var $handle = null;
/**
* @param string $filename
* @param int $cnt
*/
public function __construct($filename="",$cnt=0)
{
$this->cnt = $cnt;
$this->handle = fopen($filename, "r");
$_SESSION["offset"]?fseek($this->handle,$_SESSION["offset"]):$this->handle;
if ( $this->handle !== FALSE) {
$this->reader();
}
}
/**
* @return void
*/
public function reader():void
{
$response = null;
$data = fgetcsv($this->handle, null, ",");
if($data !== FALSE) {
$_SESSION["offset"] = ftell($this->handle);
$response["data"] = $data;
$response["cnt"] = $this->cnt>$this->max?0:($this->cnt + 1);
print json_encode($response);
}else{
$_SESSION["offset"] = null;
print "";
}
}
}
if (isset($_POST["csrf_token"]) && d_xss($_POST["csrf_token"]) === $_SESSION['csrf_token']) {
$_SESSION["offset"] = (int)d_xss($_POST["reset_flag"])===1?null:d_xss($_SESSION["offset"]);
$filename = d_xss($_POST["filename"]);
$cnt = (int)d_xss($_POST["cnt"]);
//👉$Read_csv = new Read_csv($filename,$cnt);
$Read_csv = null;
}else{
print "";
}
function d_xss($data){
$data = strip_tags($data);
$data = htmlspecialchars($data,ENT_QUOTES);
return $data;
}
index.php
<?php
// ログインした状態と同等にするためセッションを開始します
session_start();
// 暗号学的的に安全なランダムなバイナリを生成し、それを16進数に変換することでASCII文字列に変換します
$toke_byte = openssl_random_pseudo_bytes(16);
$csrf_token = bin2hex($toke_byte);
// 生成したトークンをセッションに保存します
$_SESSION['csrf_token'] = $csrf_token;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="Description" content="Enter your description here"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<title>CSV</title>
</head>
<body>
<input type="hidden" name="csrf_token" value="<?=$csrf_token?>">
<span class="h3" id="cnt"></span><br><br>
<span class="h4" id="read_csv"></span><br><br>
<span class="h4" id="debug"></span><br><br>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.1/umd/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js"></script>
<script>
window.onload = function(){
read_csv(0,1);
};
function read_csv(cnt,reset_flag){
try{
$.ajax({
type: "post",
url: "./Read_csv_class.php",
async: false,
data: {csrf_token:document.getElementsByName("csrf_token")[0].value,reset_flag:reset_flag,filename:"dummy.csv",cnt:cnt},
dataType: "json",
success: function (response) {
if(response){
cnt = response.cnt;
document.getElementById("cnt").innerText = cnt;
document.getElementById("read_csv").innerText = response.data[0];
document.getElementById("debug").innerText = cnt ===21?response.data:document.getElementById("debug").innerText;
setTimeout(function(){read_csv(cnt)},0);
}
}
});
}catch(e){
console.warn(e);
read_csv(cnt);
}
}
</script>
</body>
</html>