Я записал основную систему управления контентом для своего веб-сайта, включая панель администрирования. Я понимаю основной файл 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, но я хочу решение абсолютно серверной стороны, к которому можно получить доступ где угодно с достаточной авторизацией.
Возможно, можно использовать beanutils Apache Commons для автоматизации:
Например, существует метод 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;
}
Вы даже можете распаковать его после этого и заархивировать тот же эффект, хотя я должен сказать, что предпочитаю, чтобы мои резервные копии были сжаты в застежку -молнию формате.
, если у вас есть доступ для выполнения двоичного файла tar через функцию exec, это будет быстрее и лучше, я думаю:
exec('tar -zcvf ' . realpath('some directory') .'/*);
или
chdir('some directory')
exec('tar -zcvf ./*');
- Вы можете использовать рекурсию.
for(scandir($dir) as $dir_contents){
if(is_dir($dir_contents)){
backup($dir_contents);
}else{
//back up the file
}
}
у вас получилось почти правильно
$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() из-за более последовательного вывода
.