Php 尝试上载非常大的文件时,本地主机内存不足
我正在尝试上载csv文件,以便我可以将这些数据上载到数据库中。 其代码如下所示Php 尝试上载非常大的文件时,本地主机内存不足,php,laravel,laravel-5,phpmyadmin,Php,Laravel,Laravel 5,Phpmyadmin,我正在尝试上载csv文件,以便我可以将这些数据上载到数据库中。 其代码如下所示 public function upload(Request $request){ set_time_limit(0); ini_set('MAX_EXECUTION_TIME', 36000); $file = Input::file('file'); $filePath = $file->getRealPath(); $hand
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');
}
我的系统配置:
窗口机64位
问题
它不仅无法上传,而且还关闭了开发服务器,即localhost:8000
有谁能告诉我为什么会发生这种情况,我该如何解决它。
我确实在StackOverflow上跟踪了几个线程,就像这样
但不幸的是,这些解决方案没有任何帮助。我会检查您的Windows事件查看器,尝试跟踪服务器崩溃的原因。这将有助于你了解问题所在 如果找不到崩溃源,并且由于使用的是7.1和大型文件,请尝试使用生成器处理该文件。你正在把整个事情载入记忆。即使有这么大的内存限制,我仍然认为将整个文件加载到内存中可能是您的问题 这将一行一行地对其进行流式处理,但您可以找到允许您对文件进行分块的其他示例
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');
}
公共函数读取文件($file)
{
$fp=fopen($file,'r');
while(($line=fgets($fp))!==false)
收益率$line;
fclose($fp);
}
公共功能上传(请求$Request){
设置时间限制(0);
ini设置(“最大执行时间”,36000);
$file=Input::file('file');
$filePath=$file->getRealPath();
foreach(将文件($filePath)读取为$line)
{
>
}
return redirect()->back()->带有('success','File upload successfully');
}
同一问题可能重复,但这些解决方案不起作用。请检查我的php.ini设置。我已经应用了这些解决方案。我正试图上传的文件是1.6GB,因此应用程序关闭本地服务器的原因毫无意义。编辑Apache配置非常快;)您正在运行什么版本的PHP?文件是2GB还是1.6GB?这不是快速编辑,只是为了防止你没有注意到,我在发布这个问题时添加了php.ini设置。我使用的是PHP7.1
。我试图上传的文件是1.6GB,我还有一个文件是4.3GB。我想上传这两个选项OK,你的内存限制的配置值是多少?谢谢erik的建议。我会试试:))
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');
}