当文件正在用file_put_contents()函数写入状态时, 用file_size()函数不会计算出此文件的大小,因为此文件的缓存信息没有更新,需要调用clearstatcache() 函数来清理文件缓存信息,才能够准确计算出文件大小。
$ids = $this->dbAdapter->fetchAll("SELECT `pic_id` FROM `pic` WHERE `pic_state` = 0");
if (empty($ids))
{
exit('No data to sync.');
}
$xmlWriter = new XMLWriter();
$xmlWriter->openMemory();
$xmlWriter->setIndent(true);
$i=1;
$flag = true; //用于判断是否重新写入头文档
foreach ($ids as $key => $idRow)
{
if ($flag)
{
$xmlWriter->startDocument("1.0", "UTF-8");
$xmlWriter->startElement("document");
$xmlWriter->writeElement("pic_appid", "12345678");
$xmlWriter->writeElement("updateperi", 86400);
$xmlWriter->startElement("updatetime");
$xmlWriter->writeCdata(date('Y-m-d'));
$xmlWriter->endElement();
$flag = false; //将flag定义为false
}
$id = $idRow['pic_id'];
$picRow = $this->dbAdapter->fetchRow("SELECT * FROM `pic` WHERE `pic_id` = '{$id}' LIMIT 1");
$xmlWriter->startElement("item");
$xmlWriter->writeElement("op", $picRow['pic_op']);
$xmlWriter->startElement("pic_id");
$xmlWriter->writeCdata($picRow['pic_id']);
$xmlWriter->endElement();
$xmlWriter->startElement("pic_url");
$xmlWriter->writeCdata($picRow['pic_url']);
$xmlWriter->endElement();
$xmlWriter->startElement("pic_fromurl");
$xmlWriter->writeCdata($picRow['pic_from_url']);
$xmlWriter->endElement();
$xmlWriter->startElement("pic_type");
$xmlWriter->writeCdata($picRow['pic_type']);
$xmlWriter->endElement();
$xmlWriter->startElement("pic_tag");
$xmlWriter->writeCdata($picRow['pic_tag']);
$xmlWriter->endElement();
$xmlWriter->startElement("pic_desc");
$xmlWriter->writeCdata($picRow["pic_desc"]);
$xmlWriter->endElement();
$xmlWriter->startElement("pic_title");
$xmlWriter->writeCdata($picRow["pic_title"]);
$xmlWriter->endElement();
$xmlWriter->startElement("pic_time");
$xmlWriter->writeCdata($picRow['pic_time']);
$xmlWriter->endElement();
$xmlWriter->endElement();
if (0 == $key%1000)
{
file_put_contents($this->xmlPath . "data_" . $i . ".xml", $xmlWriter->flush(true), FILE_APPEND);
sleep(5);
clearstatcache();
}
if (filesize($this->xmlPath . "data_" . $i . ".xml") > 5242880) {
//文件大于5m,则换一个文件
echo "the file need to change.<br />";
$i++;
$flag = true;
} else {
echo "The file no need change.<br />";
}
clearstatcache()函数说明:
clearstatcache — 清除文件状态缓存
说明
void clearstatcache ( void )
当使用 stat(),lstat() 或者任何列在受影响函数表(见下面)中的函数时,PHP 将缓存这些函数的返回信息以提供更快的性能。然而在某些情况下,你可能想清除被缓存的信息。例如如果在一个脚本中多次检查同一个文件,而该文件在此脚本执行期间有被删除或修改的危险时,你需要清除文件状态缓存。这种情况下,可以用 clearstatcache() 函数来清除被 PHP 缓存的该文件信息。
必须注意的是,对于不存在的文件,PHP 并不会缓存其信息。所以如果调用 file_exists() 来检查不存在的文件,在该文件没有被创建之前,它都会返回 FALSE。如果该文件被创建了,就算以后被删除,它都会返回 TRUE
Note: 本函数缓存特定文件名的信息,因此只在对同一个文件名进行多次操作并且需要该文件信息不被缓存时才需要调用 clearstatcache()。
受影响的函数包括 stat(),lstat(),file_exists(),is_writable(),is_readable(),is_executable(),is_file(),is_dir(),is_link(),filectime(),fileatime(),filemtime(),fileinode(),filegroup(),fileowner(),filesize(),filetype() 和 fileperms()。