php - 如何在不超时的情况下解析大型 CSV 文件?

标签 php mysql csv timeout

我正在尝试解析一个 50 兆字节的 .csv 文件。该文件本身很好,但我正试图解决所涉及的大量超时问题。每项都设置为上传明智,我可以轻松上传并重新打开文件,但在浏览器超时后,我收到 500 内部错误。

我的猜测是我可以将文件保存到服务器上,打开它并保留我处理的行的 session 值。在某一行之后,我通过刷新重置连接并在我离开的那一行打开文件。这是一个可行的想法吗?之前的开发者做了一个非常低效的 MySQL 类,它控制了整个站点,所以如果没有必要,我不想自己写类,我也不想弄乱他的类。

TL;DR 版本: 保存我当前所在的最后一行 CSV 文件是否有效,该文件包含 38K 行产品,然后在 X 行后重置连接从我离开的地方开始?或者是否有另一种方法可以在没有超时的情况下解析大型 CSV 文件?

注意: 这是 PHP 脚本执行时间。目前在 38K 行,通过命令行运行大约需要 46 分 5 秒。当我将它从浏览器中删除时,它 100% 的时间都正常工作,这表明它是浏览器超时。据谷歌告诉我,Chrome 的超时是不可编辑的,而 Firefox 的超时很少起作用。

最佳答案

你可以这样做:

<?php

namespace database;

class importcsv
{
    private $crud;

    public function __construct($dbh, $table)
    {
        $this->crud = new \database\crud($dbh, $table);
        return $this;
    }

    public function import($columnNames, $csv, $seperator)
    {
        $lines = explode("\n", $csv);

        foreach($lines as $line)
        {
            \set_time_limit(30);
            $line = explode($seperator, $line);

            $data = new \stdClass();

            foreach($line as $i => $item) 
            {
                if(isset($columnNames[$i])&&!empty($columnNames[$i]))
                    $data->$columnNames[$i] = $item;
            }

            @$x++;

            $this->crud->create($data);
        }

        return $x;
    }

    public function importFile($columnNames, $csvPath, $seperator)
    {
        if(file_exists($csvPath))
        {
            $content = file_get_contents($csvPath);
            return $this->import($columnNames, $content, $seperator);
        }
        else
        {
            // Error
        }
    }
}

TL;DR:\set_time_limit(30); 每次循环遍历一行都可能会解决超时问题。

关于php - 如何在不超时的情况下解析大型 CSV 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11800101/

相关文章:

php - SplObjectStorage::contains 和 SplObjectStorage::offsetExists 之间有什么区别?

javascript - FullCalendar 上的动态时段

java - 错误本质上是致命的......对于进程还是线程?

mysql - 在 mysql 中重命名具有外键约束的列 - 无论如何都可以使其更容易?

python - Pandas 函数 read_csv 返回 SyntaxError : invalid token unexpectedly

php - MySQL 查询过滤器和排序行匹配类似于工作匹配或功能比较

php - 如何确保在 zend 中关闭浏览器时 session 被销毁

Python - 查找 csv 文件中每列的平均值,不包括标题和时间

Mysql隐式类型转换产生错误的结果

Python CSV文件解析为日期时间,抛出时间格式错误