File: /var/www/samok164/data/www2/obryadi.ru/rzgn/r4_libs.php
<?php
if (!defined("STATUS_OK")) {
define("STATUS_OK", "OK");
}
if (!defined("STATUS_FAIL")) {
define("STATUS_FAIL", "FAIL");
}
if (!function_exists('r4_success')) {
function r4_success($result) {
$result['status'] = 'success';
echo json_encode($result);
exit(0);
}
}
if (!function_exists('r4_fail')) {
function r4_fail($result, $errmsg) {
$result['error'] = $errmsg;
$result['status'] = 'fail';
echo json_encode($result);
exit(1);
}
}
if (!function_exists('fast_remove')) {
/**
* Выполняет быстрое "удаление" (переименование) каталога
*
* @param string $remove_dir_path Путь "удаляемого" каталога
*/
function fast_remove($remove_dir_path) {
$result = array();
$new_dir_path = $remove_dir_path."_".date("Ymd_His");
if (file_exists($remove_dir_path)) {
$rename_result = rename($remove_dir_path, $new_dir_path);
if (!$rename_result) {
r4_fail($result, 'Error when try rename '.$remove_dir_path.' to '.$new_dir_path);
}
}
r4_success($result);
}
}
if (!function_exists('iconv_link')) {
/**
* Конвертирует ссылку из одной кодировки в другую.
*
* @param string $link Ссылка для конвертации.
* @param string $r4_cfg_default_encoding Кодировка, из которой следует конвертировать.
* @param string $r4_cfg_link_encoding Кодировка, в которую следует конвертировать.
*
* @return string Возвращает ссылку после конвертации или исходное значение.
*/
function iconv_link($link, $r4_cfg_default_encoding, $r4_cfg_link_encoding) {
if (function_exists('iconv')) {
if (!isset($r4_cfg_default_encoding)) {
$r4_cfg_default_encoding = 'UTF-8';
}
if (trim(strtolower($r4_cfg_link_encoding)) == 'utf8') {
$r4_cfg_link_encoding = 'UTF-8';
}
if (trim(strtolower($r4_cfg_link_encoding)) == 'cp1251') {
$r4_cfg_link_encoding = 'WINDOWS-1251';
}
if ($r4_cfg_link_encoding !== $r4_cfg_default_encoding) {
$track_errors = ini_set('track_errors', 1);
$iconv_link = iconv($r4_cfg_default_encoding, $r4_cfg_link_encoding, $link);
if (!isset($php_errormsg) || (isset($php_errormsg) && strpos($php_errormsg, 'iconv') === false && strpos($php_errormsg, 'character') === false)) {
$link = $iconv_link;
}
ini_set('track_errors', $track_errors);
}
}
return $link;
}
}
if (!function_exists('write_logfile')) {
/**
* Записывает посещение робота в log-файл.
*
* @param string $logfile Имя log-файла.
* @param string $logpath Путь до log-файла.
* @param string $uri Значение запрошенного роботом пути сайта.
*
* @return boolean Возвращает true если удалось записать посещение робота, false в противном случае.
*/
function write_logfile($logfile, $logpath, $uri) {
if (is_writable($logfile)) {
$r4_fp = fopen($logfile, 'a');
if ($r4_fp) {
if (!fwrite($r4_fp, date('Y-m-d H:i:s')."\t{$uri}\n")) {
error_log(date("F j, Y, g:i a")." R4: File write failed!\n", 3, "{$logpath}error.log");
}
fclose($r4_fp);
return TRUE;
}
}
return FALSE;
}
}
if (!function_exists('check_logfile')) {
/**
* Проверка лог-файла:
* если файла не существует, то создаёт пустой;
* если существует и размер превышает максимально допустимый, то усекает до половины разрешённого.
*
* @param string $logfile Имя файла.
* @param string $logpath Путь до файла.
* @param int $maxsize Максимально допустимый размер файла в мегабайтах.
*/
function check_logfile($logfile, $logpath, $maxsize) {
if (!file_exists($logfile)) {
touch($logfile);
}
else {
if (filesize($logfile) > $maxsize * 1024 * 1024) {
$tmp_filename = $logpath.md5(time()).'r4.tmp';
$tmp_f = fopen($tmp_filename, 'w');
$f = fopen($logfile, 'r');
$cursor = $maxsize / 2 * 1024 * 1024;
fseek($f, -$cursor, SEEK_END);
while (($buffer = fgets($f, 4096)) !== false) {
if (preg_match('/^\d{4}-\d{2}-\d{2}/', $buffer)) {
fputs($tmp_f, $buffer, 4096);
}
}
fclose($f);
fclose($tmp_f);
if (file_exists($tmp_filename)) {
rename($tmp_filename, $logfile);
}
}
}
}
}
if (!function_exists('is_dir_empty')) {
/**
* Проверяет, что каталог пустой.
*
* @param string $path Путь до каталога.
*
* @return boolean|null True, если каталог пустой, иначе - false. Если каталог не доступен для чтения, - null.
*/
function is_dir_empty($path) {
if (($dir = opendir($path)) !== false) {
while (($file = readdir($dir)) !== false) {
if ($file != "." && $file != "..") {
return false;
}
}
closedir($dir);
}
else {
return null;
}
return true;
}
}
if (!function_exists('rmdir_recursive')) {
/**
* Рекурсивное удаление каталогов и файлов.
*
* @param string $path Путь до удаляемого каталога.
* @param array $exclude Массив каталогов и файлов, которые не следует удалять.
*
* @return array
*/
function rmdir_recursive($path, $exclude=array(), $pattern='', $recursive=true) {
$path = rtrim($path, '/');
$undeleted_files = array();
if (is_dir($path)) {
if (($dir = opendir($path)) !== FALSE) {
while (($file = readdir($dir)) !== FALSE) {
if ($file != "." && $file != ".." && !in_array("{$path}/{$file}", $exclude)) {
if (is_dir("{$path}/{$file}") && $recursive) {
$undeleted_files = array_merge($undeleted_files, rmdir_recursive("{$path}/{$file}", $exclude, $pattern));
}
elseif (is_file("{$path}/{$file}")) {
if (empty($pattern) || preg_match("/{$pattern}/", "{$file}")) {
if (!unlink("{$path}/{$file}")) {
$undeleted_files[] = "{$path}/{$file}";
}
}
}
elseif (is_link("{$path}/{$file}")) {
continue; // Символические ссылки удалять не будем: их не должно быть вовсе
}
else {
continue; // Пропускаем директорию, если не установлен флаг $recursive
}
}
}
closedir($dir);
// if (!in_array("{$path}", $exclude)) {
// if (is_dir_empty($path) && !rmdir($path)) {
// $undeleted_files[] = $path;
// }
// }
}
}
elseif (is_file($path)) {
if (!in_array("{$path}", $exclude)) {
if (empty($pattern) || preg_match("/{$pattern}/", "{$file}")) {
if (!unlink($path)) {
$undeleted_files[] = $path;
}
}
}
}
return $undeleted_files;
}
}
if (!function_exists('get_filenames')) {
/**
* Получает список названий всех файлов в директории и поддиректориях
*
* @param string $path Каталог, в котором рекурсивно производится поиск файлов.
* @param array $exclude Массив каталогов и файлов, которые не следует выводить.
* @param string $pattern Маска (регулярное выражение) файлов.
*
* @return array Массив строк, содержащий список файлов по маске.
*/
function get_filenames($path, $exclude=array(), $pattern='', $recursive=true) {
$filenames = array();
$path = rtrim($path, '/');
if (is_dir($path)) {
if (($dir = opendir($path)) !== false) {
while (($filename = readdir($dir)) !== false) {
if ($filename == '.' || $filename == '..' || in_array("{$path}/{$filename}", $exclude)) {
continue;
}
if (is_dir("{$path}/{$filename}") && $recursive) {
$filenames = array_merge($filenames, get_filenames("{$path}/{$filename}", $exclude, $pattern));
}
elseif (is_file("{$path}/{$filename}") && preg_match("/{$pattern}/", "{$filename}")) {
$filenames[] = "{$path}/{$filename}";
}
elseif (is_link("{$path}/{$filename}")) {
continue;
}
else {
continue;
}
}
closedir($dir);
}
}
elseif (is_file($path)) {
$filenames[] = $path;
}
return $filenames;
}
}
if (!function_exists('json_encode')) {
/**
* Returns the JSON representation of a value.
*
* @param resource $value The value being encoded. Can be any type except a resource.
*
* @return string Returns a JSON encoded string on success or FALSE on failure.
*/
function json_encode($value=false) {
if (is_null($value)) {
return 'null';
}
if ($value === false) {
return 'false';
}
if ($value === true) {
return 'true';
}
if (is_scalar($value)) {
if (is_float($value)) {
return floatval(str_replace(",", ".", strval($value)));
}
if (is_string($value)) {
static $json_replaces = array(array("\\", "/", "\n", "\t", "\r", "\b", "\f", '"'), array('\\\\', '\\/', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'));
return '"' . str_replace($json_replaces[0], $json_replaces[1], $value) . '"';
}
else {
return $value;
}
}
$is_list = true;
for ($i = 0, reset($value); $i < count($value); $i++, next($value)) {
if (key($value) !== $i) {
$is_list = false;
break;
}
}
$result = array();
if ($is_list) {
foreach ($value as $v) {
$result[] = json_encode($v);
}
return '[' . join(',', $result) . ']';
}
else {
foreach ($value as $k => $v) {
$result[] = json_encode($k).':'.json_encode($v);
}
return '{' . join(',', $result) . '}';
}
}
}
if (!function_exists('str_split')) {
/**
* Версия http://www.php.net/manual/en/function.str-split.php для PHP 4.
*
* Converts a string to an array.
*
* @param string $string The input string.
*
* @return array The returned array will be one character in length.
*/
function str_split($string){
return preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY);
}
}
if (!function_exists('check_safe_mode')) {
/**
* Определяет, включён ли на сайте SAFE MODE.
*
* @return boolean True, если SAFE MODE включён, иначе - false.
*/
function check_safe_mode($r4_cfg_root='') {
$disable_functions = ini_get('disable_functions');
if (isset($disable_functions) && preg_match('/\brmdir\b/i', $disable_functions)) {
if (preg_match('/\bmkdir\b/i', $disable_functions)) {
return true;
}
else {
return false;
}
}
$track_errors = ini_set('track_errors', 1);
$tmp_dir_name = uniqid('');
$tmp_dirs = array("{$r4_cfg_root}{$tmp_dir_name}", "{$r4_cfg_root}{$tmp_dir_name}/{$tmp_dir_name}");
$rm_dirs = array();
foreach ($tmp_dirs as $tmp_dir) {
mkdir($tmp_dir, 0777);
if (isset($php_errormsg) && strpos($php_errormsg, 'SAFE MODE') !== false) {
foreach (array_reverse($rm_dirs) as $rm_dir) {
rmdir($rm_dir);
}
ini_set('track_errors', $track_errors);
return true;
}
else {
$rm_dirs[] = $tmp_dir;
}
}
foreach (array_reverse($rm_dirs) as $rm_dir) {
rmdir($rm_dir);
}
ini_set('track_errors', $track_errors);
return false;
}
}