冰猫 & PHP files.index.xml
Icecat & PHP files.index.xml
我有几个脚本 运行 每天下载 xml 并查找其中的每个 .xml 并将它们下载到不同的文件夹所以
1234.xml
/
daily.index.xml - - 4567.xml
\
6789.xml
现在我想对 files.index.xml 文件做同样的事情,但是每次我尝试打开索引文件时服务器都会停止:
PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted
(tried to allocate 1073217536 bytes)
有没有办法在我的服务器不断崩溃的情况下打开和剖析 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 文件),希望我可以这样处理它。
根据提供的信息,这里有两个问题。最直接的问题是,在 PHP 脚本已经达到其 1GB 限制(远高于默认限制)后,您正试图为其分配额外的 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 扩展来下载文件。
正如所发布的那样,您的代码将整个远程文件读入内存,然后在将其写入输出文件时复制整个文件。
我有几个脚本 运行 每天下载 xml 并查找其中的每个 .xml 并将它们下载到不同的文件夹所以
1234.xml
/
daily.index.xml - - 4567.xml
\
6789.xml
现在我想对 files.index.xml 文件做同样的事情,但是每次我尝试打开索引文件时服务器都会停止:
PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 1073217536 bytes)
有没有办法在我的服务器不断崩溃的情况下打开和剖析 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 文件),希望我可以这样处理它。
根据提供的信息,这里有两个问题。最直接的问题是,在 PHP 脚本已经达到其 1GB 限制(远高于默认限制)后,您正试图为其分配额外的 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 扩展来下载文件。
正如所发布的那样,您的代码将整个远程文件读入内存,然后在将其写入输出文件时复制整个文件。