我有一个人为我编写的PHP脚本,它采用Google Alert Feed并删除每个Feed项的URL部分,生成标准RSS Feed,其中包含直接指向原始源URL的链接。
例如,它需要一个谷歌警报URL并通过脚本运行它,如下所示: http://foo.com/feeds/xml-converter.php?file_name=[path输出文件]& tempfile = [路径到tempfile]& link = [Google Alert URL]
结果是一个干净的RSS提要减去Google重定向信息。
这是脚本:
<?php
set_time_limit(60);
$link = 'variable';
$tempfile = 'variable';
$file_name = 'variable';
extract($_GET);
//load xml and save to temp file
$xml=simplexml_load_file($link) or die("Error: Cannot create object");
$xml->asXml($tempfile);
//load xml from temp file
$xml=simplexml_load_file($tempfile) or die("Error: Cannot create object");
//iterate all the linkmy
foreach($xml->entry as $entry) {
$url = $entry->link['href'];
preg_match("/url=(.*?)&/",$url,$program);
$entry->link['href'] =$program[1];
}
if (file_exists($file_name) && isset($link) && isset($file_name)) {
unlink($file_name);
}
$xml->asXml($file_name);
unlink($tempfile);
?>
脚本通常可以正常运行,并且在大多数情况下运行时间不到一秒。
但是,我遇到的问题是,有时在服务器上运行脚本的进程会以100%的处理器使用率无休止地运行。
当我使用strace来观察发生的事情时,我会一次又一次地一遍又一遍地完成这三个步骤,无休止地:
wait4(-1, 0x7ffcc3390550, WNOHANG|__WALL, NULL) = -1 ECHILD (No child processes)
lseek(5, 0, SEEK_SET) = 0
getdents(5, /* 170 entries */, 32768) = 5088
wait4(-1, 0x7ffcc3390550, WNOHANG|__WALL, NULL) = -1 ECHILD (No child processes)
lseek(5, 0, SEEK_SET) = 0
getdents(5, /* 170 entries */, 32768) = 5088
wait4(-1, 0x7ffcc3390550, WNOHANG|__WALL, NULL) = -1 ECHILD (No child processes)
lseek(5, 0, SEEK_SET) = 0
getdents(5, /* 170 entries */, 32768) = 5088
等
我在一个cron作业上运行这个脚本,虽然它在大多数情况下工作得很好,但它偶尔会创建一个永无止境的过程。随着时间的推移,多个进程会以这种方式运行,所有进程都固定在处理器的100%处。
我希望有人可以告诉我如何改进脚本以防止发生这种不幸和意外的偶然结果。