PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
JustUserR Модератор
Отправлено: 17 Декабря, 2009 - 13:24:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 8721
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Запуск Perl-скриптов

ТЕОРИЯ - Как работает Perl-интерпретатор и шлюз CGI

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

Perl-скрипты являются в общем случае некомпилируемыми в исполняемый файл, то есть интерпретируемые Perl-интерпретатором каждый раз при запуска Не будем пока касаться устройства механизма компиляции, а также вопроса как оптимизировать запуск Perl-скриптов На данном этапе важно понять как именно они запускаются программистом или пользователем
Распространено мнение, что Perl-скрипт должен начинаться с так называемой shebang-конструкции, в которой написано что-то вроде #!/usr/bin/perl для Unix, и даже что-то типа #!Perl для Windows На самом деле данная строчка не является Perl-кодов и что немаловажно, вообще не имеет никакого отношению к языку Perl, а только относится к конкретному файлу
Итак мы выяснили, что shebang-строка (Будем далее ее называть также по-умному не имеет прямого отношения в Perl Как же тогда запускать Perl-скрипт? Да очень просто, вызвав команду /usr/bin/perl /path/to/script.pl или просто perl /path/to/script.pl Если вы работаете под Windows, и вас интерпретатор занесен в переменную окружения Path, то вызвать Perl-скрипты можно аналогично, только не забыв подставить букву диска в пути к Perl-скрипту

Так для чего же нужна тогда shabang-строка, и почему она считает необязательной, если ни один CGI-скрипт, написанный на Perl, без нее не заработает? На самом деле все дело в правах доступа по UNIX Дело в том, что в отличие от Windows, файл имеет разрешение не только на чтение или запись, но и на выполнение его тем или иным пользователем
При установке прав пользователя на файл, привилегия выполнения это третье число, то есть к примеру 0755 означает все права для владельца, и чтение и выполнение для группы пользователя и всех остальных пользователей То есть в UNIX имеется возможность попробовать запустить любой файл, если на это имеется соответствующее разрешение, причем расширения файла может и не быть вообще Можно попробовать запустить любой файл командой ./filename из директории с данным файлом
Если файл оказывается двоичным исполняемым файлом, то он попросту запускается Но если файл оказывается текстовым, то ничего страшного тоже не происходит, и тогда операционная система начинает искать shebang-конструкцию, и если находит ее то запускает указанный там двоичный файл, и передает ему данный файл в качестве аргумента Таким образом, для Perl строка с shebang-конструкцией является ТОЛЬКО комментарием, а вот для операционной системы дает возможность узнать интерпретатор для данного файла

Такой подход дает возможность использовать интерпретируемые программы в UNIX наравне с компилируемыми В сервере Apache на самом CGI-скрипты не являются поддерживаемыми сами по себе, для их работы требуется модуль cgi_module, который добавляет тип данных cgi-скрипт И если какой-то файл имеет данный тип, то Apache формирует переменные окружения и просто запускает данный CGI-скрипт в операционную системе

В Apache для Windows такая система работала бы чуть хуже Как уже было сказано, после того как Apache определяет, что данный файл является CGI-скриптом, он передает его на запуск операционной системе Но Windows умеет исполнять только двоичные исполняемые файлы, и поэтому не знает что делать с shebang-конструкцией По этой причине в Apache под Windows была добавлена возможность распознавания с помощью Apache самой shebang-строки в CGI-скрипте, и уже вызов интерпретатора с данным аргументом в виде данного файла Такой подход дал возможность сделать Apache совместимым в UNIX и Windows
Кстати поведение модуля cgi_module в Apache под Windows тоже регулируется Дело в том что Windows в принципе тоже умеет запускать неисполняемые файлы, определяя их интерпретатор по расширению, список которых хранится в реестре Для переключения данной настройки в режим реестра Windows используется опция ScriptInterpreterSource registry, для переключения обратно данная директива удаляется

Таким образом мы выяснили, как запускаются CGI-скрипты в Apache и для чего нужна shebang-строка Заметим, что права доступа на CGI-скрипт должны быть такими, чтобы пользователь Apache, который обычно называется www-data, мог бы запускать данный CGI-скрипт, при этом установка 777 всегда должна давать такую возможность Однако на некоторых хостингах права 777 выставлять запрещено и при этом возникает ошибка, такое поведения сделано с целью повышения безопасности, но оно никак не противоречит вышеуказанной схеме, просто обычно устанавливается модифицированный модуль cgi_module, который отказывается запускать CGI-скрипты с большими правами
Обычно для запуска CGI-скриптов требуется определенное расширение, которые будет связано с ними Поэтому для запуска CGI-скриптов им либо придают определенное расширения, либо устанавливают их обработчиками для заданных файлов, в результате чего CGI-скрипт, выставленный в качестве обработчика запускается автоматически при вызове заданного файла, хотя при прямом вызове он может и не работать
Важно не путать между собой директивы AddType cgi-script .ext для установки расширения CGI-скриптов, директиву Options +ExecCGI для разрешение выполнения CGI-скриптов в данной директории, а также директиву Action для установки данного CGI-скрипта в качестве обработчика для определенного типа файлов, установленного с помощью отдельного AddType для этого типа
В данной схеме разрешено множественное перенаправление, как по shebang-конструкциям, так и по типам файлов для CGI-скриптов Например если указанный в shebang-конструкции файла также оказывается интерпретируемым файлом со своей shebang-конструкцией, то он будет запущен по цепочке с последовательной передачей файлов как аргументов соответствующим интерпретаторам, но при этом необходимо чтобы все файлы были CGI-скриптами с shebang-конструкциями

Аналогично можно использовать произвольный CGI-скрипт для обработчика другим файлом, правда необходимо сделать всю цепочку из файлов с расширениями CGI-скрипта, либо использовать AddHandler заместо AddType При этом корневые исполняемые файлы, типа /usr/bin/perl должны быть объявлены в цепочке в основном конфигурационном файле Apache под названием httpd.conf, так как внутри .htaccess файлов нет доступа ко всей файловой системе

Практика - Установка Perl-скрипта и настройка web-сервера для запуска CGI-скриптов

Теперь можно применить полученные знания на практике, в частности для конфигурации Apache и запуска своих Perl-скриптов в CGI-режиме Для удобства будем рассматривать Linux-сервер, так как запускать и тестировать свои Perl-скрипты обычно приходится на настоящем хостинге
Даже в том случае, если у вас имеется свой сервер или вы настраиваете Apache под Windows, данный материал будет вам полезен, потому что как было указано ранее настройка Apache достаточно схожа
Для начала необходимо удостоверится в наличии Perl и соответствующих модулей к нему Частой причиной неработоспособности Perl-скриптов является именно отсутствие нужных модулей Для того, чтобы обобщить настройку Perl под Linux и windows, при установке Perl по Windows воспользуемся следующим правилом - структура каталогов должна быть примерно такая же, как и на системе Linux (Аналогичную структуру предоставляет Denwer), то есть исполняемый файл perl должен быть в папке /usr/local/bin, а модули в /usr/local/lib Также важно добавить путь к исполняемому файлу Perl в переменную окружения Path
Для удобства и дополнительной совместимости с linux, также лучше держать всю структуру unix-подобных каталогов в корне диска или на виртуальном диске, чтобы не использовать букву диска в путях Учитывая, что прямой / и обратный \ слеш во многих конфигурационных файлах идентичны, такой подход даст сильную схожеть с linux
Чтобы установить Perl под Windows, необходимо скачать ActivePerl с сайта http://www[dot]activestate[dot]com/activeperl/ и установить в заданных корневой каталог, сохраняя структуру дерева папок
Также надо помнить, что не во всех операционных системах типа *NIX пути будут в точности такими же, часто встречаются пути и без каталога /local/, то есть просто /usr/bin и /usr/lib, а также /etc для конфигурационных файлов

Установка модулей под Windows осуществляется с помощью программы PPM, которая имеет графический интерфейс и умеет сама скачивать и компилировать модули, а также устанавливать их в нужную директорию Для увеличения списка возможных модулей, нужно выбрать репозиторий, список которых можно получить в интернете Также при установке важно выбрать правильную папку для хранения модулей Perl, так как будет предложено несколько папок со схожими путями, при этом необходимо выбрать ту, которая не имеет имени диска Если таких папок несколько, то нужно выбрать ту которая имеет путь оканчивающийся на site/lib, а если же во всех папках указан путь диска, это свидетельствует о неправильной настройке Perl
Для установки модулей под Linux необходимо компилировать их вручную, при этом обычно используется программа-конфигуратор configure, в которой определяется путь к папке с модулями Perl, и происходит соответствующая настройка Для некоторых дистрибутивов Linux существуют скомпилированные модули, аналогичные модулям Windows, их можно получить и автоматически настроить через установщик apt-get и ему подобные
Важно помнить, что часть модулей под Windows имеют характерную особенность, а именно скомпилированные в dll-файл компоненты данного модуля, и загружаемые через bootstrap Именно поэтому достаточно сложные модули нельзя просто копировать не только между разными системами, но и разными папками, так как dll-файлы должны лежать в четко определенном месте
Также в Perl имеется возможность для заданного Perl-скрипта указать путь к библиотекам, это можно сделать с помощью прагмы use lib 'path/to/library', указав относительный или абсолютный путь Если таким образом загружается библиотека со скомпилированными компонентами, то dll-файлы можно лежать в папке /auto относительно пути к модулю Надо помнить, что если просто перенести или скопировать модуль с динамическими компонентами в пользовательскую папку, указываемую в прагме lib, то такая библиотека может и не заработать, даже если перенести динамические компоненты в папку /auto - поэтому если очень нужно именно такое использование модуля, то нужно скомпилировать его именно для заданного пути

Зная вышесказанное, можно запускать Perl-скрипты по windows и под linux В linux благодаря shebang-конструкции с ними можно работать с ними наравне с обычными программами, а в windows можно связать определенное расширение (Например .pl) с интерпретатором Perl и работать с программами также просто
Из теоретической справки выше нам известно, что Apache работает с Perl-программами через CGI, причем работает с ними наравне с обычными скомпилированными исполняемыми программами, поэтому дальнейшая работа сводится в настройке Apache для работы с внешними программами через CGI-интерфейс
В первую очередь необходимо проверить наличие модуля cgi_module для Apache Он сопоставляет файлам с заданным расширением прямой запуск данных программ, такими расширениями обычно являются .cgi, .pl и .exe, при этом данные файлы могут быть как скомпилированными исполняемыми программами, а могут содержать shebang-конструкцию Для совместимости с shebang-конструкциями, в windows необходимо убрать директиву ScriptInterpreterSource registry, чтобы Apache мог работать с данными файлами в точности как в linux
Для запуска CGI-скриптов под linux, необходимо указать верные права доступа, необходимые для того чтобы внешний пользователь (Обычно www-data от Apache) мог выполнять данную CGI-программу Главное чтобы права доступа были равны или больше чем необходимые, в таком случае запуск будет проходить без проблем Однако на некоторых хостингах установка высоких прав приводит в ошибке (Что сделано по соображениям безопасности), однако это не является истинным поведением, а происходит за счет специфического (Переделанного) модуля cgi_module, который проверяет нужные права доступа, похожим образом работают модули, которые запускают CGI-скрипты от имени пользователя, которому они принадлежат, однако все эти схемы не являются общеупотребительными
Далее при запуске любого CGI-скрипта, Apache формирует переменные окружения и передает POST-данные на STDIN в программу, ожидает ее выполнения, считывает информацию с STDOUT и выводит ее При этом формированием HTTP-заголовков занимается CGI-скрипт, и в случае возникновения какой-то ошибки в Perl-скрипте, Apache просто выдает 500 ошибку - Inertal Server Error, не вдаваясь в причины ее появления В любом случае для Apache, любая CGI-программа является закрытой внешней программой, и Apache не знает о причинах ошибки внутри программы, он лишь проверяет заголовки и выводит информацию пользователю

=== To be continued... ===


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
JustUserR Модератор
Отправлено: 24 Декабря, 2009 - 20:17:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 8721
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Господа не забываем оставлять комментарии к статье и свои пожелания Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
valenok
Отправлено: 24 Декабря, 2009 - 21:13:35
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4575
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




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

--
И практику добавить недельной статье. Хотя мне по заголовку сложно догадаться какая тут может быть практика.
--
Да и в самой статье написать заголовок. Потому что название темы форум отображает где-то "там".

(Отредактировано автором: 24 Декабря, 2009 - 21:15:36)



-----
Truly yours, Sasha.
 
My status
 Top
movEAX
Отправлено: 25 Декабря, 2009 - 09:14:38
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 754
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




valenok пишет:
Желаю чтоб статья была поделена на абзацы, с вторичными заголовками и приняла какой-то эстетичный вид,
потому-что читать такой текст, кроме тех кому он действительно случайно попался и оказался нужным - никто не будет.
Здесь таких не оказалось.


Полностью поддерживаю.
Еще заметил ошибку в 7-ой строке, вместо "этапе" написано "эпате".


-----
армия.. самое убогое место
 
 Top
Champion Супермодератор
Отправлено: 25 Декабря, 2009 - 09:19:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 4353
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




JustUserR пишет:
...Perl-скрипт
Perl-скрипты...
Parse error: unexpected TBEGIN_OF_STATEMENT on line 6
 
 Top
JustUserR Модератор
Отправлено: 25 Декабря, 2009 - 12:07:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 8721
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Цитата:
Желаю чтоб статья была поделена на абзацы, с вторичными заголовками и приняла какой-то эстетичный вид, потому-что читать такой текст, кроме тех кому он действительно случайно попался и оказался нужным - никто не будет.
Спасибо, постарался сделать внешний вид получше, потом еще поработаю над ним
Цитата:
И практику добавить недельной статье. Хотя мне по заголовку сложно догадаться какая тут может быть практика
Под практикой имеется в виду конкретный пример, на котором объясняется как по шагам запустить Perl-скрипт, и немного добавлю про отладку
Champion пишет:
Parse error: unexpected TBEGIN_OF_STATEMENT on line 6
Не понял в чем шутка Улыбка
movEAX пишет:
Еще заметил ошибку в 7-ой строке, вместо "этапе" написано "эпате".
Орфографию еще поисправлял


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Champion Супермодератор
Отправлено: 25 Декабря, 2009 - 12:27:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 4353
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




JustUserR пишет:
Не понял в чем шутка
Точки нет в конце предложения. Улыбка Как в прочем и еще много где)
 
 Top
movEAX
Отправлено: 28 Декабря, 2009 - 17:18:26
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 754
Дата рег-ции: Авг. 2009  


Помог: 16 раз(а)




Цитата:

На даммном этапе...
быть объявленыв цепочке...

угадай где ошибки)

(Отредактировано автором: 28 Декабря, 2009 - 17:24:25)



-----
армия.. самое убогое место
 
 Top
Uchkuma
Отправлено: 01 Июля, 2010 - 19:31:25
Post Id



Участник


Покинул форум
Сообщений всего: 1543
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




JustUserR пишет:
вывоз интерпретатора
=)

Кажется у JustUserR точка в русской раскладке не работает.
 
 Top
JustUserR Модератор
Отправлено: 02 Июля, 2010 - 02:27:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 8721
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Uchkuma пишет:
Вывоз интерпретатора =)
Действительно поиск всех таких ошибок затруднителен даже если имеется текстовый редактор с проверкой граммитики - ведь с ее точки зрения данная пара слов является верным словосочетанием со связью типа управление Улыбка Также подправил аналогичую ошибку еще в одном месте
Uchkuma пишет:
Кажется у JustUserR точка в русской раскладке не работает.
Угу Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Уроки и статьи по Perl/Python/.NET »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB