在php中多次调用mysql_查询后出现500错误

在php中多次调用mysql_查询后出现500错误,php,mysql,explode,fgets,Php,Mysql,Explode,Fgets,我有一个php脚本,它逐步遍历包含制表符分隔文件的文件夹,逐行解析它们,并将数据插入mysql数据库。由于服务器上的安全限制,我无法使用LOAD TABLE,并且我无权访问配置文件。该脚本可以很好地解析1或2个较小的文件,但是当处理多个较大的文件时,会出现500错误。似乎没有任何错误日志包含与该错误相关的消息,至少我的主机提供商不允许我访问任何错误日志。下面是代码,我也愿意接受关于做我需要做的事情的替代方法的建议。最后,我希望这个脚本每隔30分钟左右启动一次,插入新数据,完成后删除文件 编辑:在

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

编辑:在进行Phil建议的更改后,脚本仍然失败,但我现在的错误日志中有以下消息“mod_fcgid:read data timeout in 120 seconds”,看起来脚本超时了,知道在哪里可以更改超时设置吗

$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>";
}
$folder=opendir($dir);
while(($file=readdir($folder))!==false){
$filepath=$dir.“/”$file;
//如果它是一个文件,以txt结尾,则解析它并将记录插入数据库
如果(is_file($filepath)和&substr($filepath,strlen($filepath)-3)=“txt”){
uploadDataToDB($filepath,$connection);
}
}
函数uploadDataToDB($filepath,$connection){
ini_设置(“显示错误”、“打开”);
错误报告(E_全部);
ini设置(“最大执行时间”,300);
$insertString=“插入脏产品值(”;
$count=1;
$file=@fopen($filepath,“r”);
while(($line=fgets($file))!==false){
$values=“”;
$valueArray=explode(“\t”,$line);
foreach($valueArray作为$value){
//转义单引号
$value=stru替换(“'”、“\'”、$value);
如果($values!=“”)
$values=$values.,“$value.”;
其他的
$values=“”””$value。“”;
}
mysql_查询($insertString.$values.“)”,$connection);
$count++;
}
fclose($文件);
回声“计数:.”计数“

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

使用
mysql\u 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>";
}
函数uploadDataToDB($filepath,$connection){
ini_设置(“显示错误”、“打开”);
错误报告(E_全部);
ini设置(“最大执行时间”,300);
$db=新的PDO(/*db连接参数*/);
$stmt=$db->prepare('插入脏产品值(
?, ?, ?, ?, ?, ?)');
//将占位符的数量与TSV字段的数量匹配
$count=1;
$file=@fopen($filepath,“r”);
while(($line=fgets($file))!==false){
$valueArray=explode(“\t”,$line);
$stmt->execute($valueArray);
$count++;
}
fclose($文件);
$db=null;
回声“计数:.”计数“

”; }

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

看起来它可能在失败之前处理了更多的行,但在解析所有文件之前,它最终仍然会给出500错误。这就是说,我的错误日志现在包含了一条有用的消息。“mod_fcgid:read data timeout in 120 seconds”谷歌快速搜索并没有找到解决方案,但我会继续寻找。看起来可能是Apache对CGI脚本的超时。考虑到您希望按计划运行此脚本,我会完全避免使用web服务器,并使用cron或主机提供的任何计划服务通过CLI运行脚本。是的,我认为您是对的。谢谢如果你把这个作为回答,我会接受的。