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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прервать скрипт и продолжить на следующем запуске, Подпроблема: отсутствие GOTO в PHP 
:(
    Опции темы
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   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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