Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прервать скрипт и продолжить на следующем запуске, Подпроблема: отсутствие GOTO в PHP 
:(
    Опции темы
maxbrown
Дата 16.6.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 26
Регистрация: 16.6.2008
Где: Obninsk sci-city

Репутация: нет
Всего: нет



Задача: при наступлении некоего if($condition) корректно прервать работу некоего PHP-скрипта, а при следующем запуске (возможно, через несколько недель) возобновить с той же точки.

Начатое решение: написана функция save_variables(), которая при вызове с параметром - именем переменной - регистрирует эту переменную у себя в static-массиве, а при вызове без параметров сохраняет все переменные, заявленные ей при предыдущих обращениях, в xml-файл и вносит запись о нём в MySQL-базу.
Прерывание реализуется в виде заключения всего скрипта в некую функцию MyMain(), в которой в нужном месте вставляется:
if ($condition) return save_variables();
Функция обратной заргузки сохранённых переменных пока не написана, но проблем с этим нет.
А вот, с чем проблема есть:

Проблема: Я не могу придумать элегантного решения для возврата в точку прерывания (было бы здорово использовать GOTO, но в PHP нет GOTO) и прошу помощи Клуба.

UPD1: Предложены решения на основе паттерна State, суть которых сводится к модификации всех операторов ветвления/цикла в скрипте, чтобы в зависимости от наличия/отсутствия точки сохранения (она же "метка", она же "запись состояния") они либо выполнялись, либо пропускались скриптом на пути к нужной метке. Недостаток: по сути, это требует как минимум синтаксического анализа всего скрипта, что практически не поддаётся автоматизации.

Пояснение: преобразованию в "прерывабельно-возобновибельные" подлежит заранее неизвестное большое количество заранее неизвестных скриптов на PHP.

UPD2: Обсуждается вариант решения на posix_getpid и posix_kill


WBR - Max Brown
www.Wgent.com/kontakty.htm
www.ObBot.com/contact.htm
mail: "Max Brown <[email protected]>" (присутствие имени в поле To: обязательно!)
ICQ: 6654627 (при запросе на ауторизацию указание причины обязательно!)
Моб: +7-960-5213199 (Билайн)

P.S. Приветствуются любые варианты (идеи, подсказки, в какую сторону копать), в том числе через команды Linux/Apache/PHP5.

Это сообщение отредактировал(а) maxbrown - 17.6.2008, 23:14
PM MAIL WWW ICQ   Вверх
Feldmarschall
Дата 16.6.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: -2
Всего: 32



почитал комментарий в другую тему. 
впечатлился.
PM   Вверх
ArNic
Дата 16.6.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 278
Регистрация: 3.1.2007

Репутация: нет
Всего: нет



Вот вычитал отсюда

Goto нет в php, а иногда так хочется.

“Не используйте оператор goto” – так твердили нам преподаватели в академии, и действительно оператор сей превращает код в полнейшую кашу. Поэтому разработчики php решили проблему кардинально – в php его просто нет. Но иногда очень хочется, чтобы он все таки был особенно когда пишешь обработчик какой-то формы где пользователь должен ввести сложный набор данных, а мы должны их обработать. Процесс этот проходить, как правило, в несколько этапов: печать самой формы, проверка полученных данных, предварительны показ, ну и например сохранение. Причем некоторые этапы могут повторятся : если проверка данных не прошла удачно переходим на печать формы, или если предварительный показ не устроил пользователя он может вернутся к вводу данных. Короче говоря некоторые куски кода могут задействоваться многократно. Использовать функции в этих условиях тоже не очень удобно – много входных и выходных переменных, функция должна выполнять слишком сложные действия, вообще коряво получается и читабельность кода резко падает.
И я придумал такую вот конструкцию.

Код

<?php
do {
    switch ($action) {
        default:
        break;
        case 'PRINT_FORM':
        /*
        печатаем главную форму
        */
        break;
        case 'CHECK_FORM':
        /*
        проверяем правильность данных
        */
        break;
        case 'PREVIEW_FORM':
        /*
        предворительный просмотр
        */
        break;
        case 'SAVE_FORM':
        /*
        сохраняем данные
        */
        break;
    }
} while (true);
?>



Здесь основной оператор множественного выбора switch заключен в бесконечный цикл do-while – таким образом мы группируем нужные действия в секциях case : break; и можем неограниченно переходить из одной секции к другой. В секции default: удобно сделать предварительный разбор данных например если входных данных нет то $action = ‘PRINT_FORM’ печатаем форму, если есть например $_POST [‘submit’] то тогда отправляем на обработку полученных данных $action = ‘CHECK_FORM’ . Передача управления между блоками switch происходит с помощью изменения переменной $action, ну а выход из цикла с помощью break 2; или exit;
Так например в блоке печати основной формы можно смело поставить break 2; т.к вывод формы предполагает окончание скрипта.
Конструкция очень гибкая и читабельная. Но есть один недостаток – если неправильно обработаны данные можно попасть в бесконечный цикл и скрипт зависает - это неприятно придется ждать целых 30 сек.
Давайте установим ограничение на кол-во циклов оператора do-while, 20 хватит с головой. Теперь если мы что-то накасячили скрипт намотает 20 оборотов, остановится и вывалит предупреждение об екстренном останове.
Отлаживать такую кострукцию очень удобно - достаточно после оператора swith распечатывать переменную $action и мы получим полную последовательность исполнения блоков.

Код

DO {
    //  в начале каждого цикла печатаем название
    //   выполненной секции очень удобно для отладки
    echo $action.' ';   

    SWITCH ($action) {
        default:
        break;
        case 'PRINT_FORM':
        /*
        печатаем главную форму
        */
        break;
        case 'CHECK_FORM':
        /*
        проверяем правильность данных
        */
        break;
        case 'PREVIEW_FORM':
        /*
        предворительный просмотр
        */
        break;
        case 'SAVE_FORM':
        /*
        сохраняем данные
        */
        break;
    }// end switch

} WHILE (  ( ($i++) < 20 ) or die('Принудительный останов цикла')   );


Реальный обработчик формы конечно может быть намного сложней и обрабатывать данные в несколько форм-этапов. Хотя конечно можно все размазать по разным скриптам, и использовать функции для группировки кода тут уже дело вкуса.

Добавлено через 3 минуты и 58 секунд
кстати забыл сказать как нашел: в Google по поисковой фразе goto для php

Добавлено через 7 минут и 53 секунды
Да, и не забудь прочесть историю исключения оператора goto из php
PM MAIL ICQ   Вверх
maxbrown
Дата 16.6.2008, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 26
Регистрация: 16.6.2008
Где: Obninsk sci-city

Репутация: нет
Всего: нет



ArNic, спасибо за код и ссылки, но Switch-Case не решает проблемы. К тому же, я вовсе не настаиваю на GOTO-решении, т.к. мне оно и самому не нравится. 

Утверждение: при помощи Switch мы не сможем перейти в нужную точку цикла.

Пример: обработать несколько файлов, часть из которых на момент первого запуска скрипта может ещё не существовать. Обрабатывать один и тот же файл дважды - запрещается.
Код

$fnames=LoadVariables("fnames"); // LoadVariables() возвращает сохранённую когда-то переменную, либо false, если она ранее не сохранялась
if (!$fnames) {
 $fnames=array("file1.dat", "file2.dat", "fileN.dat"); 
 SaveVariables("fnames");
} // на самом-то деле, массив читается из базы.
// и - самое важное! - через неделю база может измениться, но мы обязаны продолжать 
// обрабатывать ТОТ ЖЕ САМЫЙ массив имён файлов, который был при первом запуске
if ( ProcessFiles($fnames) == "все файлы обработаны" ) { Mail_That_All_Complete(); exit; } // Сообщаем оператору, что задача полностью выполнена
else { Shedule_Cron_For_The_Future_Launch( time()+60*60*24*7 ); exit; } // else спланируем перезапуск через неделю

function ProcessFiles($fnames, $label="") {
 for($i=0; $i<count($fnames); $i++) {
  SaveVariables("i"); // говорим функции SaveVariables, что есть переменная $i и что её необходимо сохранять перед выходом
  $label="Label1";
  SaveVariables("label"); // метку тоже нужно будет сохранить в момент выхода.

// Label1: Несуществующий оператор метки, к которому нужно вернуться через неделю,
// если СЕЙЧАС продолжить работу окажется невозможным

  if( !file_exists($fnames[$i]) ) { // Увы и ой! Этот файл ещё не создан!
   Mail_That_We_Need_This_File($fnames[$i]); // сообщим оператору на мэйл, что ждём этот файл
   return SaveVariables();
  } // if этот файл ещё не создан, продолжим его обработку через неделю. 
  else ProcessThisFile($fnames[$i]);
 } // for все имена файлов
 return "все файлы обработаны";
} // function ProcessFiles


Плохое решение:
function ProcessFiles($fnames, $i0=0) {
 for($i=$i0; $i<count($fnames); $i++) {

Недостаток решения: ну Вы же понимаете, что на самом деле там не только for и не только $i. Там ещё впереди и вокруг тьма ветвлений, циклов etc.
PM MAIL WWW ICQ   Вверх
sTa1kEr
Дата 16.6.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



ArNic, Exceptions вам в помощь и не понадобятся никакие бесконечные циклы.
PM MAIL   Вверх
Feldmarschall
Дата 16.6.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: -2
Всего: 32



maxbrown, мне неудобно столь маститому программисту указывать на детские ошибки, но проблема в данном случае происходит оттого, что путаются программа и данные. К программе применяется подход, как будто это данные.
А решение заключается в том, что исполнение программы должно контролироваться входящими данными, а не программными ухищрениями.
PM   Вверх
maxbrown
Дата 16.6.2008, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 26
Регистрация: 16.6.2008
Где: Obninsk sci-city

Репутация: нет
Всего: нет



Feldmarschall, не такой уж я "маститый программист": как и у любого самоучки, у меня есть изрядные пробелы в знаниях. В частности, копнуть глубже Exceptions (sTa1kEr, спасибо за идею!) мне почему-то не пришло в голову.
Что же касается "путания программы с данными", то к сожалению, в данном случае программа вообще является данными smile  по своему происхождению (PHP-скрипт генерится из псевдоязыка на XML, который я сейчас пишу для своих целей). Кстати, о невозможности создания языков программирования на синтаксисе XML я уже читал и пока что мне это не очень мешает  smile
Но трабла в том, что пример с обработкой пока не существующих файлов - это всего лишь пример, а сама задача заключается именно в генерации заранее (sic!) неизвестных PHP-скриптов, которые обладали бы свойством прерывать по команде свою работу, а по другой команде - возобновлять её, как будто бы ничего не произошло.
Если у Вас есть хорошая общая идея, как это можно реализовать, был бы за неё очень признателен.
PM MAIL WWW ICQ   Вверх
krundetz
Дата 16.6.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



Цитата(maxbrown @ 16.6.2008,  10:35)
Задача: при наступлении некоего if($condition) корректно прервать работу некоего PHP-скрипта, а при следующем запуске (возможно, через несколько недель) возобновить с той же точки.

А причем здесь GOTO? У вас нет похоже четкого понимания зачем вообще эта конструкция применяется в других языках. Описываемая вами задача решается следующим способом: Создается точка остонова которая хранится на сервере допустим в базе данных. Это точка остонова является срезом системы в момент её остановки. При следующем запуске делаем проверку и если точка остонова имеется инициализируем ей состояние ситемы и начинаем работать.


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
maxbrown
Дата 16.6.2008, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 26
Регистрация: 16.6.2008
Где: Obninsk sci-city

Репутация: нет
Всего: нет



krundetz, GOTO ни при чём. Мне самому не нравится GOTO. Это лишь первый пришедший в голову, далеко не лучший и заведомо не существующий вариант решения  smile
А вот насчёт "Создается точка остонова ... точка остонова является срезом системы в момент её остановки... При следующем запуске инициализируем ей состояние ситемы и начинаем работать." - вот насчёт этого охотно почитал бы подробнее.
Только надо поиметь в виду, что таких приостановленных задач в каждый момент времени может быть несколько, плюс ещё несколько работающих (не приостановленных), и заводить ради каждой из них виртуальный сервер будет неимоверно жирно.

Это сообщение отредактировал(а) maxbrown - 16.6.2008, 15:04
PM MAIL WWW ICQ   Вверх
krundetz
Дата 16.6.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



maxbrown я не говорил про виртуальный сервер, я говорил про хранение точек отсанова в БД.
Почитайте про паттерн Состояние, в вашей задаче это наиболее приближеное решение из известных мне. 
Насчет виртуального сервера. Если у вас продолжительность работы скрипта больше чем 30 секунд, точнее есть долгоиграющие скрипты скорее всего без этого не обойтись. Либо придется договариваться с хостерами в индивидуальном порядке.


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
IZ@TOP
Дата 16.6.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



Цитата(maxbrown @  16.6.2008,  15:58 Найти цитируемый пост)
krundetz, GOTO ни при чём. Мне самому не нравится GOTO. Это лишь первый пришедший в голову, далеко не лучший и заведомо не существующий вариант решения 


Не так уж и несуществующий: http://www.phpconf.ru/u/_files/files/0/26.ppt


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
maxbrown
Дата 16.6.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 26
Регистрация: 16.6.2008
Где: Obninsk sci-city

Репутация: нет
Всего: нет



IZ@TOP, спасибо конечно, но я предпочёл бы обойтись без goto, тем более, что не факт, что мой провайдер перешёл на PHP5.3

krundetz, не подскажете ссылку точнее? А то я гуглил около часа, но нашёл только общие "языково-независимые" фразы, а конкретных примеров реализации pattern State на PHP так и не нагуглил. smile 

Это сообщение отредактировал(а) maxbrown - 16.6.2008, 17:36
PM MAIL WWW ICQ   Вверх
krundetz
Дата 16.6.2008, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



Я тоже реализации его на PHP ни разу не видел но патnерн на то и паттерн что это некий каркас легко адаптируемый к любому языку в котором реализована OOP. Неплохим подспорьем может стать пример реализации этого паттерна на Java


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
yurik_l
Дата 16.6.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


тарантиноман



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 17.9.2006

Репутация: 1
Всего: 3



maxbrown, паттерн Состояние:
http://www.fluffycat.com/PHP-Design-Patterns/State/


PM MAIL   Вверх
maxbrown
Дата 16.6.2008, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 26
Регистрация: 16.6.2008
Где: Obninsk sci-city

Репутация: нет
Всего: нет



О! yurik_l, спасибо за пример.
Теперь сразу всё стало понятно... И, к сожалению, стало также понятно, что этот паттерн в моём случае малопригоден:

1. Слишком уж в моём случае большое (а главное - заранее не известное!) количество состояний. Плюс внутри мы наблюдаем нечто ещё худшее, нежели Switch-Case: по сути, для каждого состояния описывается свой собственный метод, пусть и динамически присваеваемый! А у меня-то вместо State-зависимых методов - State-зависимые операторы! И получится в итоге вместо if($a==$b) { ... } конструкция вида if( this->GetSkipCondition("\$a==\$b") ) { ... }, а во что превратятся циклы foreach, я даже представить себе боюсь.

2. Я и так уже пошёл на серьёзную уступку самому себе, согласившись запихать код внутрь функции. Строго говоря, даже это было не вполне приемлемым. Втаскивать произвольный код ещё и внутрь объектов - это IMHO супер-крайняя мера, годится только если не придумаем ничего проще.

3. Блин, ну неужели нельзя придумать более простого способа? Задача-то была всего-навсего приостановить выполнение скрипта на какое-то длительное время...
PM MAIL WWW ICQ   Вверх
krundetz
Дата 16.6.2008, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



Своими же словами подтверждаете что вам ничего не понятно. 
1. Этот паттерн и направлен на то чтобы управлять неизвестным количеством состояний.
2. Я не говорил что это панацея я предлагал ознакомится.
3. Раз уж вы не додумались сами глядя на паттерн подкину вариант.

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

Состояние ИМХО наиболее элегантный способ обойти такую ситуацию. 


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
maxbrown
Дата 16.6.2008, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 26
Регистрация: 16.6.2008
Где: Obninsk sci-city

Репутация: нет
Всего: нет



"каждый раз скрипт будет отрабатывать по полной логике" - это и есть именно то, чего я хочу избежать.
Я ведь правильно понимаю, вы предлагаете мне "прорубать насквозь" все встречающиеся на пути к Label1 логические операторы? if( !$skip && $condition ) вместо if($condition), elseif(!$skip) вместо else, for($i=$i0 и так далее.
Вопрос на засыпку: как Вы себе представляете "прорубание" foreach?
Наконец, просто представьте себе, что исходный код - чужой и сложный и разбираться в этом коде очень долго. А также, что таких исходных кодов очень много и единственное, что реально - это выцепить в этом коде определённый оператор, требующий приостановки скрипта и вставить несколько строчек до или после этого оператора.
Ведь по сути код и будет чужим, а уж сложным он будет с гарантией, и если мне повезёт, то этих кодов будет к тому же действительно Много.

Да, кстати, вы что-то говорили про время выполнения в 30 секунд. Это абсолютно нереально. Реально, в моём случае полное время выполнения задачи - несколько месяцев. При том, что сумма всех отрезков процессорного времени должна измеряться миллисекундами (скриптов, как я уже говорил, ожидается много). 
PM MAIL WWW ICQ   Вверх
krundetz
Дата 16.6.2008, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



Надо подумать ещё если придумаю подскажу.

Насчект времени выполнения есть ограничение в 30 секунд которое стоит на время работы скрипта. Болшенство хостеров его оставляют без изменения некоторые даже уменьшают это чтобы на виртуальном хостинге где на одном сервере может висеть очень много сайтов процесорное время не расходовалось н плохо написаные и ресурсо емкие скрипты. Возможен ли вариант с использованием другого языка програмирования а также с использованием виртуального сервера?



--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
maxbrown
Дата 16.6.2008, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 26
Регистрация: 16.6.2008
Где: Obninsk sci-city

Репутация: нет
Всего: нет



Другой язык - это сложно, т.к. исходники на PHP.
А вот виртуальный сервер - это, похоже, вариант. Если ничего другого не останется.
PM MAIL WWW ICQ   Вверх
IZ@TOP
Дата 17.6.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



maxbrown, да, интересно было бы узнать что это за задача такая, требующая подобного извращения.

Кстати, не вижу ничего плохого в том, что программа будет проходить вновь все участки в воспроизведенном состоянии до нужного логического блока. Программа, конечно, станет сложнее, но по иному, на мой взгляд, сделать практически нереально (если не брать в рассчет костыли и садо-мазо-извращения).

А еще, на счет GOTO: можно было бы в программе, в тех местах, где это необходимо - генерировать метки и в состоянии записывать их идентификатор. После повторного запуска программы, если будет необходимо восстановить состояние, контроллер просто перекинет нас к нужной метке.

Это сообщение отредактировал(а) IZ@TOP - 17.6.2008, 12:50


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Fortop
Дата 17.6.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



maxbrown
Цитата(maxbrown @  16.6.2008,  14:41 Найти цитируемый пост)
 которые обладали бы свойством прерывать по команде свою работу

Механизм передачи команды скрипту проработан?

Теперь что касается сохранения состояний.

Изложу свои велосипедные изыскания по этому поводу, поскольку книг не читал.

- Для того чтобы сохранить состояние необходимо скрипт разбить на участки кода максимально независимые друг от друга. (методы)
- Для прерывания любого метода, в том числе и содержащего цикл foreach использовать все данные как очереди и стеки.
Т.е. после обработки - удалять из массива данные. Таким образом при последующем возобновлении этого цикла, он будет обладать только 
необработанной информацией.

Любой произвольный объект должен иметь свой UID. 
Для добавления возможности сохранения состояний потребуется так же генерировать "карту алгоритма".

Возобновление работы
Переход к точке останова должен осуществлять общий контроллер, который будет использовать сохраненное состояние последнего выполненного объекта и передаст управление на последний вызванный метод. Всю необходимую информацию он возмет из "карты алгоритма".

К сожалению детально описать пока нет времени. Но нечно похожее (хотя и попроще), я использую, в некоторых местах, у себя в проекте.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Fortop
Дата 17.6.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Да, и...

Цитата(maxbrown @  16.6.2008,  19:32 Найти цитируемый пост)
Втаскивать произвольный код ещё и внутрь объектов 

Если уж так боимся названия объект - 
можешь использовать обычные php файлы для каждого отдельного куска кода.

В любом случае, при исполнении кода контроллером, будет происходить инициализация нужных ему(блоку кода) данных из сохраненного состояния и затем include этого блока кода.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
maxbrown
Дата 17.6.2008, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 26
Регистрация: 16.6.2008
Где: Obninsk sci-city

Репутация: нет
Всего: нет



Цитата(IZ@TOP @ 17.6.2008,  12:48)
да, интересно было бы узнать что это за задача такая, требующая подобного извращения.
 Это большое количество программ, неспешно собирающих статистику из "сырых" экспериментальных данных, неспешно поступающих пакетами из различных источников (на FTP, по электронной почте и даже флоппинетом). Сами программы пишутся на XML: 
Код

<infile filename="..........."><forall datarecord="......."><if condition="......."><then>..........</then><else>.........</else></if></forall></infile>

Программы пишутся сотрудниками и далее транслируются на язык PHP.
Сначала предполагалось, что к моменту запуска каждого скрипта все данные для него уже будут готовы и что скрипт успеет обработать все файлы за свой таймаут. Выяснилось, что во-первых, файлов может быть настолько много, что не успеет, а во-вторых, некоторые из этих файлов генерятся другими такими же программами и могут быть ещё не готовы, причём отслеживать готовность данных для дальнейшей обработки никому не интересно.
PHP выбран потому, что он наиболее распространён и что в исключительных случаях можно вручную добавить уже в PHP-скрипт некоторые возможности, отсутствующие в исходном XML-языке.
Цитата(IZ@TOP @ 17.6.2008,  12:48)

Кстати, не вижу ничего плохого в том, что программа будет проходить вновь все участки в воспроизведенном состоянии до нужного логического блока.

Программы могут (точнее, почти наверняка будут) содержать линейные сегменты, не допускающие повторной обработки. Например, дозапись в какие-то файлы.

Это сообщение отредактировал(а) maxbrown - 17.6.2008, 17:14
PM MAIL WWW ICQ   Вверх
maxbrown
Дата 17.6.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 26
Регистрация: 16.6.2008
Где: Obninsk sci-city

Репутация: нет
Всего: нет



Цитата(IZ@TOP @ 17.6.2008,  12:48)
А еще, на счет GOTO: можно было бы в программе, в тех местах, где это необходимо - генерировать метки и в состоянии записывать их идентификатор. После повторного запуска программы, если будет необходимо восстановить состояние, контроллер просто перекинет нас к нужной метке.

А вот здесь, пожалуйста, подробнее. Что за метки? Что за контроллер? Насколько "просто" перекинет?
PM MAIL WWW ICQ   Вверх
krundetz
Дата 17.6.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



Вы в любом случае не сможете обойтись без стека вызовов не обязательно его выполнять повторно просто пробегаясь по нему в ы придете в ту точку програмы которая вам нужна


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
Fortop
Дата 17.6.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(maxbrown @  17.6.2008,  17:36 Найти цитируемый пост)
А вот здесь, пожалуйста, подробнее. Что за метки? Что за контроллер? Насколько "просто" перекинет? 

По сути у тебя будут выполнятся не генерируемые скрипты, а один скрипт, который будет вызывать внутри себя по определенному алгоритму нужные файлы.
Он же будет принимать команды, отвечать за сохранение текущего состояния и его загрузку.

Что касается метки, то считай меткой уникальное имя файла.

вызываются они в контроллере примерно так.

Код

// читаем сохраненное состояние и в том числе $startPoint
...
// читаем список модулей
$algo = file('config.txt');
for ($i = $startPoint; $i < $endPoint; $i++) {
    include $algo[$i];
}


Это сообщение отредактировал(а) Fortop - 17.6.2008, 18:06


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
maxbrown
Дата 17.6.2008, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 26
Регистрация: 16.6.2008
Где: Obninsk sci-city

Репутация: нет
Всего: нет



Друг подсказал по аське, что проблему возможно решить при помощи posix_getpid и posix_kill.
Но он пишет в основном на си и питоне и не знает, как это реализуется в PHP. Если кто с посикс-расширениями работал, отзовитесь plz.

Это сообщение отредактировал(а) maxbrown - 18.6.2008, 10:58
PM MAIL WWW ICQ   Вверх
skyboy
Дата 18.6.2008, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(maxbrown @  17.6.2008,  22:01 Найти цитируемый пост)
что проблему, возможно решить при помощи posix_getpid и posix_kill

и какой процесс ты собираешься прибивать? httpd апача?
PM MAIL   Вверх
Fortop
Дата 18.6.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



maxbrown
Цитата(maxbrown @  17.6.2008,  23:01 Найти цитируемый пост)
Друг подсказал по аське, что проблему

какую из твоих проблем?

Для того чтобы передать скрипту команду на завершение можно использовать нормальный способ, а не резать его на корню.
Ты ведь состояние сохранить не успеешь, если воспользуешься советом друга.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Feldmarschall
Дата 18.6.2008, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: -2
Всего: 32



Цитата(maxbrown @  17.6.2008,  17:08 Найти цитируемый пост)
Программы пишутся сотрудниками и далее транслируются на язык PHP.

Меня больше всего это восхищает.
то есть, тут можно долго думать над решением практических проблем, но сама архитектура, когда кто-то пишет на хмл программы, эти программы транслируются в пхп, потом анализируются другим скриптом, сгенерированным из XML с дискретным прерыванием - поражает воображение и является отдельным законченным произведением искусства.
PM   Вверх
Fortop
Дата 18.6.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(Feldmarschall @  18.6.2008,  10:02 Найти цитируемый пост)
когда кто-то пишет на хмл программы

Программы - звучит конечно слишком громко, но это могут банальные быть блоки расчетов smile
Хотя реализация их на PHP.... но почему бы и нет? smile

В принципе, я так понимаю, схема очень близка к распределенным вычислениям. Во всяком случае ее легко отмасштабировать на произвольное число модулей и на произвольный уровень вложенности.
Нужно лишь чтобы каждый узел имел свой контроллер выполнения.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
maxbrown
Дата 18.6.2008, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 26
Регистрация: 16.6.2008
Где: Obninsk sci-city

Репутация: нет
Всего: нет



Цитата(Fortop @ 18.6.2008,  09:58)
Для того чтобы передать скрипту команду на завершение можно использовать нормальный способ, а не резать его на корню.
Ты ведь состояние сохранить не успеешь, если воспользуешься советом друга.

Fortop, posix_kill, несмотря на своё "страшное" название, используется не только для прибивания процессов на корню, но и для других целей в зависимости от передаваемого процессу сигнала.
PM MAIL WWW ICQ   Вверх
Fortop
Дата 18.6.2008, 10:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(maxbrown @  18.6.2008,  10:32 Найти цитируемый пост)
но и для других целей в зависимости от передаваемого процессу сигнала. 

Вот как только ты расскажешь - как в PHP можно ловить и обрабатывать эти сигналы - я с тобой соглашусь.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
maxbrown
Дата 18.6.2008, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Awaiting Authorisation
Сообщений: 26
Регистрация: 16.6.2008
Где: Obninsk sci-city

Репутация: нет
Всего: нет



Цитата(Feldmarschall @ 18.6.2008,  10:02)
сама архитектура, когда кто-то пишет на хмл программы, эти программы транслируются в пхп, потом анализируются другим скриптом, сгенерированным из XML с дискретным прерыванием

Не совсем так. Программы пишутся на XML - да, транслируются в PHP - да, потом анализируются - да, но не "другим скриптом, сгенерированным из XML", а просто другой программой.
Компилятор XML->PHP доступен для редактирования (точнее, сам компилятор недоступен, но можно редактировать используемое в нем XSLT-преобразование) и в принципе, можно, переделав компилятор, перекомпилировать заново все исходные XML-программы, которые сохранились, а если что-то не сохранилось, то оставшиеся PHP-скрипты переписать уже вручную.

Добавлено через 8 минут
Цитата(Fortop @ 18.6.2008,  10:42)
Вот как только ты расскажешь - как в PHP можно ловить и обрабатывать эти сигналы - я с тобой соглашусь.

Если бы я знал, я бы не спрашивал. Мне известно, что примерно таким способом на PHP пишут демонов, но эта область для меня пока terra incognita.
PM MAIL WWW ICQ   Вверх
Fortop
Дата 18.6.2008, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(maxbrown @  18.6.2008,  10:51 Найти цитируемый пост)
что примерно таким способом на PHP пишут демонов

Насколько я знаю - нет.

Т.е. обмен сообщениями через названия файлов,через сами файлы, через сокеты, через базу - да, это реализуемо.

Я почему и спрашивал, реализован ли у тебя механизм передачи команд скрипту.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Resha
Дата 23.10.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 14.3.2008

Репутация: нет
Всего: нет



Цитата(maxbrown @ 16.6.2008,  10:35)
Задача: при наступлении некоего if($condition) корректно прервать работу некоего PHP-скрипта, а при следующем запуске (возможно, через несколько недель) возобновить с той же точки.

Вы 100% пытаетесь сделать нечто, что вообще говоря вам можно и не делать (т.е., скорее всего, есть какое-то более стандартное решение).

Представим себе работу по шитью шерстяных носков.

Алгоритм выглядит примерно так:
1. Отмотать 100 м ниток.
2. Связать носок общей площадью 1000 см2.

Выполняете программу, запоминая этап и его остояние:
1. Для первого этапа - длина отмотанной нитки.
2. Для второго - площадью навязанного носка.

Если вдруг у вас случился сердечный приступ, то потом вы всегда сможете получить информацию, на чем вы остановились и сколько работы осталось сделать, чтобы перейти к следующему этапу.


Задача утрирована, но в любом случае, при выполнении долгоиграющих скриптов все работает именно так smile

Лично по моему опыту, после 2-3 часов работы скрипт может отпасть не выдав абсолютно никакой ошибки. Даже не знаю, по какой именно причине smile Так что лучше весь процесс делить на цепочку скриптов, вызывающихся последовательно друг за другом после успешного завершения  работы скрипта предыдущего этапа.
PM MAIL   Вверх
kshyms
Дата 13.11.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 303
Регистрация: 30.8.2006
Где: Душанбе

Репутация: нет
Всего: 0



IZ@TOP, Всякое новое это хорошо забытое старое! В фортране и бэйсике версии 1,2,3 он был еще в 80-90 годах. А в 6 версии PHP он тоже включен?
 goto - это полезный  удобный операнд выхода из цикла или выполнения условия

Это сообщение отредактировал(а) kshyms - 13.11.2008, 10:02
PM MAIL WWW Skype   Вверх
bars80080
Дата 13.11.2008, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



Цитата(Resha @  23.10.2008,  11:03 Найти цитируемый пост)
при наступлении некоего if($condition) корректно прервать работу некоего PHP-скрипта, а при следующем запуске (возможно, через несколько недель) возобновить с той же точки
Цитата(Resha @  23.10.2008,  11:03 Найти цитируемый пост)
Если вдруг у вас случился сердечный приступ, то потом вы всегда сможете получить информацию, на чем вы остановились и сколько работы осталось сделать, чтобы перейти к следующему этапу.

надо только помнить, что носки можно вязать спицами, а когда вам придут заказчики с мотивировкой связать носки для КрАЗа, им видити ли шины в холодную погоду надо защитить, то следует всё-такие задуматься, а может такие вещи делаются не из ниток и не спицами?
это я к тому, что помимо гипертекстового процессора (php) есть другие механизмы, заточенные под соответствующие задачи


Цитата(kshyms @  13.11.2008,  08:56 Найти цитируемый пост)
goto - это полезный  удобный операнд выхода из цикла или выполнения условия

советую почитать это http://phpclub.ru/faq/goto
PM MAIL WWW   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1441 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.