synology.forum архив спільноти · 2005–2022
ai.synology.forum →
ГлавнаяУправление Системой › PHP => SH

PHP => SH

EvGeniyLell · 09.09.2016

Доброго всем времени суток!

гдето в сети нашел инфо что планеровщик заданий может ввыполнить php скрипт

а так как SH не понимаю (как и php, но в нем хотябы юзерские функции есть)

вобщем написал скрипт на пхп но у него либо прав не хватает (хоть и в планеровщике рут выбран) или таки информация была ошибочной

 

госпада знающие умеющие, может кто помог бы мне переписать мой скриптик на SH?

как можно ближе к моему скрипту чтобы понял основы и принципы =)

был бы примного благодарен

 

<?php
$fromDir = '/volume1/web/DSScripts'; 
$toDir = '/volume1/web/DSScripts/Lib'; 

function pathValidator($path) {
    if(preg_match('*@eaDir*', $path)) { return false; }
    if(preg_match('/^.*\.(jpg|jpeg|png)/i', $path)) { return true; }
    return false;
}

function getListFiles($folder,&$all_files) {
    global $toDir;
    $fp = opendir($folder);
    while($cv_file = readdir($fp)) {
        $path = $folder."/".$cv_file;
        if(is_file($path)) {
            if(pathValidator($path)){
               $all_files[] = $path;
            }
        } elseif($cv_file != "." && $cv_file != ".." && is_dir($path) && $path != $toDir){
            getListFiles($path,$all_files);
        }
    }
    closedir($fp);
}

function renameImage($path) {
    global $toDir;
    $exif = exif_read_data($path);

    $dateTime = NULL;
    if(is_null($dateTime)) {
        $dateTime = $exif[DateTimeOriginal];
    }
    if(is_null($dateTime)) {
        $dateTime = $exif[DateTimeDigitized];
    }
    if(is_null($dateTime)) {
        $dateTime = $exif[DateTime];
    }
    if(is_null($dateTime)) {
        $dateTime = $exif[FileDateTime];
    }

    if(!is_null($dateTime)) {
        preg_match('/^(\d+).(\d+).(\d+).*/', $dateTime, $matches);
        $dateTimeY = $matches[1];
        $dateTimeM = $matches[2];
        $dateTimeD = $matches[3];
        if(!is_null($dateTimeY) && !is_null($dateTimeM) && !is_null($dateTimeD)) {
            $fileName = basename($path);
            $newDir = $toDir."/".$dateTimeY."/".$dateTimeM."/".$dateTimeD;
            mkdir($newDir, 0777, true);
            $newPath = $newDir."/".$fileName;
            $res = rename($path, $newPath);
        }
    }
}

$all_files = array();
getListFiles($fromDir, $all_files);
foreach ($all_files as &$file) {
    renameImage($file);
}

?>

 

UPD - Решение

строка вызова php скипта

php /volume1/web/your_folder/your_script.php >> /volume1/web/your_folder/log_file.log 2>&1

* указатель на то что данный скрипт является php скриптом

* путь к скрипту

* вывод в лог (не обязательный параметр)

 

чтобы заработал exif.so нужно

проверить откуда берет настройки пхп

$ini = get_cfg_var('cfg_file_path');
print_r('<pre>ini: '.$ini."\n");

вполне возможно (как в моем случе) это разные места

в случае вызова из таскМенеджера - /etc/php/php.ini

в случае вызова из вебИнтерфейса - /usr/local/etc/php56/php.ini

 

требуется в актуальный для таскменеджера фаил настроек php.ini добавить экстеншен

extension = exif.so

 

проверить работоспособность

и (опять же как в моем случае) если exif.so не обнаружился скопировать его из дериктории экстеншенов вебИнтерфейса в директорию экстеншенов таскМенеджера (путь к дериктории указан в файле ini.php - extension_dir)

 

команды которые могут понадобится

ssh [email protected] - вход (ваш логин и айпи сервера)

cd /path - переход в папку

ls - просмотр директории

sudo vi fileName - открыть в текстовом редакторе фаил для изменения (с правами админа)

:w - соханить фаил в vi

:q - выход в vi

:q! - форсировать выход в vi

esc - чтение / редактирование в vi

sudo cp /path1/fileName /path2/ - скоировать фаил (с правами админа)

SergeS · 10.09.2016
Доброго всем времени суток!

гдето в сети нашел инфо что планеровщик заданий может ввыполнить php скрипт

а так как SH не понимаю (как и php, но в нем хотябы юзерские функции есть)

вобщем написал скрипт на пхп но у него либо прав не хватает (хоть и в планеровщике рут выбран) или таки информация была ошибочной

 

госпада знающие умеющие, может кто помог бы мне переписать мой скриптик на SH?

как можно ближе к моему скрипту чтобы понял основы и принципы =)

был бы примного благодарен

 

Не, это уж как то сам давай, разбирайся, разбиратся что там твой php-скрипт делает, а потом еще переводить на sh - вряд ли кто-то захочет. Если бы ты объяснил подробно что именно тебе надо от этого скрипта - тогда наверное шанс на помошь был бы побольше, но тоже сомнителен...

 

Могу однозначно подтвердить, что php-скрипты можно запускать из планировщика, вот моя реальная строка запуска, только имена поменял:

php /volume1/web/your_folder/your_script.php >> /volume1/web/your_folder/log_file.log 2>&1, здесь весь вывод этого скрипта (std и err) перенаправляется в лог-файл. Сам скрипт в общем случае не обязательно должен находится под /web, как в моем примере, но если он там не находится - надо дописать нужный фолдер в DSM Control Panel -> Web Services -> PHP Settings -> open_basedir.

 

P.S. А юзерские функции и в sh-скриптах есть.

 

P.P.S. И в интернете полно примеров как на sh рекурсивно обходить дерево каталогов, проверять имена файлов на маску regexp и переименовывать их. Есть ли примеры как доставать инфу из exif - не интересовался, но думаю, что тоже не особая проблема, хотя и может понадобится внешняя утилитка, какая-нибудь exif-tool. Btw, как альтернатива извлеканию инфы из exif можно попробовать извлекать инфу из postgres базы данных фотостанции, это точно можно делать (с некоторым предварительным шаманством) и из sh и из php.

EvGeniyLell · 10.09.2016

Спасибо большое за ответ!

подскажите как дать права пхп скрипту на ренейм (перемещение/переименовывание) файлов

все проблема как я понял именно в этом

еще раз спасибо!

 

пс. прошу прощения если кого обидел просьбой помочь с переводом. я не подозревал что это сложно. я без знаний пхп с гуглом довольно быстро справился =) в его написании. но согласен копатся в чужом коде мало кого прильщает.

 

ппс. пхп скрипт запускается от рут

EvGeniyLell · 10.09.2016

спаибо за информацию как сделать лог =)

но что-то наверно у меня не так

вот такое вот лезет в лог

 

/volume1/web/DSScripts/test.php: line 1: ?php: No such file or directory

/volume1/web/DSScripts/test.php: line 2: =: command not found

/volume1/web/DSScripts/test.php: line 3: =: command not found

/volume1/web/DSScripts/test.php: line 5: syntax error near unexpected token `$path'

/volume1/web/DSScripts/test.php: line 5: `function pathValidator($path) {'

 

хотя из браузера (MY_DSSYNO_IP/DSScripts/test.php) все нормально работает кроме перемещения файлов (нехватает прав)

 

пс. разобрался с запуском =) оказывается перед адресом нужно было указать php... у вас в примере какраз так и есть... туплю

чегото когда скрипт запускается из планировщика задач он не видит exif.so...

EvGeniyLell · 10.09.2016

еще раз спаибо!

разобрался

 

добавлю инструкцию для новичков в шапку =)