За чистый и ясный код!

Статьи на тему программирования под веб, используя PHP, MySQL, Jquery и многое другое

Работа с командной строкой в Kohana3 (KO3)

Апрель22
Cтолешница из искусственного камня своими руками, большой выбор столещниц, умывальник и подоконников.

Всем привет!

Есть некоторые задачи которые выполняются не по воле пользователей (зашел в браузер, набрал сайт и получил сайт — выполнилась какая-то задача), а по воле программистов, самих серверов в определенное время (cron). Писать о работе планировщика заданий не буду, а опишу здесь как правильно работать с командной строкой в Kohana3. Пока пишу опираясь на ОС Windows, когда буду обновлять на сервере сделаю обновление, если будет нужен, о работе с командной строкой в *nix подобных системах.

Первым делом заходим в командную строку, для этого нажимаем клавишу ВИНДОВС (те кто не знают, клавиша с флагом корпорации) + R. В появившемся окне пишем ручками cmd и нажимаем enter. Простите, что так подробно, но есть «уникумы» которые и такое сделать не могут. Далее переходи на диск, где установлен PHP, для этого просто пишем D:(у меня он на диске D), затем пишем команду перехода к папке, где расположен PHP cd php5, нажимаем enter. Для проверки работы самого PHP пишем тестовую команду, узнаем версию PHP: php -v, если на экране отобразилась нужная информация, значит все у нас получилось. Все показано на рисунке:

Команды для работы с PHP в командной строке

Команды для работы с PHP в командной строке

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

$_SERVER is an array containing information such as headers, paths, and script locations. The entries in this array are created by the web server.

Я, например, об этом знал, но забыл 🙁 и потратил 2 часа чтобы от этого избавится. В основном, для получения полного пути к папке где лежит запускаемый скрипт, я использовал переменную $_SERVER[‘DOCUMENT_ROOT’], но в самой Kohana есть ведь константа DOCROOT, которая и дает нам то, что нужно!!!

Третьим делом удостоверяемся, что у нас последняя версия фреймверка, т.к. из-за одного маленького, необязательного, опционально аргумента одной из ф-ций которая используется в классе CLI работа велась НЕКОРРЕКТНО! Или, если нет желания менять свою старую версию, тогда в файле:

/system/classes/kohana/cli.php

необходимо найти строки:

if (strpos($opt, '='))
{
	// Separate the name and value
	list ($opt, $value) = explode('=', $opt);
}

и заменить на следующий фрагмент кода

if (strpos($opt, '='))
{
	// Separate the name and value
	list ($opt, $value) = explode('=', $opt, 2);
}

Ну и наконец, как же работать с командной строкой.

Для работы пишем в нашей открытой командной строке, для Виндовс, если используете &, то все данные надо брать в кавычки:

D:\php5>php путь/до/index.php --uri=путь/из/роутера
--get="maxnag[]=1&maxnag[]=2" --post="intik=ddd"

обратите внимание! Строка пишется без переноса,
я это сделал чтобы влазило в видимую часть

B наш скрипт прекрасно переключается на классы и методы, которые описаны в роутере и передает данные, в данном случае это два массива $_GET и $_POST.

Вот что получилось:

Результат работы скрипта через командную строку

Результат работы скрипта через командную строку

У командной строки есть опции, в данный момент времени их 4, все они должны начинаться с ==, ну и пробел перед первым равно.

uri — строка которая идет после домена, например http://examlpe.com/test/one/1, uri=test/one/1
method — из документации: string method: GET, POST, PUT, DELETE, etc
get — данные для супер глобального массива $_GET
post — данные для супер глобального массива $_POST

не забываем, что для передачи массива надо использовать индексы массива
с квадратными скобками, как это написано в примере

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

Статья просмотренна 62002 раз, зашло посетителей 18408

рубрика: Kohana

11 комментариев в “Работа с командной строкой в Kohana3 (KO3)”

  1. Avatar
    Aravak пишет:

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


  2. Avatar
    Максим Нагайченко пишет:

    Вот я как раз с таким и столкнулся… Теперь все крута!!! Я так вчера радовался, что под это настроение и написал статью!


  3. Avatar
    ANT пишет:

    Не знал, что можно еще и пост и гет передавать. Спасибо.


  4. Avatar
    Sergey пишет:

    ЭЭЭЭЭЭ, если то, что вы написали единственный способ кохана3, то ну ее в баню.

    я использую кохана2, сделал стандартный роутер

    class Cli_Controller extends Controller { .. }

    а потом использую

    /usr/bin/php index.php /cli/gearman_server/1/production
    /usr/bin/php index.php /cli/gearman_server/2/production
    /usr/bin/php index.php /cli/gearman_server/3/production
    /usr/bin/php index.php /cli/gearman_server/4/production


  5. Avatar
    maxnag пишет:

    Я с КО2 сталкивался совсем ничего, так что судить не буду, но что в Вашем пример от моего отличается, только управляющие конструкции —uri ? КО3 также поймет если полностью передать туда урл с параметрами, все будет ясно методу и контроллеру. Особой проблемы не вижу.


  6. Avatar
    Spider пишет:

    Спасибо, полезная статья. В официальной документации как-то обделили этот раздел вниманием


  7. Avatar
    maxnag пишет:

    Да это проблема Коханы — документация, хотя она растет с каждым днем.
    Мне интереснее было полазить во внутренностях, так узнаешь куда больше.


  8. Avatar
    bvn пишет:

    Спасибо статья полезная. Я как-то на ko3 по-тихоньку пытаюсь перелазить с CI, но времени пока не хватает. А вот когда перелезу, то обязательно захочу написать нормальный скаффолдинг, и тут мне конечно пригодится возможность работы в CLI.
    Думаю сделать обертку, которая бы направляла все запросы на один контроллер Controller_CLI, скажем, а обычные параметры командной строки передавала, скажем, через POST или GET и дальше уже обработка внутри.
    Остается один вопрос, а как сделать, чтобы мои экшены в контроллере CLI не были доступны из веб? Хочу, чтобы CLI было только через консоль, как положено.


  9. Avatar
    maxnag пишет:

    Привет. Это вообще не проблема!

    Есть переменная Kohana::$is_cli; изначально она в FALSE, говорит о том, что скрипт запущен через агента (браузер). Когда запуск ведется через командную строку, то сам рнр выдает константу PHP_SAPI равную cli, означает что скрипт запущен через консоль. Следуя этому в Кохане есть строчка кода Kohana::$is_cli = (PHP_SAPI === 'cli');, которая сделает переменную Kohana::$is_cli; в TRUE.

    Ответил на вопрос?

    ЗЫ также есть переменные:
    Kohana::$is_windows;
    Kohana::$magic_quotes;
    Request::$is_ajax;
    и тд, их много….


  10. Avatar
    adw0rd пишет:

    Спасибо, помог разобраться с KO3 is_cli.
    При переносе строк в командной строке коррентно использовать символ бекслеша:
    >php
    -v

    > Опытные программисты знают, что при работе с командной строкой, всех тех индексов которые есть
    > при работе через браузер просто НЕТ, т.к. эти данные – данные браузера
    Думаю правильнее будет сказать от веб-сервера, так как это именно его данные 🙂


  11. Avatar
    maxnag пишет:

    Верно подметил! Конечно же сервера!!! Спасибо за замечание.


не публикуется

пример

Оставить комментарий или два:

  

Облако тегов

cli csv dump events form Kohana locale models MySQL mysqldump orm PHP tools trigger validate газ газовый счетчик итоги кеширование переменные

Облако тегов плагина WP Cumulus для WordPress требует для просмотра Flash Player 9 или выше.

Я на твиттере!

  • у твиттера тоже бывают перерывы...

Календарь

Апрель 2010
Пн Вт Ср Чт Пт Сб Вс
« Мар   Май »
 1234
567891011
12131415161718
19202122232425
2627282930  

Сейчас на сайте