PHP рекурсивный резервный сценарий

Я записал основную систему управления контентом для своего веб-сайта, включая панель администрирования. Я понимаю основной файл IO, а также копирование через PHP, но мои попытки резервного сценария, вызываемого из сценария, перестали работать. Я пытался делать это:

//... authentication, other functions
for(scandir($homedir) as $buffer){
    if(is_dir($buffer)){
        //Add $buffer to an array
    }
    else{
        //Back up the file
    }
}
for($founddirectories as $dir){
    for(scandir($dir) as $b){
        //Backup as above, adding to $founddirectories
    }
}

Но это, казалось, не работало.

Я знаю, что могу сделать это использование FTP, но я хочу решение абсолютно серверной стороны, к которому можно получить доступ где угодно с достаточной авторизацией.

7
задан Hawkcannon 7 February 2010 в 20:02
поделиться

4 ответа

Возможно, можно использовать beanutils Apache Commons для автоматизации:

http://commons.apache.org/beanutils/apidocs/org/apache/commons/beanutils/PropertyUtils.html#getSimpleProperty%28java.lang.Object, java.lang. Последовательность% 29

Например, существует метод description (Object bean) , который возвращает карту всех читаемых атрибутов (т.е. getters).

Затем повторите эту карту и позвоните:

setSimpleProperty(Object bean, String name, Object value)

и

public static Object getSimpleProperty(Object bean, String name)

И хотя я согласен с другим плакатом, чем getters/setters довольно тривиально - я думаю, что это все еще стоит проверить их - чтобы устранить опечатки, тест свойства изменения прослушивателей и т.д.

Например, это будет динамически извлекать getters боба:

import java.io.Serializable;
import java.util.Set;
import org.apache.commons.beanutils.PropertyUtils;

public class MyTestBean implements Serializable {
    private int a;
    private int b;
    private int c;
    private String x;
    private String y;
    private String z;

    public static void main(String[] args) throws Exception {
    MyTestBean bean=new MyTestBean();
    Set prop=PropertyUtils.describe(bean).keySet();
    for (Object o : prop) {
        System.out.println((String)o);
    }
    }

    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
    public int getB() {
        return b;
    }
    public void setB(int b) {
        this.b = b;
    }
    public int getC() {
        return c;
    }
    public void setC(int c) {
        this.c = c;
    }
    public String getX() {
        return x;
    }
    public void setX(String x) {
        this.x = x;
    }
    public String getY() {
        return y;
    }
    public void setY(String y) {
        this.y = y;
    }
    public String getZ() {
        return z;
    }
    public void setZ(String z) {
        this.z = z;
    }}

Для запуска этого кода в проект необходимо загрузить файлы BeanUtils и CommonsLogging, а также JAR обеих библиотек.

-121--4088912-

Существует множество инструментов для работы с HTML и CSS. Синтаксис не очень, но улучшения от HAML и SASS не кажутся мне столь драматичными, и для многих они не стоят неприятностей. Конечно, для тех, кто разрабатывает веб- приложение с широко различающимися рамками (отличающимися от Rails то есть), еще труднее найти причину, чтобы пойти на боль интеграции чего-то такого чужого. (Пример: пояснить, что нужно сделать для интеграции SASS в среду Java/Stripes/JSP?: -)

-121--1732684-

Вот альтернатива: почему бы вам не заархивировать исходный каталог вместо ?

function Zip($source, $destination)
{
    if (extension_loaded('zip') === true)
    {
        if (file_exists($source) === true)
        {
            $zip = new ZipArchive();

            if ($zip->open($destination, ZIPARCHIVE::CREATE) === true)
            {
                $source = realpath($source);

                if (is_dir($source) === true)
                {
                    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

                    foreach ($files as $file)
                    {
                        $file = realpath($file);

                        if (is_dir($file) === true)
                        {
                            $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
                        }

                        else if (is_file($file) === true)
                        {
                            $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
                        }
                    }
                }

                else if (is_file($source) === true)
                {
                    $zip->addFromString(basename($source), file_get_contents($source));
                }
            }

            return $zip->close();
        }
    }

    return false;
}

Вы даже можете распаковать его после этого и заархивировать тот же эффект, хотя я должен сказать, что предпочитаю, чтобы мои резервные копии были сжаты в застежку -молнию формате.

9
ответ дан 6 December 2019 в 10:00
поделиться

, если у вас есть доступ для выполнения двоичного файла tar через функцию exec, это будет быстрее и лучше, я думаю:

exec('tar -zcvf ' . realpath('some directory') .'/*);

или

chdir('some directory')
exec('tar -zcvf ./*');
4
ответ дан 6 December 2019 в 10:00
поделиться

- Вы можете использовать рекурсию.

for(scandir($dir) as $dir_contents){
    if(is_dir($dir_contents)){
        backup($dir_contents);
    }else{
        //back up the file
    }
}
2
ответ дан 6 December 2019 в 10:00
поделиться

у вас получилось почти правильно

$dirs = array($homedir);
$files = array();

while(count($dirs)) {
   $dir = array_shift($dirs);
   foreach(glob("$dir/*") as $e)
      if(is_dir($e)) 
         $dirs[] = $e;
      else
         $files[] = $e;
}
// here $files[] contains all files from $homedir and below

glob() лучше, чем scandir() из-за более последовательного вывода

.
2
ответ дан 6 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: