gpt4 book ai didi

php - 在 php 中调用大量 mysql_query 后出现 500 错误

转载 作者:行者123 更新时间:2023-11-29 03:13:39 25 4
gpt4 key购买 nike

我有一个 php 脚本,它遍历包含制表符分隔文件的文件夹,逐行解析它们并将数据插入 mysql 数据库。由于服务器的安全限制,我无法使用 LOAD TABLE,而且我无权访问配置文件。该脚本可以很好地解析 1 或 2 个较小的文件,但是当处理多个大文件时,我会收到 500 错误。似乎没有包含与错误相关的消息的任何错误日志,至少我的托管服务提供商没有给我访问权限。下面是代码,我也乐于接受关于以其他方式做我需要做的事情的建议。最终,我希望这个脚本每 30 分钟左右触发一次,插入新数据并在完成后删除文件。

编辑:按照 Phil 的建议进行更改后,脚本仍然失败,但我现在的错误日志中有以下消息“mod_fcgid:读取数据在 120 秒内超时”,看起来脚本超时了,不知道我在哪里可以更改超时设置吗?

$folder = opendir($dir);
while (($file = readdir($folder)) !== false) {
$filepath = $dir . "/" . $file;

//If it is a file and ends in txt, parse it and insert the records into the db
if (is_file($filepath) && substr($filepath, strlen($filepath) - 3) == "txt") {
uploadDataToDB($filepath, $connection);
}
}

function uploadDataToDB($filepath, $connection) {
ini_set('display_errors', 'On');
error_reporting(E_ALL);
ini_set('max_execution_time', 300);

$insertString = "INSERT INTO dirty_products values(";

$count = 1;

$file = @fopen($filepath, "r");

while (($line = fgets($file)) !== false) {
$values = "";
$valueArray = explode("\t", $line);
foreach ($valueArray as $value) {
//Escape single quotes
$value = str_replace("'", "\'", $value);
if ($values != "")
$values = $values . ",'" . $value . "'";
else
$values = "'" . $value . "'";
}

mysql_query($insertString . $values . ")", $connection);
$count++;
}

fclose($file);

echo "Count: " . $count . "</p>";
}

最佳答案

我要做的第一件事是使用准备好的语句(使用 PDO)。

使用 mysql_query() 函数,您正在为每个插入创建一个新语句,您可能会超出允许的限制。

如果您使用准备好的语句,则只会在数据库服务器上创建和编译一个语句。

例子

function uploadDataToDB($filepath, $connection) {
ini_set('display_errors', 'On');
error_reporting(E_ALL);
ini_set('max_execution_time', 300);

$db = new PDO(/* DB connection parameters */);
$stmt = $db->prepare('INSERT INTO dirty_products VALUES (
?, ?, ?, ?, ?, ?)');
// match number of placeholders to number of TSV fields

$count = 1;

$file = @fopen($filepath, "r");

while (($line = fgets($file)) !== false) {
$valueArray = explode("\t", $line);
$stmt->execute($valueArray);
$count++;
}

fclose($file);
$db = null;

echo "Count: " . $count . "</p>";
}

考虑到您想按计划运行此脚本,我将完全避免使用 Web 服务器,而是使用 cron 或您的主机提供的任何计划服务通过 CLI 运行脚本。这将帮助您避免在 Web 服务器中配置的任何超时。

关于php - 在 php 中调用大量 mysql_query 后出现 500 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4211375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com