如何在这个PHP脚本中形成XML?

如何在这个PHP脚本中形成XML?,php,xml,Php,Xml,我在Amazon CloudFront CDN中找到了使文件无效的方法,我想让它自动化 它的一部分使用XML,其中添加了文件路径 $xml = <<<EOD <InvalidationBatch> <Path>/index.html</Path> <Path>/blog/index.html</Path> <CallerReference>{$distribution}{$epoch

我在Amazon CloudFront CDN中找到了使文件无效的方法,我想让它自动化

它的一部分使用XML,其中添加了文件路径

$xml = <<<EOD
<InvalidationBatch>
    <Path>/index.html</Path>
    <Path>/blog/index.html</Path>
    <CallerReference>{$distribution}{$epoch}</CallerReference>
</InvalidationBatch>
EOD;
这是为了在使用cron脚本对新图像文件上载进行优化后使其无效

使问题进一步复杂化的是,路径只需要包含从wp内容目录开始的内容,因此XML最终会是这样的:

find /srv/domain.com/wp-content/uploads/ -user www-data
$xml = <<<EOD
<InvalidationBatch>
    <Path>/wp-content/uploads/2014/02/ED_Wedluxe-CuveeRose-364x400.jpg</Path>
    <Path>/wp-content/uploads/2014/02/VALENTINE_PROMOTION_1-165x213.jpg</Path>
    <Path>/wp-content/uploads/2014/02/ED_Wedluxe-CuveeRose-165x220.jpg</Path>
    <Path>/wp-content/uploads/2014/02/ED_Wedluxe-CuveeRose-371x495.jpg</Path>
    <Path>/wp-content/uploads/2014/02/VALENTINE_PROMOTION_1-471x609.jpg</Path>
    <Path>/wp-content/uploads/2014/02/VALENTINE_PROMOTION_1.jpg</Path>
    <Path>/wp-content/uploads/2014/02/VALENTINES14-WEB_banner-794x4761-687x412.jpg</Path>
    <Path>/wp-content/uploads/2014/02/VALENTINES14-WEB_banner-794x4761-300x180.jpg</Path>
    <Path>/wp-content/uploads/2014/02/VALENTINES14-WEB_banner-794x4761.jpg</Path>
    <Path>/wp-content/uploads/2014/02/VALENTINE_PROMOTION_1-150x150.jpg</Path>
    <Path>/wp-content/uploads/2014/02/VALENTINES14-WEB_banner-794x4761-687x477.jpg</Path>
    <Path>/wp-content/uploads/2014/02/VALENTINE_PROMOTION_1-110x142.jpg</Path>
    <Path>/wp-content/uploads/2014/02/ED_Wedluxe-CuveeRose-500x432.jpg</Path>
    <Path>/wp-content/uploads/2014/02/VALENTINE_PROMOTION_1-624x432.jpg</Path>
    <Path>/wp-content/uploads/2014/02/VALENTINES14-WEB_banner-794x4761-471x282.jpg</Path>
    <Path>/wp-content/uploads/2014/02/VALENTINES14-WEB_banner-794x4761-150x150.jpg</Path>
    <Path>/wp-content/uploads/2014/02/VALENTINES14-WEB_banner-794x4761-364x400.jpg</Path>
    <Path>/wp-content/uploads/2014/02/ED_Wedluxe-CuveeRose-110x146.jpg</Path>
    <CallerReference>{$distribution}{$epoch}</CallerReference>
</InvalidationBatch> EOD;

$xml=好的,给你。你非常接近;我基本上只留下了你的东西,再加了一点

<?php

$path = isset($argv[1]) ? $argv[1] : './';
$owner = isset($argv[2]) ? $argv[2] : 'www-data';

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));


foreach ($iterator as $result) { 

    $path_info = $result->getPath().'/'.$result->getFilename();

    $owner_info_array = posix_getpwuid(fileowner($path_info));

    // CHECK TO SEE IF THE OWNER IS www-data AND THAT THE FILE NAME DOES NOT START WITH '/.'
    if (($owner_info_array['name'] == $owner) && (!preg_match('/\/\./', $path_info))){
        $path_info = preg_replace('/'.preg_quote('/srv/domain.com', '/').'/', '', $path_info);
        $path_array[] = $path_info;
    }

}


$xml = "<InvalidationBatch>";

foreach ($path_array AS $item) {
    $xml .= "\n    <Path>".$item."</Path>";
}

$xml .= "\n    <CallerReference>{$distribution}{$epoch}</CallerReference>
</InvalidationBatch>";



print $xml;

只是澄清一下,您想列出目录中的所有文件,然后将它们粘贴到XML文件中吗?如果是这样,web用户可以从这个目录中读取吗?如果是这样的话,你还需要找到文件所有者吗?@Quixrick当新的图像文件通过WordPress管理界面上传时,它们属于www数据,所以我认为这是确定哪些文件是新上传的最好方法。一旦使用此脚本对它们进行了优化,并且未优化的文件在CND中无效,cron作业将更改所有者和模式;谢谢我正在为你制定一个解决方案。好吧,这里有几件事。简单的方法是通过放置
$path\u array=array()来声明
$path\u array
变量位于脚本顶部的某个位置。在
$owner=…
行下面就可以了。第二,您的目录搜索似乎没有返回任何行。检查以确保web用户具有读取目录的权限,并且目录中有属于
www-data
的文件。执行
打印“\n$path\u info”在您定义它以确保在那里设置了内容之后。看起来里面找不到任何文件。干杯。我一直在用它做实验,它几乎起作用了。我已将输出和注释放在末尾。谢谢你的帮助!好的,我现在来看看。好的,在我能解决这些问题的地方见我。非常感谢所有的帮助,奎克斯瑞克!
<?php

$path = isset($argv[1]) ? $argv[1] : './';
$owner = isset($argv[2]) ? $argv[2] : 'www-data';

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));


foreach ($iterator as $result) { 

    $path_info = $result->getPath().'/'.$result->getFilename();

    $owner_info_array = posix_getpwuid(fileowner($path_info));

    // CHECK TO SEE IF THE OWNER IS www-data AND THAT THE FILE NAME DOES NOT START WITH '/.'
    if (($owner_info_array['name'] == $owner) && (!preg_match('/\/\./', $path_info))){
        $path_info = preg_replace('/'.preg_quote('/srv/domain.com', '/').'/', '', $path_info);
        $path_array[] = $path_info;
    }

}


$xml = "<InvalidationBatch>";

foreach ($path_array AS $item) {
    $xml .= "\n    <Path>".$item."</Path>";
}

$xml .= "\n    <CallerReference>{$distribution}{$epoch}</CallerReference>
</InvalidationBatch>";



print $xml;