Программирование в PHP для командной строки

    Предисловие

    Ubuntu предоставляет в комплекте с пакетом apache2 утилиты для включения\выключения виртуальных хостов и модулей. Однако, создание конфигов для виртуальных хостов отнимают дополнительное время. Поэтому, мне захотелось исправить этот недостаток. Можно было, конечно, сделать автоматические поддомены для апача, но я решил написать скрипт, который создает файлы конфигурации виртуальных хостов для апача, а так же, при необходимости, добавляет имя хоста в файл /etc/hosts. Я не очень хорошо пишу скрипты в bash'e, поэтому решил использовать PHP для моей довольно простой задачи, который я, к тому же, знаю довольно неплохо.
    Итак, в этой статье мы сделаем сразу две полезных вещи: ознакомимся с операциями ввода\вывода командной строки в PHP и напишем скрипт, который совсем немного упростит нам жизнь.

    Проверка прав доступа

    Наверное, ни для кого не секрет, что достаточно просто в первой строке PHP скрипта написать
    #!/usr/bin/env php
    и такой скрипт можно будет выполнить как обычную программу в Linux.

    Прежде всего, нам нужно проверить, есть ли у нас право на запись в ту самую папку, которая содержит в себе конфиги виртуальных хостов, а обычно для этого нужны root права. Проверить это довольно просто:
    1. $virtual_hosts_dir = "/etc/apache2/sites-available/";
    2. if (!is_dir($virtual_hosts_dir) || !is_writable($virtual_hosts_dir))
    3. {
    4.     echo "You must run this script as root!\n";
    5.     exit;
    6. }


    Получение информации из параметров

    Далее, нам необходимо узнать у пользователя некоторую информацию, которая нам нужна для создания конфига. Кроме последовательного ввода из консоли, можно передать эту информацию в качестве параметров, которые мы передаем при вызове скрипта. В PHP есть глобальные переменные $argc и $argv. Первая содержит количество входящих параметров, а вторая — массив со входящими параметрами. По-умолчанию входящий параметр всего один — полный путь к вызываемому скрипту. Таким образом, обработка входящих переменных сводится просто к обработке массива:
    1. if ($argc>1) 
    2. { 
    3.     for ($i=1; $i<$argc; $i++) 
    4.     { 
    5.         $option = explode("=", $argv[$i]); 
    6.         switch ($option[0]) 
    7.         { 
    8.             case "-h": 
    9.             case "--add-to-hosts": 
    10.                 $add_to_hosts = true; 
    11.             break;
    12.  
    13.             case "-n": 
    14.             case "--no-add-to-hosts": 
    15.                 $add_to_hosts = false; 
    16.             break;
    17.  
    18.             case "-a": 
    19.             case "--server-alias": 
    20.                 if (isset($option[1])) 
    21.                 { 
    22.                     $server_alias = $option[1]; 
    23.                 } 
    24.                 else 
    25.                 { 
    26.                     echo "Wrong option: {$argv[$i]}\n"; 
    27.                 } 
    28.             break;
    29.  
    30.             case "-d": 
    31.             case "--document-root": 
    32.                 if (isset($option[1])) 
    33.                 { 
    34.                     if ($option[1] == "default") 
    35.                     { 
    36.                         $document_root = $default_doc_root 
    37.                     } 
    38.                     else if (is_dir(dirname($option[1]))) 
    39.                     { 
    40.                         $document_root = $option[1]; 
    41.                     } 
    42.                 } 
    43.                 else 
    44.                 { 
    45.                     echo "Wrong option: {$argv[$i]}\n"; 
    46.                 } 
    47.             break;
    48.  
    49.             default: 
    50.                 if (substr($argv[$i], 1, 1) == '-') 
    51.                 { 
    52.                     echo "Unknown option: {$argv[$i]}\n"; 
    53.                 } 
    54.             break; 
    55.         } 
    56.     } 
    57. }
    58.  


    Потоки ввода\вывода

    Но не всегда ведь удобно вбивать кучу параметров в консоль. Поэтому теперь мы просим пользователя ввести с клавиатуры то, что нам до сих пор неизвестно. Для этого нам понадобятся потоки ввода\вывода, а в данном случае только ввода. В PHP для работы с потоками ввода\вывода используются константы STDIN, STDOUT, STDERR. По сути, эти потоки ничем не отличаются от файловых потоков и работать с ними так же просто. Например, строка:
    1. $line = fgets(STDIN);

    просто считает строку из консоли и запишет её в переменную $line. В данном случае, мы не открывали и не закрывали поток, т.к. PHP делает это автоматически. Но, мы можем открыть поток вручную и держать его открытым столько, сколько нам нужно. Это будет работать быстрее, если Вам нужно считать\записать более одной строки:
    1. $stdin = fopen("php://stdin", "r");
    2. $line1 = gets($stdin);
    3. $line2 = gets($stdin);
    4. fclose($stdin);

    В данном случае мы сначала открываем поток, считываем из него две строки и закрываем его.
    С записью аналогично, хотя я предпочитаю для вывода на экран просто использовать echo.

    Продолжаем писать наш скрипт. Пока у нас нет хоть какой-то строки в качестве имени хоста, продолжаем просить пользователя, чтобы он что-то ввел:
    1. while (!$server_alias)
    2. {
    3.     echo "Enter your hostname: ";
    4.     $server_alias = trim(fgets(STDIN));
    5. }


    Теперь, спросим у пользователя, нужно ли добавлять информацию о этом хосте в /etc/hosts, но спрашиваем только в том случае, если эта информация не была передана в качестве параметра. Так как скрипт я писал себе для повседневной работы, то никаких реальных сайтов у меня не будет и чаще всего нужно будет добавлять хост в /etc/hosts, поэтому если мы ничего не вводим, а просто нажимаем Enter то это принимается как согласие:
    1. if ($add_to_hosts === null)
    2. {
    3.     echo "Add $server_alias to your /etc/hosts ? (Y/N) [Y]: ";
    4.     $line = trim(fgets(STDIN));
    5.     if ($line == 'n' || $line == 'N')
    6.     {
    7.         $add_to_hosts = false;
    8.     }
    9.     else
    10.     {
    11.         $add_to_hosts = true;
    12.     }
    13. }


    То же самое и с корневой директорией сайта:
    1. if (!$document_root) 
    2. { 
    3.     $default_doc_root = $default_doc_root.'/'.$server_alias; 
    4.     echo "Enter your document root [$default_doc_root]: "; 
    5.     $line = trim(fgets(STDIN)); 
    6.     if ($line && is_dir(dirname($line))) 
    7.     { 
    8.         $document_root = $line; 
    9.     } 
    10.     else 
    11.     { 
    12.         $document_root = $default_doc_root; 
    13.     } 
    14. }
    15.  


    Генерация конфиг-файла

    На этом этапе весь сбор информации закончен и у нас есть все, что нужно, для того, чтобы создать конфиг. Надо убедится, что корневая директория сайта существует, а если её нет — создадим её:
    1. if (!is_dir($document_root))
    2. {
    3.     mkdir($document_root);
    4. }


    Мы спрашивали у пользователя по поводу добавления хоста в /etc/hosts. Сделаем это, если он согласился:
    1. if ($add_to_hosts)
    2. {
    3.     $hosts = file_get_contents("/etc/hosts");
    4.     $hosts .= "127.0.0.1\t$server_alias\n";
    5.     file_put_contents("/etc/hosts", $hosts);
    6. }


    Собственно так выглядит шаблон нашего конфига:
    1. $host_template = <<<HOST
    2. <VirtualHost *:80> 
    3. ServerAdmin i@bogus.in 
    4. ServerAlias $server_alias
    5.  
    6. DocumentRoot $document_root 
    7. <Directory $document_root> 
    8.     Options Indexes FollowSymLinks MultiViews 
    9.     AllowOverride All 
    10.     Order allow,deny 
    11.     allow from all 
    12. </Directory>
    13.  
    14. ErrorLog \${APACHE_LOG_DIR}/$server_alias-error.log; 
    15. LogLevel warn 
    16. CustomLog \${APACHE_LOG_DIR}/$server_alias-access.log combined
    17. </VirtualHost>
    18. HOST;
    19.  


    Ну и теперь просто запишем конфиг в файл и напомним пользователю о том, что конфиг теперь нужно еще и активировать с помощью a2ensite:
    1. file_put_contents("/etc/apache2/sites-available/$server_alias", $host_template); 
    2. echo "Apache config for this hostname created successfully! Don't forget to run a2ensite $server_alias\n";
    3.  


    Скрипт написан. Нужно сохранить его в файл и не забыть установить флаг +x, чтобы его можно было запускать как программу:
    chmod +x a2addsite

    Использование

    Теперь скрипт можно использовать. Можно как вводить всю информацию в консоли:
    % sudo ./a2addsite
    Add test.local to your /etc/hosts? (Y/N) [Y]:
    Enter your document root [/home/www/test.local]:
    Apache config for this hostname created successfully! Don't forget to run a2ensite test.local


    так передавать всю или часть информации скрипту в качестве параметров при вызове:
    % sudo ./a2addsite --server-alias=test2.local --add-to-hosts --document-root=default
    Apache config for this hostname created successfully! Don't forget to run a2ensite test2.local


    Выводы

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

    Литература

    Больше информации о потоках ввода вывода, а также о остальных особенностях работы с консолью в PHP можно получить на официальном сайте PHP (англ.):
    Command line usage
    PHP input/output
    Share post

    Comments 171

      0
      ПХП великая вещь, у меня на домашнем сервере пхп-скрипт пингует яндекс и в случае проблем перезагружает adsl-модем.
        0
        Давно хотел написать такой же, но лень — великая вещь. Поделитесь скриптом)
          +5
          Так там писать-то особо и нечего, особенно если модем D-Link:
          <?

          exec('ping avangard-dsl.ru', $c);

          $c = implode('', $c);

          $c = iconv('cp866', 'windows-1251', $c);

          if(!strpos($c,'TTL'))
          {
          echo 'reboot';
          $fp = fopen('http://192.168.1.1/rebootinfo.cgi', 'r');
          fclose($fp);

          }
          else echo 'ok';
          sleep(3);

          ?>

          Запускается это всё, планировщиком раз в 10 минут, батником вида:
          php.exe -f reboot.php
            0
            перекодировка лишняя :)
              0
              а как же логин на модем?
                0
                на модемы d-link логин не нужен.
                  +2
                  Это на какие не нужен? У меня старичок dsl-500t — требует
                    0
                    dsl-2500, dsl-2640 не треба
                      0
                      Логин можно включить, а можно выключить ;)
                        0
                        Вы бы лучше включили пароль и почитали про CSRF. Мелочь конечно, но вам нужен внезапный ребут? :)
              0
              А вот мой по телнету. Требует telnet.class.php
              
              <?php
              exec("ping ya.ru", $res);
              var_dump($res);
              
              if (count($res) < 11 or strpos($res[4], '192.168.1.1') or strpos($res[10], '100')) {
              	include_once 'D:\htdocs\imgate\html\scripts\telnet.class.php';
              	define('SERVER_IP', '192.168.1.1');
              	define('SERVER_LOGIN', 'root');
              	define('SERVER_PASS', 'pass');
              
              	$telnet = new telnet;
              	$telnet->setLog(1, "mylog");
              	$telnet->set_host(SERVER_IP);
              	$telnet->set_prompt("login: "); 
              	$telnet->connect(); 
              	$telnet->wait_prompt(); 
              	$telnet->write(SERVER_LOGIN);
              
              
              	$telnet->set_prompt("Password: "); 
              	$telnet->wait_prompt(); 
              	$telnet->write(SERVER_PASS);
              
              	$telnet->set_prompt("# "); 
              	$telnet->wait_prompt(); 
              	$telnet->write("reboot");
              
              	sleep(5);
              
              	$telnet->disconnect();
              }
              
                +4
                Expect же!!!
                  0
                  Спасибо.
                    +1
                    Я б ещё добавил «Bash же!», но куда там… :)
                      0
                      зачем bash, если есть zsh?
                      а Expect всё же лучше заточен под подобные задачи.
                        0
                        Вообще это все писалось под винду, а так да… ваши замечания учту, если понадобится на никсах.
                  +1
                  Если это линукс — тогда у pppoe-звонилок из коробки есть опции передозвона в случае отсутствия adsl. Например:

                    +4
                    Аргх, хабр запостил раньше :-(

                    «lcp-echo-interval 10»
                    «lcp-echo-failure 6»
                      0
                      Сцуко-adsl-модем бывает виснет так, что помогает только перезагрузка. Да и вникать в тонкости каждой железки не было времени, а PHP-скриптом это было сделано за 5 минут.
                      0
                      Тоже в свое время пинговал яндекс но после отказался — пинги идут, а торенты стоят. А после обновления прошивки, rebootinfo.cgi стал просить логин пароль от админки — и что-то совсем отказался :))) лень… да и виснуть часто перестал
                        0
                        А что за модем, что за прошивка? Я на dsl-2640U так нормальной прошивки и не нашёл :(
                          +1
                          Железка DSL-2640U_BRU_D, прошивал с офф-сайта. Сей девайс отпахал у меня года два, буквально пару месяцев назад он умер, сильно умер — осмотр электроники ничего не дал.

                          В замен взял DIR-320 + ADSL модем из уценки за 200 рублей. А после НГ вообще перелез на локалку, ADLS оставил в резерве. Но надо отдать должное DSL-2640U трудился 24/7 — 2 года. Но девайс кривоватый. Хотя DIR-320 на последней оф. прошивке тоже приходится ресетить (раз в неделю), но дарит надежду то, что не добрался до прошивки от Олега…

                          Я помниться еще провел подстройку торрент клиента — Transmission on NAS. Чтобы и без того мегабитный канал не забивать кучей соединений. И вроде как модему тоже полегчало. Попробуй покрутить настройки, девайсы дешевые и при большом объеме пропускаемых через себя данный тупят.
                            0
                            а версию прошивки не помните?
                              0
                              Через несколько часов буду дома, посмотрю что скачивал последнее.
                                0
                                DSL-2640U_3.12_6338_19_RU_1.24_20100607.img — судя по всему, на ней модем работал с лета, незадолго до кончины поставил 1.25. Все качал с офф. ФТП.
                        0
                        Спасибо. Меня (начинающего (близится год) пользователя Linux) вот как раз всё чаще подпирает некоторые задачи автоматизировать в виде скриптов. При этом языки с не-C-подобным синтаксом я как-то плохо перевариваю. Пока думал остановиться на Groovy или разобраться с tcsh, но Вы вот тоже идейку подкинули вполне.
                          0
                          Ну раз вы такой зацикленный на С, то пишите всё на С! В чём же дело? Ведь всё то же самое вполне можно реализовать на вашем любимом языке. Зачем себя утруждать учить что-то новое? Подумаешь, так весь мир делает — главное, что у вас аллергия на С-неподобные языки.
                            0
                            Это всего лишь дело вкуса, уважаемый. Так же и с естественными языками — кому-то нравятся романские языки, кому-то германские, например. Думаю сегодня мы можем себе позволить выбирать по душе, возможностей и единомышленников достаточно и там и там.

                            Более того, возможно (а возможно и нет), программисту (как и человеку любой другой профессии) как раз следует выбирать нравящиеся ему направления и развиваться именно в них, практикуя их, так сказать, к месту и не к месту (выражаясь менее экстравагантно — применяя их для решения широкого спектра практических задач, в т.ч. тех, для которых это не слишком популярно).
                              0
                              ваше последнее утверждение эквивалентно пользе стрельбы из пушки по воробьям, если задачу сокращения птичьего народа доверят артиллеристу :)
                              +1
                              Цикл «исходники-работающая программа» на php несколько короче чем на c. Потому (одна из причин) лет 10 назад я и перешёл с c(++) на php. Сейчас для CLI и GUI скриптов потихоньку (если есть время) перехожу на python, но если сроки решения задачи важнее чем условная «правильность», то выбора кроме php нет — синтаксис C я уже забыл почти, а библиотеки современные и не знал никогда.
                                +1
                                у вас же совсем другая история. Если нужно решить задачу администрирования типа представленной в этой заметке, то с вашей стороны было бы лучше всего взять питон. По ходу дела и изучите в интересной вам области, и больше подходит.
                                ИМХО, нужно по возможности использовать разные инструменты, руководствуясь большей приспособленностью инструмента под конкретную задачу. Вот ПХП для задач администрирования в консоли и маленьких системных скриптов подходит очень слабо.
                                  0
                                  Честно, не заметил большей приспособленности Python под маленькие (однопоточные, интерфейс stdin/stdout/stderr) CLI утилиты, чем PHP. По моему опыту область где Python наголову разбивает PHP — это GUI приложения, в CLI они, по-моему, равноправны, в вебе PHP обходит python (по крайней мере если не рассматривать сторонние библиотеки и считать мастхэв сторонний веб-сервер типа апача или инжиникса)
                                    +1
                                    а на мой вкус Питон для таких задач больше подходит, хотя тут можно спорить.
                                    А вот в смысле наличия почти всех библиотек сразу в поставке у Питона по сравнению с ПХП я точно уверен. Например, работа с почтовыми серверами и сообщениями в ПХП без доустановки сторонних пакетов весьма затруднена, а у Питона сразу всё есть.
                            +6
                            Во-первых, есть куча GUI утилит, например, kochizz.sourceforge.net/ либо www.debianhelp.co.uk/apacheweb.htm
                            Во-вторых, есть куча консольных уже готовых отлично отлаженных и функциональных скриптов.
                            В-третьих, ваше решение для консоли выглядит, мягко говоря, неубедительно. Очень уж PHP тускло выглядит в администрировании. Сейчас основа для linux это sh/perl/python, на которых написано почти всё внутри linux и у которых есть уже устоявшиеся решения для типичных проблем, лучше брать эти языки, чем писать таких вот «монстриков». Подумайте, почему за всё время существования php так никто и не «догадался» использовать его для административных задач. На это есть масса причин, которые хорошо обсосаны и растолкованы на просторах интернета.

                            Собственно, решение написать свой велосипед похвально, развивает кругозор и всё такое, но вот выбор инструмента — нет.
                              0
                              По поводу готовых утилит, знал только о Rapache, который не работает в последних версиях Ubuntu.
                              Да, возможно PHP не лучший инструмент в данной нише, но для моей задачи, думаю, более чем подходит.
                                0
                                Глупость — это пытаться одним только молотком закручивать гайки и есть лапшу.
                                Мудрость — это пытаться выбрать правильный инструмент для каждой задачи.
                                Умный программист/администратор должен знать несколько языков-инструментов для широкого круга задач, знать как их применить и когда, а не пытаться одной отвёрткой собрать.

                                В вашем случае последняя фраза должна быть переосмыслена так:
                                «PHP один из худших инструментов в данной нише, и для моей задачи, я уверен, не подходит более, чем полностью.»

                                Развивайте кругозор изучением новых инструментов и решений, вместо топтания на месте и написанием «монстров».
                                  +1
                                  Чтобы написать вспомогательный скрипт обязательно учить новый язык?
                                    +1
                                    Подписаться под кодексом джедая и повесить на стенку портрет Столлмана =)
                                      +1
                                      В контексте данного поста — да. И пользы куда больше, и время не зря потеряно. Не стоит утрировать цели данного поста, здесь показана банальная работа с файлами из документации, которую в состоянии осилить любой умеющий читать по-русски. Дык в чем смысл поста? Если показать, как пхп работает с потоками ввода/вывода, то зачем? Если показать конфиги апача, то они нисколечки не показаны. Если показать, как ваять скрипты для системы, то лучше взять действительно подходящий инструмент. Цель определяет средства.
                                        0
                                        ну почему. тем кто не знает что пых умеет работать в консольком режиме — самое оно :)
                                      +5
                                      Глупость — это для решения небольшой задачи учить новый язык.
                                      Мудрость — это сделать быстро и качественно решение, которое будет работать.

                                      Возможно, для системного администратора и имеет смысл знать несколько консольных языков, для среднестатистического программиста — достаточно одного-двух. И уж явно консольная задача не будет стимулом учить, например, python.
                                        0
                                        А было бы полезно поучить если не несколько тяжкий классический (ba-)sh, то хотя бы стройный Python… Насколько знаю действительно хороших программистов — все с удовольствием пробуют новые языки, даже в — или особенно в них — небольших личных задачах.
                                          +1
                                          я бы даже сказал — небольшие задачи для личного пользование есть отличный способ стартонуть в других языках. я так все вспомогательные утилитки пытаюсь писать на том чего полохо знаю, ведь реальная боевая задача ставит вопросы, до котороых просматривая кукбук сам не додумаешься, да и оптимальность и производительность не критична, можно безответственно гавнокодить :)
                                            +1
                                            Я не хочу холиварить, и никоим образом не хочу обидеть питон, но относительно данного случая возможности питона и пхп на равне. А учитывая что автор знает пхп, то для данного случая пхп выгодней.
                                              +1
                                              «Данный случай» — это небольшие вспомогательные скрипты? Я бы поспорил. Для Питона или Руби тематических либ бездна, да и стандартная библиотека весьма и весьма решает.

                                              А ту-у-у-у-ут…

                                              Скажем, надо мне множество картиночек распихать по куче url. Потоков нетуть. Процессы есть в своей наипримитивнейшей форме, но, к сожалению, никаких либ, упрощающих работу с ними, тоже нетуть. «Доктор, будем резать по живому.» (с)
                                                0
                                                Есть курл, есть неблокирующие сокеты, зачем процессы?
                                                Я специально подчеркнул что учитывая что автору уже известен пхп поэтому в данной ситуации ему выгодней писать на пхп.
                                                  0
                                                  Насчет «автору уже известен» — это фиг с ним, не аргумент для программиста вообще. Это ж не на ассемблер скакнуть надобно, а в такой же интерпретируемый язык.

                                                  Вы писали с неблокирующими сокетами? Основная проблема такого отхода — проблемная отладка и неудобная без тредов или процессов обработка результатов запросов. Тем более незачем использовать низкий уровень (в частности, неблокирующих) сокетов во вспомогательных скриптах. Мы ж не в эпоху C живем!

                                                  Резонно такие штуки использовать где-нибудь, где важна производительность — точно не в мелких скриптах. Да и… Вообще-то, процессы форкать можно и в php, просто это неудобно.

                                                  Или вот, еще задача. Стоит у вас славный 4-хядерный зверь. Или даже восьмиядерник, что не редкость на серверах. А надо 200 000 картинок конвертировать. Что будете делать без толковой работы с процессами и тредами? В один поток..?
                                                    0
                                                    Если че процессы работают в той же чески где и основная программа, форкать надо для многоядерных.
                                                      0
                                                      В той же части
                                                  +1
                                                  За серьезный аргумент я принял бы «стандартная библиотека весьма и весьма решает», если действительно решает, например если стандартная библиотека pyton/ryby может парсить параметры cli типа "--port=8080" всё остальное весьма и весьма субъективно. В частности php такой же интерпретируемый императивный язык с динамической типизацией, как и python/ruby. Это не LISP, не FORTH, мышление менять не надо, а многие конструкции с одного языка на другой переносятся практически вообще без правки (говорю это, написав на php :) скрипт для переноса с php на python — 90% абстрактного ООП кода переносится безошибочно с одноэтажными регулярками, правда рекурсивными, проблема с библиотеками стандартными — проще посмотреть два мана, чем описывать все соттвествия библиотек и, тем более, реализовывать отсутсвующие ).
                                                +1
                                                По-моему, только плохие программисты начинают изучать новые языки и библиотеки, когда дедлайн на носу :)

                                                Тут, конечно, не тот случай, скрипт чисто для себя. Но в свое время я выбрал именно php для решения подобных задач, не выбрал c(++), потому как компилируемый язык для таких задач не удобен, имхо, а других интерпретируемых императивных я тогда и не знал, даже не знал о том, что они существуют (кроме бэйсика :) )… Вернее вру, знал, что есть Perl и даже видел его, но вот выбрал php для веба сначала, а потом и для «админских» скриптов.Тупо временной отрезок от задумки до «релиза» при любой задаче заведомо короче на php, чем на любом другом языке.
                                                  0
                                                  *для меня короче: для человека знающего и python, и ruby на одном уровне судить не берусь.
                                                    +2
                                                    Действительно, в дедлайн любая каша сойдет неоттестированная сойдет :-D Кстати говоря, в этом, пожалуй, и заключается главное отличие корпоративных продуктов от разрабатывамых сообществом. В последних никто никуда не торопится…

                                                    Ну… Думаю, как человек, знающих как Питон, так Руби, вы должны понимать, где кроются архитектурные проблемы php: это и плохая наследственность (начинался-то язык как своего рода продвинутый шаблонизатор), и стандартная библиотечка для обобщенных задач не слишком подходит, и всякие другие нехорошие практики в наличии (как насчет именования методов глобальных функций, м?).

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

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

                                                      0
                                                      > Именование методов глобальных функций…

                                                      Это вы о чём?
                                                        +1
                                                        А вот о чем.

                                                        array_key_exists('b', $b); 
                                                        


                                                        … вместе с тем:

                                                        property_exists($c, 'd');
                                                        


                                                        Вот и запоминай закономерности как хочешь. Или, если откровенно — нету этих самых закономерностей в природе. Есть яичница-болтунья из deprecated и не очень функций, которая меняет формат со всякой версией языка.

                                                          0
                                                          А, ну тогда видимо имелось ввиду, — порядок и именование параметров в методах.
                                                          Да, согласен.
                                                            0
                                                            Да претензий значительно больше, сигнатура указанных функций — цветочки :)

                                                            Но пример простой, показательный и сразу в голову приходит.
                                            +5
                                            >>Подумайте, почему за всё время существования php так никто и не «догадался» использовать его для административных задач.
                                            >>На это есть масса причин, которые хорошо обсосаны и растолкованы на просторах интернета.

                                            А мужики-то и не знают :)
                                            У нас уже лет 7 php используется вместо sh/perl/python на серверах — очень удобно для веб-программистов, можно использовать любимые фреймворки, один и тот же код для веб-приложений и серверных нужд, не нужно разбираться в незнакомом редко используемом bash.
                                              +3
                                              редко используемый баш? я тут кучу открытий в каментах для себя сделал…
                                                +3
                                                ну да, zsh — наше всё
                                                  –7
                                                  я так чую скоро automake на говнопых перепишут. надо линусу идею подкинуть, make menuconfig тоже на php-cli замутить…
                                                    –1
                                                    опять же сейчас добрый кусок линуксовых утилит пишется на питоне, что не плюс для линукса в плане производительности
                                                      0
                                                      Для скриптового языка Питон достаточно шустрый благодаря сохранению байт-кода в файлы .pyc и .pyo. Это избавляет интерпретатор от перекомпиляции кода модулей при каждом запуске.
                                                        0
                                                        а серьёзные проекты вроде mercurial уже сто лет как переписали узкие места на C.
                                                          0
                                                          Не поверите, кешеры храняк код пхп в памяти, и этот код имеет на много больший отклик чем бакт код в файлах pyc. Apc может работать с php-cli. Сравнивать пхп с питоном не буду, я не вкурсе.
                                                            0
                                                            да тут вообще топик отрытий )
                                                              0
                                                              Я Вас не заставляю переписывать все текущие скрипты на пхп, у пхп своя ниша — веб. Я просто констатирую факты.
                                                                0
                                                                кешер, кстати, насколько медленнее насколько рабоатет flock на чтение байткода. вообще самый быстрый код — на лиспе, давайте на нем вебпанельки писать? )
                                                                  +2
                                                                  Неужели в этом топике хоть кто-то сказал что надо писать ТОЛЬКО на «мой любимый язык» потому что он быстрей итп, нет, это не так, но если человеку понадобилась панелька, он написал ее на том что знал, и понял что для таких базовых задач его яп очень можно использовать. Я тоже писал скрипты для автоматизации рутины на пхп и на питоне, они подходят для этого не хуже шела, но при условии что я их уже знаю.
                                                          +2
                                                          Вероятно вас это шокирует, но python где-то от 2-3 до 20-30 раз быстрее bash-а.
                                                          0
                                                          а по причине объема библиотек и биндингов. кросплатформенности так же.
                                                            0
                                                            так я не и не что это плохо :) это коммент был на слегка неадекватное сообщение. пишите на чем вам хочется и к чему душа лежит — а если не нравится то что есть, ищите другое или переписывайте сами
                                                              0
                                                              неверные советы даете :)
                                                              сначала смотрите что можно использовать, потом только переписываете и если только совсем косяк — пишите свое.
                                                                0
                                                                ну я это и имел в виду, просто чуть чуть сложно написал, мысль про переписывание начинается после тире :)
                                                          0
                                                          сам-то понял, что сказал?
                                                            –1
                                                            можно и не хамить кстати :)
                                                            можем комитами в symfony померяться для важности. есть шанс, что проиграете.
                                                            я как бы неплохо ориентируюсь в теме, и лезть с PHP в такие штуки — глупо.
                                                              +1
                                                              Комиты в симфони — показатель крутости и важности? Мне, например, на много приятней подсказывать маленьким библиотечкам на их ошибки, чем делать комиты в проекты с огромным сообществом. Я хуже от этого? Со скриптовыми языками лезть в скриптовые автоматизации очень даже не глупо, что я на шеле напишу пару ифов, пару форов, обратобаю аргв и запишу результат в файл, что на пхп, что на питоне, это не суть важно, это «тупые задачи» их можно писать на чем угодно.
                                                                –1
                                                                не влезайте в чужой спор, пожалуйста. если вы не заметили, develop7 очень значимый в Росии спец по symfony… как и я в Латвии.
                                                                  0
                                                                  Это не показатель давить комитами.
                                                                  0
                                                                  Комиты в симфони — показатель крутости и важности?
                                                                  принятые? Да. Хотя бы из-за того, что во главе сообщества стоят, мягко говоря, очень опытные люди (Fabien — 15 лет в индустрии).
                                                                    +1
                                                                    Блин, какой же я не крутой из-за того что не использую симфони и не лажу в его ядре, и не вижу что можно было бы изменить… Какие же не крутые и другие разработчики которые не используют симфони и не комитят измнения туда, какие же не крутые разработчики высоконагруженных проэктов потому что не комитят в симфони код… Ну я думаю вы поняли ироничность моих слов =)
                                                                      0
                                                                      Блин, какой же я не крутой
                                                                      Вы не подумайте, меня это не беспокоит. Равно как и собственная «крутость». Просто я а) очень уважаю людей из symfony core team и б) знаю, за что уважаю. Поэтому мои патчи, одобренные ими и включённые в ядро — есть, имхо, Показатель. Но не более.
                                                                  0
                                                                  я просто не понял, зачем переписывать automake вообще?
                                                                    +3
                                                                    а зачем переписывать cpan'овскую Apache::Template просто потому что ты знаешь только PHP?
                                                                    это был такой толстый троллинг.
                                                                      0
                                                                      а зачем переписывать cpan'овскую Apache::Template просто потому что ты знаешь только PHP?
                                                                      «фатальный недостаток»? :) с другой стороны, могут быть какие-то ограничения проекта (вроде «голоса из розетки запрещают»). и ах да — банальная лень изучать новый язык, и (что намного более трудоёмко) — «ну и как мне прозрачно и нативно заюзать код на перле из проекта на php?».
                                                                        +2
                                                                        почему проект не может состоять из работающих кусочков на разных языках?

                                                                        на тему юзанья — а куда придумали dbus тот же? unix sockets?

                                                                        кстати, второй комментарий к статье вообще был про непериваривание c-подобного синтаксиса. я так прямо и похоронил ruby вместе с vhdl.

                                                                        заканчивая тему могу прдложить автору консервным ножом нарезать хлеб, а простым открыть тушенку. неблагодарное дело.
                                                                          0
                                                                          Я ж в принципе согласный. Мир?
                                                                            0
                                                                            тролинг не кончался, война не начиналась :P
                                                                    0
                                                                    есть шанс, что проиграете.
                                                                    Однозначно проиграю. У меня принятых патчей намного меньше, чем может показаться.
                                                          +5
                                                          не могу придумать аргумент почему пых хуже шела перла и питона для написания тулзов. Я не защищаю пых, мне просто интересно, может действительно так и есть? Растолкойте вкратце так как просторы интернета почемуто не отвечают
                                                            +2
                                                            Примитивный парсер аргументов getopt() (по сравнению с питоном например) (кстати, даже он в скрипте из поста не используется)
                                                            Примитивная работа с пайпами/подпроцессами (по сравнению с башем)
                                                            С юникодом не очень дружит

                                                            Наверное еще что то можно вспомнить
                                                              0
                                                              Можно без проблем воспользоваться небольшим framework'ом. К тому же если речь идёт о реальном проекте, то framework, скорее всего, используется. Отлично, например, себя зарекомендовали symfony tasks.
                                                                –1
                                                                а у питона нет убодств для веба — для этого придумали джангу, и что? срать на питон? ну смешные ей-богу :) халиваааааар!!!
                                                                  0
                                                                  у питона есть wsgi для веба. А фреймворки и в PHP есть
                                                                    +1
                                                                    так и я к тому же — питон язык скриптовый и консольный, его допиляли для работы с веб, и он прекрасно справляется с этим. Руби аналогично. PHP изначально делался как язык для веб, и его допиляли для работы с консолью, что в этом страшного? Если тот же си допилять до нормальной работы с веб (и кажется гдето я про такие фреймворки читал) — то он тоже будет абсолютно адекватным, если даже не более адекватным, решением для веб. Где я не прав?
                                                                      +2
                                                                      Афаик, python не допиляли до нормальной работы с вебом, допиляли, максимум, стандартные библиотеки, плюс куча различных фреймворков на их базе (или без оной, внутрях не ковырялся). В тоже время, php нормально поддерживает CLI (я писал CLI приложения на php ещё когда php4 не пахло — утрируя, намного удобнее писать разовые утилитки чем что на хорошо знакомом C, чем что на плохо знакомом интерпретаторе .CMD/.BAT) и намного лучше поддерживает веб чем python (который на уровне языка его практически никак не поддерживает).
                                                                  0
                                                                  >Примитивная работа с пайпами/подпроцессами (по сравнению с башем)
                                                                  пайпы в баше скорее необходимость, ввиду минималистичности языка. В пыхе куча встроенных функций, делать пайпы из десятка программ тут не нужно. Хотя в принципе можно при желании. А чем вам работа с подпроцессами в баше нравится? Вроде ничего такого жутко удобного я там не припоминаю.
                                                                    0
                                                                    Простите, а чем питоновский парсер лучше? Я думал они оба украдены из си
                                                                      0
                                                                      В питоне я говорил о модулях типа optparse или argparse. Умеют валидацию, типизацию, автоматическую генерацию "--help" как минимум
                                                                        0
                                                                        Я не пытаюсь тролить но параметры обычно это строка либо число, так вот, на сколько нужна более гибкая и совершенная валидация если мне нужно получить либо строку либо число (обычно)? Генерация хелпа это да, хорошо, но надо для этого его вбить туда. А здесь просто получение значения по ключу, для 80% задач этого с головой хватает.
                                                                  +2
                                                                  >Очень уж PHP тускло выглядит в администрировании. Сейчас основа для linux это sh/perl/python

                                                                  а мсье точно сможет технически это обосновать? Чего такого есть в других скриптовых языках и чего сильно не хватает в пыхе.
                                                                    –2
                                                                    А зачем в администрировании использовать язык, который для этого никак не предназначен?
                                                                      +3
                                                                      так я и спрашиваю, в чем технически это выражается, что может оправдать время, затраченное на изучение нового языка. А мыслить только шаблонами — плохо, от этого мозги засыхают.
                                                                      • UFO just landed and posted this here
                                                                          0
                                                                          Например, более эффективное и быстрое решение сложных задач. Возьмём Python: быстр и прост в изучении; высокая скорость разработки; лаконичный синтаксис; стандартная библиотека содержит много полезностей + сторонние библиотеки, помогающие в администрировании; инструментарий для управления пакетами (easy_install).
                                                                            +1
                                                                            это у вас какой-то маркетинговый текст вышел. Все, что вы написали про питон, в целом характерно и для пхп.
                                                                              +1
                                                                              нет, РНР отличается. Лаконичный синтакс — не для задач администрирования!
                                                                              Стандартная библиотека содержит много полезностей? Только для веба.
                                                                              Какие сторонние либы, помогающие в администрировании вы можете назвать для РНР?
                                                                              Ну давайте возьмём пример — скрипт для просмотра новых конфигов, вырезает пустые строки, комментарии и пробелы в начале строки

                                                                              #!/usr/bin/perl
                                                                              while ()
                                                                              { chomp;
                                                                              s/^\s//;
                                                                              next if /^#/;
                                                                              next if /^$/;
                                                                              print "$_\n";
                                                                              }

                                                                              а теперь напишите мне столь же короткий и изящный код на РНР
                                                                                +1
                                                                                очередной фатальный недостаток — php считает смайлики синтаксической ошибкой. какое безобразие!
                                                                                  0
                                                                                  while () { s/^\s+|\s+$//g; say unless /^[#$]/; }
                                                                                    0
                                                                                    ваш код явно не на РНР, поэтому я просто не понял, к чему он?
                                                                                      0
                                                                                      более короткий и изящный.
                                                                                      кстати, ой.
                                                                                      while () { s/^\s+|\s+$//g; say unless /^[#$]/; }
                                                                                      вот.
                                                                                        +2
                                                                                        Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку.
                                                                                        Мартин Фаулер
                                                                                          0
                                                                                          Программист, который не понимает данный код — хороший?
                                                                                            0
                                                                                            Факт непонимания этого кода в отрыве от контекста не говорит о программисте абсолютно ничего.
                                                                                    –1
                                                                                    >а теперь напишите мне столь же короткий и изящный код на РНР

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

                                                                                    В обратку: напишите мне на перле функцию, проверяющую доступность определенной страницы (url). Без сторонних костылей.
                                                                                      0
                                                                                      на перле я бы обязательно скачал и подключил сторонний модуль. Поэтому предпочёл бы решить данную задачу на питоне. И решение будет менее изящным чем на ПХП, скорее всего. Но тема ж не про веб, а про админство.
                                                                                        0
                                                                                        >на перле я бы обязательно скачал и подключил сторонний модуль. Поэтому предпочёл бы решить данную задачу на питоне. И решение будет менее изящным чем на ПХП, скорее всего
                                                                                        ну вот видите, и все пролетели. Нет идеального инструмента для всего.

                                                                                        >Но тема ж не про веб, а про админство.
                                                                                        так и я про него. Или админу грех работать с HTTP? :)
                                                                                    –1
                                                                                    а у pear есть ещё и uninstall!
                                                                                0
                                                                                питон тоже для веба нулячий, написали под него целую надстройку в виде Джанги и других фрейвворков- и щас любители питона срут в пхп что он не консольный. Ясен пень — пых же для веба писался — а для консоли ему надо цеплять такой же фреймворк как питону для веба :) это же все холивар, смыслу раскидываться такими заявами?
                                                                                  +3
                                                                                  В принципе для простых (не требующих сложной «бизнес-логики») задач администрирования, имхо, php справляется не хуже Си/Си++/Перла/Питона/Руби/Джава/C#/Basic при использовании только стандартных библиотек. Это мнение на основе опыта 10-летнего опыта разработки на php, 10-летнего опыта на Си и Бэйсике и поверхностного знакомства с остальными. По сути, для задач администрирования (с которыми я встречался, только под windows, под linux/bsd я предпочитаю решать задачи в баше ручками, в целях самообразования) все эти языки одинаковы, извращаться над «бизнес-логикой» не приходится, те же циклы, условия и т. п., а недавно php и goto стал поддерживать :) )
                                                                            +4
                                                                            1. Так нельзя обрабатывать аргументы, есть специальная функция/модуль getopt() в нормальных языках
                                                                            2. Проверка после «Add $server_alias to your /etc/hosts? (Y/N) [Y]:», должна посылать при корявом вводе
                                                                            3. Забыл выполнить apache2ctl configtest в конце
                                                                            4. Конфиг нужно генерировать с помощью шаблонов, а не просто подстановкой переменной
                                                                            5. Зачем проверять наличии директории и прав записи на неё… просто записать и если не получиться то поймать исключение
                                                                            6. Конциг для скрипта нужно делать отдельным файлом(ini,yaml,xml,...)
                                                                            7. Предварительно нужно замести конфиги в систему контроля версий, и после тоже не помешает
                                                                              +2
                                                                              Для пыха тоже есть getopt встроенный. И более навороченный в PEAR.
                                                                                +1
                                                                                В старых версиях пхп getopt не работал в windows, только начиная с 5.3 работает.
                                                                              –4
                                                                              Почему #!/usr/bin/env php, а не #!/usr/bin/php?
                                                                                +2
                                                                                Потому что php не всегда лежит в /usr/bin
                                                                                  –4
                                                                                  Ну не env'ом же искать программы по PATH?!
                                                                                    +3
                                                                                    Вообще-то именно это многими рекомендованный способ — php, perl, ruby, bash — для всяких высокопортабельных применений…
                                                                                +2
                                                                                В принципе это можно и на баше написать, чтобы не зависеть от языка
                                                                                • UFO just landed and posted this here
                                                                                    0
                                                                                    я понимаю, но баш знаю очень-очень плохо
                                                                                    когда-то подобный скрипт практически целый день писал
                                                                                    а здесь же справился буквально за 10 минут
                                                                                      +2
                                                                                      Я тоже в баше совсем не разбирался, теперь более менее понятен.
                                                                                      Да, он не так удобнен, но зато расширяется кругозор
                                                                                      Вот 2 статьи для введения в bash: tux-the-penguin.blogspot.com/2010/12/bash-ii.html
                                                                                        0
                                                                                        Спасибо, почитаю.
                                                                                        +2
                                                                                        Выучи баш и перестань городить велосипеды

                                                                                        ping -n 1 example.com || curl modem/reboot
                                                                                          +1
                                                                                          Опять ошибся веткой, да шо ж такое…
                                                                                            0
                                                                                            Вот синтаксис баша я худо-бедно выучил (фиг с ним, что он фактически не кроссплатформенный, пишу для себя), но вот в вашем примере вызываются сторонние, по сути, библиотеки, причём curl на, например, debian нужно ручками ставить
                                                                                              0
                                                                                              Бивис, он назвал курл библиотекой, а баш не кроссплатформенным!

                                                                                              php, небось, уже давно в ядре есть, он-то самый кроссплатформенный, небось.
                                                                                                +1
                                                                                                Ой, покорно прошу прощения, библиотека конечно же libcurl, а curl не фига не библиотека (что для curl нужен libcurl, что для php — забъём для ясности). А баш я назвал не «некроссплатформенным», а «фактически некроссплатформенным».

                                                                                                P.S. Меня зовут не Бивис или вы к кому обращались? Или это персонаж молодежной субкультуыры типа «Василь Иваныча» в советские времена?

                                                                                        +1
                                                                                        зомфг.
                                                                                        с hosts вы особенно зря возились — проще поставить dnsmasq и прописать дополнительную зону/хост в конфигах.
                                                                                          –2
                                                                                          все дело происходило на нетбуке. очень не хотелось лишний раз нагружать систему пусть даже чуть-чуть
                                                                                            +2
                                                                                            dnsmasqом и нагружать?? ну вы даёте.
                                                                                            mem: 516K reserved, cpu time: 1m33s из 4d7h30m аптайма.
                                                                                              0
                                                                                              возможно я и не прав
                                                                                          0
                                                                                          Высший пилотаж — ANSI консоль.
                                                                                            +4
                                                                                            Извините конечно, но что это за процедурный говнокод?
                                                                                            В if'е ‒ for
                                                                                            в for'e ‒ switch
                                                                                            в switch'e ‒ if

                                                                                            кто вас так писать учил?
                                                                                            if на if'e и if'ом погоняет.

                                                                                            p.s.
                                                                                            в 2-ом листинге ошибка. Там начало скопипастено 2 раза.
                                                                                              0
                                                                                              простите, но почему нельзя так писать? PHP учил сам, но вот С++ учил в университете и ни разу не слышал никакой критики о подобных конструкциях ни от одного из преподавателей.
                                                                                              switch вместо if использовал потому, что так мне показалось удобней

                                                                                              за ошибку спасибо, исправил
                                                                                              • UFO just landed and posted this here
                                                                                                  0
                                                                                                  аа, понял. буду иметь ввиду
                                                                                              0
                                                                                              Может правильней было бы: «Использование PHP из командной строки»?
                                                                                                0
                                                                                                Исправил на «Программирование в PHP для командной строки»
                                                                                                +4
                                                                                                я использую модуль macro, для стандартных виртуальных хостов сделан шаблон, что-то типа
                                                                                                <Macro Vhost $name $path>
                                                                                                    <VirtualHost *:80>
                                                                                                        ServerName $name
                                                                                                        DocumentRoot $path
                                                                                                        ...
                                                                                                    </VirtualHost>
                                                                                                </Macro>
                                                                                                

                                                                                                все что надо — лишь добавить строчку для инициилизации нового хоста
                                                                                                Use Vhost hostname /path/to/wwwroot
                                                                                                

                                                                                                что прекрасно делает скрипт на баше
                                                                                                echo "Use Macro $1 $2 >> /path/to/apache/conf"
                                                                                                

                                                                                                вызываемый с аргументами
                                                                                                ./addvhost <hostname> </path/to/wwwroot>
                                                                                                

                                                                                                хоть я и являюсь PHP разработчиком, но предпочитаю использовать его только там, где он действительно нужен
                                                                                                  +1
                                                                                                  Замечательная статься отлично показывающая что нельзя делать даже в случае угрозы насильственной расправы. Для этих целей существует bash(который есть во всех дистрибутивах) или sh(который есть и в бсд и в линуксах) или python(работаю в основном с RHEL, за deb-based не могу ничего сказать), либо perl, как стандарт.
                                                                                                  • UFO just landed and posted this here
                                                                                                      –2
                                                                                                      «Я не очень хорошо пишу скрипты в bash'e, поэтому решил использовать PHP для моей довольно простой задачи, который я, к тому же, знаю довольно неплохо.»

                                                                                                      и отсюда вытекает куча проблем. Обновляешь пакеты, там php 5.3 и тут начинается самое веселое занятие :)
                                                                                                        +1
                                                                                                        что подразумевается под веселым занятием? пых както криво работает?
                                                                                                          0
                                                                                                          У меня после обновления php с 5.2 до 5.3 часть скриптов не выполнялась, а отдавался исходник. Если не учитывать, что перестали работать семафоры и еще пара функций.
                                                                                                            0
                                                                                                            а я переезда на 5.3 вообще не заметил. Коллега — тот заметил из-за того, что использовал ereg*. Что Я Делал Не Так?
                                                                                                            • UFO just landed and posted this here
                                                                                                      +1
                                                                                                      Скажите, пожалуйста, как мне найти bash в моей WindowsXP?

                                                                                                      И какого фига я должен учить (и устанавливать, возможно) ещё один язык для задач, которые я могу решить на «родном» языке (он будет на компе, где я поднимаю виртхост 100%) за 5 минут? Нет, я всё понимаю, что есть языки подходящие лучше для этой задачи, есть для этих языков библиотеки/фреймворки, позволяющие человеку знакомыми с ними решить эту же задачу за 1 минуту. Но вот лично вы можете гарантировать лично мне, что хотя бы пару часов потраченных на знакомство с bash (как, кстати, из баша получить отклик (или убедиться, что отклика нет) от сайта, не используя сторонних утилит типа ping и curl? как файлы по циклу гонять я нашёл в man bash, как им в этих файлах что-то найти, не говоря о замене этого найденного — не нашёл, постоянно ссылки на внешние утилиты типа grep :-( а это контроль зависимостей и т. п.)

                                                                                                      Python в deb-based есть, не самый последний, но есть, про rpm-based :) не скажу, про emerge-based, тем более, как-то не возникало мысли проверить :)

                                                                                                        0
                                                                                                        > И какого фига я должен учить (и устанавливать, возможно) ещё один язык для задач, которые я могу решить на «родном» языке (он будет на компе, где я поднимаю виртхост 100%) за 5 минут? Нет, я всё понимаю, что есть языки подходящие лучше для этой задачи, есть для этих языков библиотеки/фреймворки, позволяющие человеку знакомыми с ними решить эту же задачу за 1 минуту. Но вот лично вы можете гарантировать лично мне, что хотя бы пару часов потраченных на знакомство с bash (как, кстати, из баша получить отклик (или убедиться, что отклика нет) от сайта, не используя сторонних утилит типа ping и curl? как файлы по циклу гонять я нашёл в man bash, как им в этих файлах что-то найти, не говоря о замене этого найденного — не нашёл, постоянно ссылки на внешние утилиты типа grep :-( а это контроль зависимостей и т. п.)

                                                                                                        man unix-way

                                                                                                        > Python в deb-based есть, не самый последний, но есть, про rpm-based :) не скажу, про emerge-based, тем более, как-то не возникало мысли проверить :)

                                                                                                        Мы не пользуемся deb, Gentoo, Arch и прочим в силу отсутствия вменяемого платного саппорта с поддержкой Oracle. в RHEL/CentOS Anaconda написана на Python. Есть такая вещь как цикл поддержки, пока он не завершится новая версия python мне не будет нужна и мне не придется тестить приложение на совместимость с 2.4-2.7 версиями, т.к. в системе есть только 2.4
                                                                                                          +1
                                                                                                          volch@localhost$ man unix-way
                                                                                                          Нет справочной страницы для unix-way
                                                                                                          

                                                                                                          :)

                                                                                                          Видимо, у нас с вами очень разные задачи и очень разный подход к их решению. Я не спорю, вариант «каждой задаче, или даже подзадаче — наиболее подходящий для неё инструмент» в теории является оптимальный, но на практике изучение python/bash/.../любого другого ЯП для написания программы, которая автоматизирует 5 минут ручной работы, которую делаешь раз в месяц, имхо, непродуктивно. Пускай знакомый ЯП делает эту работу за 5 секунд, а не знакомый за 0.01. Но прикиньте что на изучение простейшего синтаксиса, процедуры «сборки» и запуска программы, использования самых примитивных стандартных библиотек (типа посимвольного чтения stdin и записи stdout) нового языка нужно пускай 2 часа, после чего я смогу написать программу за 10 минут (так же как на хорошо знакомом языке). Эти два часа окупятся через 1443 запуска программы, или через 120 лет. Оно того стоит?
                                                                                                      +1
                                                                                                      Зовите же Бобука скорей на этот вертеп!
                                                                                                        0
                                                                                                        А может быть кто-нибудь подскажет как можно завернуть соединение на свой внешний IP-адрес приходили не на модем, а пробрасывались мою машину за ADSL-модемом?
                                                                                                          0
                                                                                                          насколько я понял из словесных изворотов вопроса, вам Port Forwarding надо сделать
                                                                                                            0
                                                                                                            Мне надо что-бы при обращении из своей локальной сети мой ADSL роутер при обращении на внешний IP-адрес пробрасывал соединение на мой Web-сервер, который кстати уже проброшен во внешний мир. Давайте в личку если можете чем-то помочь если просто языком болтаете лучше не мешайте.
                                                                                                              0
                                                                                                              ну после такой постановки вопроса считайте что я просто болтаю языком :)
                                                                                                            0
                                                                                                            А каким боком маршрутизация пакетов относится к ПХП и програмированию?
                                                                                                              0
                                                                                                              Прочитайте статью еще раз. Посмотрите круг задач которые решает данный скрипт. Уверен найдете некоторую связь.
                                                                                                                0
                                                                                                                Не буду разжигать холивар, но данная тема про программирование, а не администрирование и вопрос уровня как это сделать. А Ваш комментарий как раз относится к разделу Вопрос и Ответ.

                                                                                                                ЗЫ. конечно можно на пхп написать демон-прокси ;), если это то что Вы спрашивали то тогда правильно формулируйте свой вопрос и к Вам не будет претензий.
                                                                                                            +1
                                                                                                            Этааа, основы философии Юникс.
                                                                                                            www.faqs.org/docs/artu/ch01s06.html

                                                                                                            Думаю, поможет прояснить, почему, многие отрицательно отнеслись к практике написания велосипедов на PHP. Это скорее показывает не знание ПХП, а незнание Юникса. Десятки разработчиков годами писали и вылизывали команды и их взаимодействие, для кого спрашивается?:)
                                                                                                            В sh нет ничего сложного, всё что он делает — оперирует с уже готовыми утилитами в консоли, Один-два вечера с манами и парочкой HOWTO и всё, ты знаешь весь язык, дальше просто набираешься опыта. И это намного полезнее для общего развития как разработчика в Юникс-среде.

                                                                                                            Only users with full accounts can post comments. Log in, please.