【发布时间】:2011-06-20 22:45:50
【问题描述】:
我有一个 CSV 文件,它有大约 13000 行要更新到 mysql 数据库中。 我的 PHP 函数在大约 5000 行后因超时或内存溢出而停止。
它使用 fgetcsv 循环每一行并检查该行是否已经存在,这导致我猜想超时(SELECT/INSERT/UPDATE 查询)。
我无法删除表格并重新插入所有内容,因为该表格仍然与其他表格有关系。 -> 然后我可以在块中编写一个包含多个值字符串的单个 INSERT 语句,例如5000 行。
我需要找到一种方法来分块读取文件以防止超时。
提前谢谢!
一些代码:
private function readFile()
{
$this->profiler = NULL;
$this->auto_render = FALSE;
$this->request->headers['Content-Type'] = 'application/json';
if (array_key_exists('uploadedfile', $_FILES))
{
$filename = $_FILES['uploadedfile']['tmp_name'];
if ($_FILES['uploadedfile']['type'] == 'application/vnd.ms-excel') // csv file
{
if (is_uploaded_file($filename)) //check if file
{
if ($_FILES['uploadedfile']['error'] == UPLOAD_ERR_OK) //check no errors
{
// time limit : unlimited
set_time_limit(0);
// file handler
$filepointer = fopen($filename,'r');
return $filepointer;
}
}
}
}
}
在另一个函数中,我调用 readFile() 并像这样循环这些行:
while (($line = fgetcsv($filepointer, 1000, ";")) != false)
【问题讨论】:
-
ini_set('max_execution_time', 0)将禁用 PHP 超时。 -
尝试在函数的开头添加这些说明:
set_time_limit(0); ini_set("memory_limit", "1024M"); -
试试这个链接 我相信这个人在用php codingforums.com/archive/index.php/t-185657.html中的csv文件更新mysql表时遇到了和你类似的问题
-
您可以通过简单的 REPLACE 查询来减少查询次数(必须选择和插入/更新)。
-
我已经添加了
ini_set('max_execution_time', 0)和ini_set("memory_limit", "1024M");-> 脚本运行时间更长,但我没有得到回复我也会在明天查看 REPLACE 语句,这可能会减少一些执行时间.