Webmin/Virtualmin - 处理大文件 - 内部服务器错误
Webmin/Virtualmin - Handling with large file - Internal Server Error
我正在使用 PHP 脚本将数组的唯一值插入数据库。这是脚本
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
if (isset($_POST['submit'])) {
$df = $_POST['df'];
$arr = array();
$file = fopen('files/'.$df.'.csv', 'r');
while (($line = fgetcsv($file)) !== false) {
$arr[] = $line[2];
}
$arruniq = array_unique($arr);
fclose($file);
$arr_count = count($arr);
$time = strtotime(date_default_timezone_get());
$ts = date("Y-m-d H:i:s", $time);
$mysqli = new mysqli("localhost", "root", "pass", "tab");
if ($mysqli === false) {
die("ERROR: DB could not connect. ");
}
$sqlins = "insert into tab (created_time, uniq_id) values (?, ?);";
for ($i = 0; $i < $arr_count; $i++) {
if ($stmt = $mysqli->prepare($sqlins)) {
$stmt->bind_param("ss", $ts, $arruniq[$i]);
$stmt->execute();
} else {
echo "ERROR: Could not prepare query";
}
}
$mysqli->close();
}
该脚本正在读取 CSV 文件、唯一值并插入到数据库中。这就是问题所在,如果文件较小,脚本工作正常,但如果我使用较大的文件,我会收到此“500 内部服务器错误”。
服务器 PHP 日志和 apache 日志中没有显示或记录错误。
我什至通过使用ini_set('memory_limit','2048M');
和max_execution_time
headers增加了脚本的执行时间和脚本的内存限制,但也没有用。
这是脚本执行时间的问题。
因为我使用的是 webmin/virtualmin max_execution_time header 没有用。所以我在 virtualmin 服务器中更改了它
virtualmin server -> server configuration -> website options -> Maximum PHP script run time
现在问题已经解决,但是执行脚本的时间比较长。
如果使用准备好的语句和事务,应该会更快。
$mysqli->begin_transaction();
$stmt = $mysqli->prepare("INSERT INTO tab (created_time, uniq_id) values (?, ?);");
foreach($arruniq as $item) {
$stmt->bind_param("ss", $ts, $item);
$stmt->execute();
}
$mysqli->commit();
准备好的语句在正确使用时会给你带来轻微的性能提升,因为服务器不需要每次都解析 SQL 并且事务可以节省你一些时间,因为 commit
没有被调用在每一行之后。
我正在使用 PHP 脚本将数组的唯一值插入数据库。这是脚本
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
if (isset($_POST['submit'])) {
$df = $_POST['df'];
$arr = array();
$file = fopen('files/'.$df.'.csv', 'r');
while (($line = fgetcsv($file)) !== false) {
$arr[] = $line[2];
}
$arruniq = array_unique($arr);
fclose($file);
$arr_count = count($arr);
$time = strtotime(date_default_timezone_get());
$ts = date("Y-m-d H:i:s", $time);
$mysqli = new mysqli("localhost", "root", "pass", "tab");
if ($mysqli === false) {
die("ERROR: DB could not connect. ");
}
$sqlins = "insert into tab (created_time, uniq_id) values (?, ?);";
for ($i = 0; $i < $arr_count; $i++) {
if ($stmt = $mysqli->prepare($sqlins)) {
$stmt->bind_param("ss", $ts, $arruniq[$i]);
$stmt->execute();
} else {
echo "ERROR: Could not prepare query";
}
}
$mysqli->close();
}
该脚本正在读取 CSV 文件、唯一值并插入到数据库中。这就是问题所在,如果文件较小,脚本工作正常,但如果我使用较大的文件,我会收到此“500 内部服务器错误”。
服务器 PHP 日志和 apache 日志中没有显示或记录错误。
我什至通过使用ini_set('memory_limit','2048M');
和max_execution_time
headers增加了脚本的执行时间和脚本的内存限制,但也没有用。
这是脚本执行时间的问题。 因为我使用的是 webmin/virtualmin max_execution_time header 没有用。所以我在 virtualmin 服务器中更改了它
virtualmin server -> server configuration -> website options -> Maximum PHP script run time
现在问题已经解决,但是执行脚本的时间比较长。
如果使用准备好的语句和事务,应该会更快。
$mysqli->begin_transaction();
$stmt = $mysqli->prepare("INSERT INTO tab (created_time, uniq_id) values (?, ?);");
foreach($arruniq as $item) {
$stmt->bind_param("ss", $ts, $item);
$stmt->execute();
}
$mysqli->commit();
准备好的语句在正确使用时会给你带来轻微的性能提升,因为服务器不需要每次都解析 SQL 并且事务可以节省你一些时间,因为 commit
没有被调用在每一行之后。