我正在尝试上载csv文件,以便可以将那些数据上载到数据库中。 相同的代码与下面的
public function upload(Request $request){
set_time_limit(0);
ini_set('MAX_EXECUTION_TIME', 36000);
$file = Input::file('file');
$filePath = $file->getRealPath();
$handle = fopen($filePath, "r");
while(!feof($handle))
{
<< DO THE DATABASE OPERATION >>
}
fclose($handle);
return redirect()->back()->with('success', 'File uploaded successfully');
}
如果文件大小较小,可以说大约100或200mb,则此方法很好。但是,当文件大小很大时,例如2GB。它关闭本地服务器。在控制台中,它说内存不足
我的php.ini设置是:
post_max_size=10000M
upload_max_filesize=10000M
我的系统配置:
64位视窗机器
问题
不仅上传失败,而且关闭了开发服务器,即localhost:8000
任何人都可以告诉我为什么会发生这种情况以及如何解决。 我确实在StackOverflow上遵循了这样的几个线程
phpMyAdmin: Can't import huge database file, any suggestions?
Large file uploads failing php
Uploading a file larger than 2GB using PHP
但是不幸的是,这些解决方案没有帮助。
答案 0 :(得分:0)
我将检查您的Windows事件查看器,以尝试查找服务器崩溃的原因。希望可以使您对问题的根源有一些了解。
如果找不到崩溃的根源,并且由于使用的是7.1和大型文件,请尝试使用生成器处理文件。您正在将整个内容加载到内存中。即使memory_limit值很大,我仍然认为将整个文件加载到内存中可能是您的问题。
http://php.net/manual/en/language.generators.php
这将逐行流式传输它,但是您可以找到其他示例来对文件进行分块。
public function read_file($file)
{
$fp = fopen($file, 'r');
while(($line = fgets($fp)) !== false)
yield $line;
fclose($fp);
}
public function upload(Request $request){
set_time_limit(0);
ini_set('MAX_EXECUTION_TIME', 36000);
$file = Input::file('file');
$filePath = $file->getRealPath();
foreach(read_file($filePath) as $line)
{
<< DO THE DATABASE OPERATION >>
}
return redirect()->back()->with('success', 'File uploaded successfully');
}