我运行了几个脚本,下载每日xml并查找其中的每个.xml并将它们下载到另一个文件夹,以便
1234.xml
/
daily.index.xml - - 4567.xml
\
6789.xml
现在我希望对files.index.xml文件执行相同的操作,但每次我尝试打开索引文件时,服务器都会停止:
PHP致命错误:允许的内存大小为1073741824字节 (试图分配1073217536字节)
有没有办法打开并解析files.index.xml而不会让我的服务器不断崩溃?
更新: 我相信服务器在运行脚本时会挂起,因为一些XML文件存储在目录
中脚本:
// URL for index file
$url = "http://data.icecat.biz/export/level4/EN/files.index.xml";
// Custom header (username/pass is a paid account, so I can't share the credentials)
$context = stream_context_create(array (
'http' => array (
'header' => 'Authorization: Basic ' . base64_encode("username:pass")
)
));
// Get XML File
$indexfile = file_get_contents($url, false, $context);
// Save XML
$file = '../myhomeservices/fullindex/files_index.xml';
unlink($file);
$dailyfile = fopen("../myhomeservices/fullindex/files_index.xml", "w") or die("Unable to open file!");
chmod($dailyfile, 0777);
// Write the contents back to the file
$dailyxmlfile = fwrite($dailyfile, $indexfile);
if($dailyxmlfile){
} else {
echo 'Error!';
}
fclose($myfile);enter code here
Apache记录'file_get_contents($ url,false,$ context);'导致最大化记忆。
目前我正在尝试上传files.index.xml(1,41gb文件),希望我能以这种方式处理它。
答案 0 :(得分:2)
根据提供的信息,这里有两个问题。最直接的问题是,在您的PHP脚本已经达到其1GB限制(远高于默认限制)后,您将尝试为PHP脚本分配额外的1GB内存。假设您正在使用PHP 5.1+,您可以一起使用fopen()
和file_put_contents()
来缓冲HTTP和磁盘之间的文件:
<?php
$url = "http://data.icecat.biz/export/level4/EN/files.index.xml";
// Custom header (username/pass is a paid account, so I can't share the credentials)
$context = stream_context_create(array (
'http' => array (
'header' => 'Authorization: Basic ' . base64_encode("username:pass")
)
));
$file = '../myhomeservices/fullindex/files_index.xml';
@unlink($file);
chmod($file, 0777);
// Write the contents back to the file
if (!file_put_contents($file, fopen($url, 'r', false, $context)))
{
echo 'Error!';
}
如果您需要更多地控制缓冲,可以在读取时fread()
来自HTTP的固定大小缓冲区和fwrite()
缓冲区到输出文件。如果你更喜欢cURL处理缓冲,你也可以使用PHP cURL扩展来下载文件。
发布时,您的代码将整个远程文件读入内存,然后在将其写入输出文件时复制整个文件。