Страница 1 из 1

shell + PHP

Добавлено: 2010-06-29 10:55:33
Volodymyr
Есть задача. Оптимизировать изображения и переложить на другой сервер.

Приблизительно как я накидал алгоритм.
  1. Имеются директории разной степени вложенности с jpg файлами.
  2. PHP по определенной схеме может генерировать ряд инструкция для конвертации этих изображений при помощи ImageMagic с переносом их в папку откуда ни будут перемещаться на другой сервер.
  3. По крону скрипт проверяет наличие инструкций (по сути это те же файлы скриптов с заложенными командами или только списки файлов) и исполнять их. По окончанию обработки каждой директории (когда файлы перенесены в папку для отгрузки формируется некий указатель что эту папку можно отгружать на удаленный сервер (например по NFS).
  4. Другой скрипт по расписанию на основе этих указателей (или инструкций) перемещает директории с файлами на удаленный сервер.
Не совсем разобрался как из одного скрипта запустить другой или отчитать его содержимое. С переносом по NFS тоже вроде все нормально, только не ясно что будет если не будет соединения, скажем проверять его перед тем как переносить. Для определения работает ли уже такой скрипт или нет, решил использовать файл-флаг. Да и вообще насколько такая конструкция живучая. Может что-то можно сделать более оптимально.

Re: shell + PHP

Добавлено: 2010-06-29 11:37:32
thefree
учите perl, ftp + ImageMagic, связка уже и обкатана и работает в лёт

Re: shell + PHP

Добавлено: 2010-06-29 11:45:15
Volodymyr
Основная система которая принимает и раскладывает изображения (по сути CMS) написана на PHP.

Re: shell + PHP

Добавлено: 2010-06-29 12:41:15
thefree
Volodymyr писал(а):Основная система которая принимает и раскладывает изображения (по сути CMS) написана на PHP.
и? сохраняйте изображение потом по крону жмите его и сразу на ftp заливайте ...

Re: shell + PHP

Добавлено: 2010-07-19 12:46:01
Volodymyr
Все сделал, все работает. Если кому интересно могу поделится скриптами.

PHP который генерирует инструкции. PRJ_DIR - константа путь к проекту.

Код: Выделить всё

$dir = $l_code;
$source = PRJ_DIR . 'ecms/orders/hold/' . $dir . '/';
$destination = PRJ_DIR . 'ecms/orders/transfer/' . $dir . '/';
$file_sh_convert = PRJ_DIR . 'ecms/orders.sh/convert/' . $dir . '.sh';
$file_sh_transfer = PRJ_DIR . 'ecms/orders.sh/transfer/' . $dir . '.sh';
$this->_make_dir($destination);
$directory = dir($source);
file_put_contents($file_sh_convert, '#!/bin/sh' . "\n\n");
while (false !== ($file = $directory->read())) {
	if ($file == '.' || $file == '..') {
		continue;
	}
	if ($file == 'order.txt') {
		copy($source . $file, $destination . $file);
		continue;
	}
	$source . '/' . $file;
	$current = $path_convert . 'convert ' . $source . $file . ' -units PixelsPerInch -density 300x300 -sampling-factor 4:2:2 -quality 95 -strip ' . $destination . $file . "\n";
	file_put_contents($file_sh_convert, $current, FILE_APPEND);
}
file_put_contents($file_sh_convert, 'mv ' . $destination . $dir . '.sh ' . $file_sh_transfer, FILE_APPEND);
chmod($file_sh_convert, 0777);
file_put_contents($destination . $dir . '.sh', '#!/bin/sh' . "\n\n" . 'mv ' . $destination . ' ' . str_replace('transfer/', 'print/.', $destination) . "\n" . 'mv ' . str_replace('transfer/', 'print/.', $destination) . ' ' . str_replace('transfer/', 'print/', $destination));
chmod($destination . $dir . '.sh', 0777);
$directory->close();
photobooks_conver.sh

Код: Выделить всё

#!/bin/sh

flagfile="/root/photobooks_conver_flag"
if [ -f ${flagfile} ];
    then exit
fi

echo "photobooks_conver_flag" > ${flagfile}
dir= PRJ_DIR + "ecms/orders.sh/convert"

cd ${dir}
for i in $dir/*;
do
    if [ -f $i ]
        then $i && rm $i
    fi
done
rm ${flagfile}
И аналогичный photobooks_transfer.sh

Код: Выделить всё

#!/bin/sh

flagfile="/root/photobooks_transfer_flag"
if [ -f ${flagfile} ];
    then exit
fi

echo "photobooks_transfer_flag" > ${flagfile}
dir=PRJ_DIR + "ecms/orders.sh/transfer"

cd ${dir}
for i in $dir/*;
do
    if [ -f $i ]
        then $i && rm $i
    fi
done
rm ${flagfile}
Оба запускаются по крону раз в 10 минут. Первый скрипт исполняет весь набор инструкция по конвертации, второй исполняет наборы инструкций по переносу. Не хватает наверное проверки срока жизни флага, возможен выход без удаления или сбой когда флаг не сотрется, проверить если старше скажем 12 часов, то убить принудительно.

Re: shell + PHP

Добавлено: 2010-07-19 18:13:18
thefree
это ужас.

Re: shell + PHP

Добавлено: 2010-07-19 18:32:38
Volodymyr
Обоснуй.

Re: shell + PHP

Добавлено: 2010-07-19 18:40:28
thefree
Да что тут обосновывать, начать с того что есть такая вещь как ARGV.
Ну и закончить тем ... Всё что Вы написали ОЧЕНЬ криво ...

Re: shell + PHP

Добавлено: 2010-07-19 18:56:24
Volodymyr
криво это не аргумент. да и кривизна зависит часто от точки зрения.

Re: shell + PHP

Добавлено: 2010-07-19 18:59:09
thefree
ну да, ну да ...
3 действия 3и скрипты ...

В туалет тоже ходите в 2а захода?

Re: shell + PHP

Добавлено: 2010-07-19 19:46:00
Volodymyr
thefree писал(а):3 действия 3и скрипты ...
Очень интересно пользователю залить 1Гб картинок на быстрый сервер, а потом при оформление заказа ждать когда поконвертит этот гигабайт и перекинин на сервер печати. А так при оформлении скрипт 1 генерирует инструкции, а потом по крону отрабатывается конвертация и переброска. Естественно что 2 и 3 можно совместить, типа конвертнули папку и перебросили.

Re: shell + PHP

Добавлено: 2010-07-20 9:19:53
thefree
ajax?

И всё одно, пользователь должен ждать 10 минут

Re: shell + PHP

Добавлено: 2010-07-20 9:48:21
Volodymyr
Зачем Аякс? Просто что бы было? Процедура конвертации может быть запущена оператором, и на конвертацию может быть отправлено от 1 до 100 папок в каждой может быть до 1Гб картинок. Прежде чем писать тут ненужные советы и не аргументированные комментарии стоило бы сначала особенности роботы уточнить. Да перестарался с тем что конвертировать, а потом отдельно переносится, можно одним ходом делать - переделаю. Возможно код можно было оформить по проще для восприятия кем либо через дополнительные переменные. Но на то и рефактор существует.

Re: shell + PHP

Добавлено: 2010-07-20 9:54:33
thefree
Volodymyr писал(а):Зачем Аякс? Просто что бы было? Процедура конвертации может быть запущена оператором, и на конвертацию может быть отправлено от 1 до 100 папок в каждой может быть до 1Гб картинок. Прежде чем писать тут ненужные советы и не аргументированные комментарии стоило бы сначала особенности роботы уточнить. Да перестарался с тем что конвертировать, а потом отдельно переносится, можно одним ходом делать - переделаю. Возможно код можно было оформить по проще для восприятия кем либо через дополнительные переменные. Но на то и рефактор существует.
Мне кажется Вам был предложен самый лучший вариант
thefree писал(а):учите perl, ftp + ImageMagic, связка уже и обкатана и работает в лёт

Re: shell + PHP

Добавлено: 2010-07-20 11:42:40
Volodymyr
thefree писал(а):учите perl, ftp + ImageMagic, связка уже и обкатана и работает в лёт
Зачем нужен perl если вся система работает на РНР? Зачем нужен ftp (по которому фалы бьются) когда диск смонтирован по NFS, ImageMagic используется это видно из примера РНР.

Re: shell + PHP

Добавлено: 2010-07-20 14:22:38
thefree
Volodymyr писал(а):
thefree писал(а):учите perl, ftp + ImageMagic, связка уже и обкатана и работает в лёт
Зачем нужен perl если вся система работает на РНР? Зачем нужен ftp (по которому фалы бьются) когда диск смонтирован по NFS, ImageMagic используется это видно из примера РНР.
NFS звучало как на пример, ftp проще отслеживать работает ли он ...
_http://habrahabr.ru/blogs/webdev/99108/ ну вот еще почитать стоит ...

perl советовал т.к. считаю его более православным языком чем php

Re: shell + PHP

Добавлено: 2010-07-20 15:13:43
Volodymyr
Читал. Ничего нового. Конвертирование конвертом, перловый интерфейс понятно для чего. Я же просто генерирую инструкцию для шела. Чем происходит генерация это вообще не принципиальный вопрос. РНР удобен тем что вся система на нем и он и там в потоке обрабатывает эти заказы, так пусть параллельно инструкцию делает. Относительно разброски по ядрам - тут надо думать и на тему GraphicsMagick тоже. Так как на сервере стоит 16 ядер.

P.S. Пошел конструктив.