Пример синхронизации директорий (копирование отсутствующих файлов) на PHP

Пример скрипта:

<?php
namespace Disweb;

$patchFrom = __DIR__ . "/public/upload";
$patchTo = __DIR__ . "/public2/upload";

// Проверка на существование дирикторий и создание при отсутствии
function checkDirPath($path){
	$path = str_replace(array("\\", "//"), "/", $path);

	//remove file name
	if(substr($path, -1) != "/"){
		$p = strrpos($path, "/");
		$path = substr($path, 0, $p);
	}

	$path = rtrim($path, "/");

	if(!file_exists($path))
		return mkdir($path, 0755, true);
	else
		return is_dir($path);
}

// Копирование файлов и дирикторий
function copyDirFiles($path_from, $path_to, $ReWrite = true, $Recursive = false, $DeleteAfterCopy = false, $strExclude = ""){
	if(strpos($path_to."/", $path_from."/")===0 || realpath($path_to) === realpath($path_from)){
		return false;
	}

	if(is_dir($path_from)){
		checkDirPath($path_to."/");
	}else if(is_file($path_from)){
		$p = strrpos($path_to, "/");
		$path_to_dir = substr($path_to, 0, $p);
		checkDirPath($path_to_dir."/");

		if (file_exists($path_to) && !$ReWrite)
			return false;

		@copy($path_from, $path_to);
		if(is_file($path_to))
			@chmod($path_to, 0644);

		if ($DeleteAfterCopy)
			@unlink($path_from);

		return true;
	}else{
		return true;
	}

	if($handle = @opendir($path_from)){
		while(($file = readdir($handle)) !== false){
			if($file == "." || $file == "..")
				continue;

			if(strlen($strExclude) > 0 && substr($file, 0, strlen($strExclude)) == $strExclude){
				continue;
			}

			if(is_dir($path_from."/".$file) && $Recursive){
				copyDirFiles($path_from."/".$file, $path_to."/".$file, $ReWrite, $Recursive, $DeleteAfterCopy, $strExclude);
				if ($DeleteAfterCopy)
					@rmdir($path_from."/".$file);
			}else if(is_file($path_from."/".$file)){
				if(file_exists($path_to."/".$file) && !$ReWrite)
					continue;

				@copy($path_from."/".$file, $path_to."/".$file);
				@chmod($path_to."/".$file, 0644);

				if($DeleteAfterCopy)
					@unlink($path_from."/".$file);
			}
		}
		@closedir($handle);

		if($DeleteAfterCopy)
			@rmdir($path_from);

		return true;
	}

	return false;
}

function folderFileCopy($path = "")
{
	global $patchFrom, $patchTo;
	echo "Копирование: " . $path . "\n";
	copyDirFiles($patchFrom . $path, $patchTo . $path);
}

function folderListing($path = "")
{
	global $patchFrom, $patchTo;
	
	if (is_dir($p = $patchFrom . $path))
	{
		if ($dir = opendir($p))
		{
			while (false !== $item = readdir($dir))
			{
				if ($item == ".." || $item == ".")
				{
					continue;
				}
				if (!file_exists($patchTo . $path . "/" . $item))
				{
					folderFileCopy($path . "/" . $item);
				}
				else if (is_dir($patchFrom . $path . "/" . $item))
				{
					folderListing($path . "/" . $item);
				}
			}
		}
	}
}

folderListing("");

echo "success\n";