1

Тема: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

В KohanaFramework, модулі досить легко писати та підключати. Практично модуль стає повноцінним учасником застосунку (application). Тобто він може перевизначати майже будь-які класи ядра.

Зрозуміло, що з метою "убезпечити себе" всі модулі навряд чи доцільно писати, але все ж хочеться щоб була можливість легкого відкату підключення модуля, якщо він, наприклад, не коректно працює.

В зв'язку з цим, в мене виникло бажання якось обмежити права модулів, але не уявляю як це можна реалізувати, адже в його коді можна змінити і автозавантажувач класів, і зареєструвати свій shutdown handler... Тобто може запросто покласти весь застосунок...

Чи відомі вам способи як цього уникнути?

2 Востаннє редагувалося ktretyak (09.12.2014 16:15:33)

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

В мене якось по магічному діє публічне звернення. Можу сам сидіти нічого не придумати, а потім написати це на форумі, і буквально за пару хвилин сам же і знайти розв'язок. Це буває досить часто в мене =).

В даному випадку розв'язком міг би бути механізм типу "транзакції". Тобто, перед тим як підключити модуль, застосунок може починати транзакцію, і якщо він не зможе записати завершення транзакції, то робити відкат підключення модуля.

3

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

Самий простий метод - підключати модулі один за одним через try {} catch {} тобто, намагаємось підключити модуль, якщо там помилка, ловимо Exception, можливо зберігаємо помилку та продовжуємо далі.

Більш правильний підхід - писати тести. Хоча це може буди досить складно, бо потребує певних дій, щоб код було легко тестувати, але це, як показує практика, частіше окупається, аніж навпаки. Та й написання коду, який легко тестувати загалом покращує стиль програмування та навички проектування складних систем.

4

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

В даному випадку "найстрашніше" коли підключений модуль "кладе" повністю застосунок, а з таким, швидше за все не справиться try {} catch {}, бо можуть не видаватись Винятки, а тупо shutdown.

Стосовно написання тестів, то ще не дійшов до застосування цього на практиці...

5

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

Під непрацездатністю маєте на увазі критичну помилку?

6

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

VTrim написав:

Під непрацездатністю маєте на увазі критичну помилку?

Ну взагалі то так - в першу чергу цікавить як вирішувати проблему при критичній помилці...

А взагалі, то я знаю, що якось Вордпрес вміє вимикати некоректно  працюючі модулі, але не розбирався як воно там влаштоване, бо там не ООП, а лапша-код.

7 Востаннє редагувалося VTrim (09.12.2014 19:20:36)

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

Може вішати запит до самого модуля (типу http://myhost/chat/ ),парсити його і якщо є помилка - виключати модуль.

Але краще дивитись в цю сторону..
http://php.net/manual/en/book.errorfunc.php

8

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

Так

9

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

Може вішати запит до самого модуля (типу http://myhost/chat/ ),парсити його і якщо є помилка - виключати модуль.

Але краще дивитись в цю сторону..
http://php.net/manual/en/book.errorfunc.php

p/s шось сайт тупить..

10 Востаннє редагувалося TwiStar (09.12.2014 23:30:40)

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

А ось мені стало цікаво. В чому ідеологія такої поведінки? Якщо є модуль - він повинен працювати. Якщо він не працює, ми не підключаємо його на робочий сервер. Тобто, відсутність модуля який не працює для мене - це закидання сміття під ковер. Тобто, як ми виправимо той модуль, якщо він не працює і ми не бачимо результати його праці ?

11

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

TwiStar, в мене була реальна ситуація, коли я протестував модуль на домашньому компі, але коли закинув на продакшн, то сайт ліг. Причина - стилізація написання масивів була у вигляді [], такий запис доступний в PHP >= 5.4.

Якщо б я підключав цей модуль через веб-адмінку, то і вона б не була доступна після цього.

Само собою зрозуміло, що краще використовувати такі модулі, які чітко вказують вимоги до версії PHP, та краще читати ці вимоги. Але я хочу мати механізм, що взагалі забере права у модулів, так би мовити, щоб вони не могли покласти сайт.

12

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

Доречі, про недоступну адмінку, коли модуль не працює коректно... Думаю також буде не зайвим писати таку схему роботи адмінки, яка не ляже від непрацюючого модуля. Але, наприклад, в KohanaFramework це можливо зробити тільки якщо не використовувати стандартний робочий потік...

13

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

У мене також бувають моменти що коли комусь щось розкажеш вирішення приходить само по собі)
Тепер на рахунок модуля:
Якщо модуль підключений - він має працювати.
Якщо модуль працює з помилками - ви маєте виправити помилки.
Якщо модуль кладе весь аплікейшин це значить неправильно написаний й модуль.

Тут треба дуже добре думати перед тим як робити цю систему.
Давайте розглянемо приклад модуль коментарів.
Якщо у ньому щось поламається - ви хочете повністю відключити коментарі?
Якщо у ньому виникає помилка тільки у певного кола користувачів - відключати модуль для всіх?

Краще робити так:
1. Пишемо тести
2. Відловлюємо всі помилки і робимо повний звіт по помилках.  Тобто бачимо коли, де, в якому рядку сталась помилка. Ну одним словом весь трейс )  І відправляємо помилки зразу в джаббер. Що б протягом 10-15 хвилин пофіксати даний ерор)

14

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

funivan написав:

У мене також бувають моменти що коли комусь щось розкажеш вирішення приходить само по собі)
Тепер на рахунок модуля:
Якщо модуль підключений - він має працювати.
Якщо модуль працює з помилками - ви маєте виправити помилки.
Якщо модуль кладе весь аплікейшин це значить неправильно написаний й модуль.

Тут треба дуже добре думати перед тим як робити цю систему.
Давайте розглянемо приклад модуль коментарів.
Якщо у ньому щось поламається - ви хочете повністю відключити коментарі?
Якщо у ньому виникає помилка тільки у певного кола користувачів - відключати модуль для всіх?

Краще робити так:
1. Пишемо тести
2. Відловлюємо всі помилки і робимо повний звіт по помилках.  Тобто бачимо коли, де, в якому рядку сталась помилка. Ну одним словом весь трейс )  І відправляємо помилки зразу в джаббер. Що б протягом 10-15 хвилин пофіксати даний ерор)

Для цього і дав лінк сюди
http://php.net/manual/en/book.errorfunc.php
Можна відловлювати різні помилки.

15

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

Фатальні помилки можна відловлювати через register_shutdown_function

http://php.net/manual/en/function.regis … nction.php

16

Re: Чи можна наперед перевіряти працездантність модулів в PHP застосунках?

Так, я знаю про відловлення звичайних і фатальних помилок.

Але на даний момент зупинився на ідеї створення окремого робочого потоку для адмінки, щоб вона була доступною незалежно від коректності роботи модулів.

Тобто якщо в більшості випадків робочий потік починається із сторінки index.php, продовжується підключенням модулів, визначенням роутів, далі робота з контролерами, моделями та вьюхами.

Адмінка не повинна брати участь, як мінімум в частині цього потоку index.php -> [підключення модулів]. Мабуть для тестування модулів, з адмінки можна буде робити запити через index.php: працює - чудово, залишаємо підключеним, не працює - відключаємо.

Покищо не впевнений на скільки автономною потрібно робити адмінку.