Зонування inurl c board cgi cmd. Програмування за допомогою CGI
E-commerce зрозумілою російською. Як улаштований бізнес в інтернеті?
Останнім часом трапляється дедалі більше проектів, пов'язаних з інтернет-торгівлею. Вивчаючи цей напрямок, не зміг знайти загального та зрозумілого опису процесу. Тому вирішив зробити щось на зразок шпаргалки, до якої завжди можна буде звертатися, щоб зрозуміти порядок дій у такій галузі, як e-commerce.
Відразу зазначу, що зробив акцент на процесах та каналах, які допомагають наводити клієнтів.
E-commerce: що це?
Визначення на різних джерелах говорять про продаж товарів чи послуг через інтернет. Простими словами e-commerce, це будь-яка діяльність у мережі, де з'являються гроші.
Купівля, продаж, страховки, банкінг, електронні гроші, все сюди. Заберіть, розпишіться.
Від мети
Для того, щоб розібратися у питанні, пропоную розпочати шлях із самого кінця. Яка мета у будь-якого бізнесу? Правильно, заробити. Так ось, уявіть будь-який продукт, наприклад, силіконові шкарпетки. Чому б і ні!
Взяв перше, що спало на думку, виявилося їсти таке…
Наше завдання, це заробити на цих шкарпетках. Ми думаємо про інтернет. Хм ... а чому б не "запиляти" сайт і ось як підуть продажі, тільки тримайте мене Мальдіви! Але не все так просто.
Мені дуже подобається малювати. Це допомагає зрозуміти різні процеси. Помалюємо?!
Поки що наша модель виглядає так. Беремо шкарпетки, засовуємо їх в інтернет та отримуємо гроші. Це просто чудово! Очі горять, долоні потіють і вже хочеться взятися за цю справу. Але ж потрібно зробити сайт чи майданчик для продажу?
Сайт або майданчик для продажу
Є різні рішення для розміщення свого товару у всесвітньому павутинні. Можна створити свій сайт або використовувати сторонні майданчики (групи, сторінки в соц.мережах, дошки оголошень та ін.). Зупинимося на сайті.
Замовили собі сайт, взяли готовий шаблон або самі створили за допомогою конструктора (CMS можна погуглити), не важливо. Далі розмістили купу силіконових шкарпеток різних видів та щасливі.
Вибачте, що перериваю читання. Приєднуйтесь до мого телеграм каналу . Свіжі новини статей, розвиток digital продуктів та growth hack, там все. Чекаю вас! Продовжуємо…
Платіжні системи
Але для того, щоб людина змогла у вас купити тут і зараз, необхідно буде підкрутити платіжні системи. Це свого роду сервіс, який дозволяє здійснювати покупки в мережі через: банківські картки, інтернет гроші, мобільні телефони та ще купу всього. За це доведеться ділитися відсотком від транзакцій, але таким чином ви дуже спростите життя.
Вибирайте потрібний собі сервіс. Десь буде вище відсоток, а десь абонентка чи ще. Просто трохи вивчіть питання. Поставте собі необхідний код на сайт, прив'яжете всі транзакції до свого рахунку на карті та вуалю!
Ось здавалося б усе. Сайт є, картки товарів теж і навіть кнопка "купити" працює, але чогось не вистачає... Немає потоку клієнтів, який купуватиме.
Потоки клієнтів
Де: CAC = Вартість залучення нового клієнта. MCC (marketingcampaigncosts) = Сумарна вартість маркетингових витрат, вкладених у залучення клієнтів (але з утримання). W (wages) = Зарплата маркетологам та менеджерам з продажу. S (software) = Вартість програмного забезпечення, що використовується в рекламі та продажах (наприклад, використовуваної платформи продажів, автоматизації маркетингу, A/B-тестування, сервісів аналітики тощо). PS (professionalservices) = Вартість професійних послуг, що надаються відділам маркетингу та продажу (дизайн, консультації тощо). O (other) = Інші накладні витрати, що стосуються відділів маркетингу та продажу. CA (customersacquired) = Сумарна кількість залучених клієнтів.
Але не можна забувати про якість клієнта, тут допоможе LTV.
Важливі показники: LTV
Live Time Value, життєвий цикл клієнта, ще один показник у e-commerce, який потрібно враховувати. Він показує, що в середньому доходу приносить один клієнт. Є різні підходи до розрахунку, я вибрав фактичний за прибутком, як один із найточніших.
Це просто сума загального прибутку за всю історію покупок для кожного окремого клієнта. Додати суму всіх покупок (транзакцій) клієнта до транзакції N, де транзакція N - це остання покупка, яку здійснив клієнт у вашій компанії. Якщо у вас є доступ до всіх даних транзакцій клієнтів, то ви можете легко обчислити це за допомогою Excel.
LTV = (транзакція 1 + транзакція 2 + транзакція 3 ... + транзакція N) x частку прибутку у виручці.
Розрахунок LTV на підставі чистого прибутку, зрештою показує фактичний прибуток, який клієнт приносить вашій компанії. Тут береться до уваги вартість обслуговування клієнтів, вартість утримання, вартість залучення тощо. В результаті виходить цілий комплекс обчислень, що базується на окремо взятих даних. Сукупний прибуток, який отримується від одного клієнта за весь час, дасть вам точне розуміння рентабельності ваших клієнтів на сьогоднішній день.
З іншими підходами можна ознайомитись на .
Важливі показники: співвідношення CAC та LTV
Для розуміння життєздатності бізнесу дуже важливо дивитися на ставлення двох згаданих показників CAC:LTV.
- Менш ніж 1:1 – Ви на всіх парах мчите до банкрутства.
- 1:1 – Ви втрачаєте гроші на кожному залученому клієнті.
- 1:2 – Начебто непогано, але, схоже, що ви вкладаєте недостатньо коштів, а могли б розвиватися швидше. Запустіть більш агресивні кампанії із залучення клієнтів і досягайте показників близьких до 1:3.
- 1:3 - Ідеальне співвідношення. У Вас процвітаючий бізнес та міцна бізнес-модель.
Важливі показники: ROI не забуваємо
Як ми розібрали вище, в e-commerce необхідно чітко розуміти, чи вигідно використовувати канал залучення чи ні. Крім LTV та CAC існує ще один важливий показник, це ROI. Він показує, чи ваші вкладення окупилися, в нашому випадку в рекламу. Тобто. скільки один вкладений карбованець приніс нам у результаті.
Для розрахунку використовується дуже нескладна формула:
Де “Дохід від кампанії”, це різниця між доходом від каналу та собівартістю на ваш продукт. А щоб порахувати прибуток, заберіть ще витрати на рекламу.
Таким чином, більш розгорнута формула виглядатиме так:
ROI = (Дохід по каналу – Собівартість) – Рекламні витрати / Рекламні витрати х 100%
Більш детальний приклад із розрахунком читайте. По суті, ця проста формула міститься все в ту ж табличку Excel, де все вважається автоматично.
Всі три показники, які ми розібрали, є важливими в E-commerce. Кожен із них дозволяє знайти “вузькі” місця у ваших потоках і працювати з ними. Якраз у них криється потенціал зростання для бізнесу. Ще трохи доповнив нашу модель зі шкарпетками.
Вмістити все в один матеріал не вдається, та й хто його так довго читатиме? Пізніше зроблю окремий гайд з нюансів e-commerce, які можуть заважати продажам.
Разом
Загалом тепер у вас є загальне розуміння інтернет-торгівлі або e-commerce. Далі, як кажуть: "Диявол криється в деталях". Вивчайте кожен із каналів окремо, вважайте показники ефективності та шукайте нові інсайти у дрібницях. Інтернет продажів вам, та більше! А з мене є ще один матеріал.
Так, мало не забув, з наступаючим вас, дорогі читачі! Бажаю наступного року вам великих перемог та звершень!
Глава №9.
Програмування за допомогою CGI
Включення розділу про CGI в книгу з баз даних може здатися настільки ж дивним, як би в кулінарну книгу була включена глава про ремонт автомобілів. Зрозуміло, щоб з'їздити в магазин за продуктами, потрібен справний автомобіль, але чи доречно про це говорити? Повний виклад CGI та веб-програмування загалом виходять за рамки цієї книги, але короткого введення в ці теми достатньо для того, щоб розширити можливості MySQL та mSQL за поданням даних у царстві Web.
В основному цей розділ призначений тим, хто вивчає бази даних, але не проти придбати деякі знання і в програмуванні для Web. Якщо ваше прізвище Бернерс-Лі або Андрессен, навряд чи ви знайдете тут те, чого ще не знаєте. Але навіть якщо ви не новачок в CGI, наявність під рукою короткого довідника під час занурення в таємниці MySQL і mSQL може бути дуже корисним.
Що таке CGI?
Як і більшість акронімів, Common Gateway Interface (CGI – загальний шлюзовий інтерфейс) мало що говорить по суті. Інтерфейс із чим? Де цей шлюз? Про яку спільність мова? Щоб відповісти на ці питання, повернемося трохи назад та кинемо погляд на WWW загалом.
Тім Бернерс-Лі, фізик, який працював у CERN, вигадав Web в 1990 році, хоча план виник ще в 1988. Ідея полягала в тому, щоб дати дослідникам в галузі фізики елементарних частинок можливість легко і швидко обмінюватися мультимедійними даними - текстом, зображеннями та звуком - через Інтернет. WWW складалася з трьох основних частин: HTML, URL та HTTP. HTML -мова форматування, що використовується для представлення змісту в Web. URL -це адреса, яка використовується для отримання вмісту у форматі HTML (або будь-якому іншому) з веб-сервера. І наостанок, HTTP -це мова, яка зрозуміла веб-серверу і дозволяє клієнтам вимагати у сервера документи.
Можливість пересилання через Інтернет інформації всіх типів стала революцією, але незабаром було виявлено й іншу можливість. Якщо можна переслати через Web будь-який текст, чому не можна переслати текст, створений програмою, а чи не взятий із готового файла? При цьому відкривається море можливостей. Простий приклад: можна використовувати програму, що виводить поточний час, щоб читач бачив правильний час при кожному перегляді сторінки. Декілька розумних голів у National Center for Supercomputing Applications (Національний центр розробки додатків для суперкомп'ютерів -NCSA), які створювали веб-сервер, таку можливість побачили, і незабаром з'явився CGI.
CGI - це набір правил, за якими програми на сервері можуть через веб-сервер надсилати дані клієнтам. Специфікація CGI супроводжувалася змінами HTML і HTTP, що вводили нову характеристику, відому як форми.
Якщо CGI дозволяє програмам посилати дані клієнту, форми розширюють цю можливість, дозволяючи клієнту посилати дані цієї CGI-программы. Тепер користувач може не тільки бачити поточний час, а й встановлювати годинник! Форми CGI відчинили двері для справжньої інтерактивності у світі Web. Поширені програми CGI включають:
- Динамічний HTML. Цілі сайти можуть генеруватись однією CGI-програмою.
- Пошукові механізми, що знаходять документи із заданими користувачем словами.
- Гостьові книги та дошки оголошень, до яких користувачі можуть додавати повідомлення.
- Бланки замовлень
- Анкети.
- Вилучення інформації з розміщеної на сервері бази даних.
У наступних розділах ми обговоримо всі ці програми CGI, а також деякі інші. Всі вони дають чудову можливість з'єднання CGI з базою даних, що цікавить нас у цьому розділі.
Форми HTML
Перш ніж вивчати особливості CGI, корисно розглянути спосіб, що найбільш часто зустрічається, за допомогою якого кінцеві користувачі отримують інтерфейс до CGI-програм: форми HTML. Форми є частиною мови HTML, що надає кінцевому користувачеві поля різних типів. Дані, що вводяться в поля, можуть бути надіслані веб-серверу. Поля можуть служити для введення тексту або кнопками, які користувач може натиснути або відзначити галочкою. Ось приклад сторінки HTML, що містить форму:
<НТМL><НЕАD><ТITLЕ>Моя сторінка з формами
<р>Це сторінка із формою.
Дана форма створює рядок довжиною 40 символів, куди користувач може ввести ім'я. Під рядком для введення знаходиться кнопка, при натисканні якої дані форми передаються серверу. Нижче перераховані теги, що підтримуються HTML 3.2 - найбільш поширеним в даний час стандартом. Назви тегів і атрибутів можуть вводитися в будь-якому регістрі, але ми дотримуємося необов'язкової угоди, згідно з якою теги, що відкриваються, пишуться у верхньому регістрі, а закриваючі - в нижньому.
Єдиний тип введення, який ми не використовували тут, - це тип IMAGE для тега . Можна було б використовувати його як альтернативний спосіб відправлення форми. Однак тип IMAGE рідко сумісний з текстовими і не дуже чуйними броузерами, тому розумно уникати його, якщо ваш сайт не виконаний в насиченому графічному стилі.
Після знайомства з основами форм HTML можна розпочати вивчення власне CGI.
Специфікація CGI
Отже, що точно є «набір правил», що дозволяє CGI-програмі, скажімо, в Батавії, штат Іллінойс, обмінюватися даними з веб-броузером у Зовнішній Монголії? Офіційну специфікацію CGI поряд з іншими відомостями про CGI можна знайти на сервері NCSA за адресою http://hoohoo . ncsa.uluc.edu/cgi/.Однак цей розділ для того і існує, щоб вам не довелося довго подорожувати і самому його шукати.
Є чотири способи, якими CGI передає дані між CGI-npor-рамою та веб-сервером, а отже, і клієнтом Web:
- Змінні оточення.
- Командна строка.
- Стандартний пристрій введення.
- Стандартний пристрій виведення.
За допомогою цих чотирьох методів сервер пересилає всі дані, передані клієнтом CGI-програмі. Потім CGI-програма робить свою чарівну справу і пересилає вихідні дані назад до сервера, який переправляє їх клієнту.
Ці дані наводяться із прикидкою на сервер HTTP Apache. Apache - найпоширеніший веб-сервер, що працює практично на будь-якій платформі, включаючи Windows 9х та Windows NT. Однак вони можуть бути застосовані до всіх HTTP-серверів, які підтримують CGI. Деякі патентовані сервери, наприклад, Microsoft і Netscape, можуть мати додаткові функції або працювати інакше. Оскільки обличчя Web продовжує змінюватися з неймовірною швидкістю, стандарти все ще розвиваються, і в майбутньому, безперечно, відбудуться зміни. Однак, що стосується CGI, то ця технологія видається усталеною - розплачуватись за це доводиться тим, що інші технології, такі як аплети, її потіснили. Всі CGI-програми, які ви напишете, використовуючи цю інформацію, майже напевно зможуть працювати ще довгі роки на більшості веб-серверів.
Коли CGI-програма викликається за допомогою форми - найбільш поширеного інтерфейсу, броузер передає серверу довгий рядок, на початку якого стоїть шлях до CGI-програми та її ім'я. Потім слідують різні інші дані, які називаються інформацією шляху та передаються CGI-програмі через змінну оточення PATH_INFO (рис. 9-1). Після інформації шляху слідує символ «?», а за ним – дані форми, які надсилаються серверу за допомогою методу HTTP GET. Ці дані стають доступними до CGI-програми через змінну оточення QUERY_STRING . Будь-які дані, які сторінка надсилає за допомогою методу HTTP POST, який використовується найчастіше, будуть передані CGI-програмі через стандартний пристрій введення. Типовий рядок, який може отримати сервер від броузера, показано на рис. 9-1. Програма з ім'ям formreadв каталозі cgi-binвикликається сервером з додатковою інформацією шляху extra/informationі даними запиту choice=help - мабуть, як частина вихідної URL-адреси. Нарешті, дані самої форми (текст CGI programming в полі keywords) пересилаються через метод HTTP POST .
Змінні оточення
Коли сервер виконує CGI-програму, то передусім передає їй деякі дані до роботи у вигляді змінних оточення. У специфікації офіційно визначено сімнадцять змінних, але неофіційно використовується значно більше - за допомогою механізму, що описується нижче, званого HTTP_/nec/zams/n. CGI-програма
має доступ до цих змінних так само, як і до будь-яких змінних середовища командного процесора під час запуску з командного рядка. У сценарії командного процесора, наприклад, змінної оточення F00 можна звертатися як $F00; Perl це звернення виглядає, як $ENV("F00") ; в С - getenv ("F00"); і т. д. У таблиці 9-1 перераховані змінні, які завжди встановлюються сервером - хоча б і значення null. Крім цих змінних дані, що повертаються клієнтом у заголовку запиту, надаються змінним виду HTTP_F00 , де F00 - ім'я заголовка. Наприклад, більшість веб-броузерів включає дані про версію в заголовок з ім'ям USEfl_AGENT . Ваша CGI-npor-рама може отримати ці дані із змінної HTTP_USER_AGENT .
Таблиця 9-1.Змінні оточення CGI
Змінне оточення |
Опис |
||
CONTENT_LENGTH |
Довжина даних, переданих методами POST чи PUT, у байтах. |
||
CONTENT_TYPE |
Тип MIME даних, приєднаних за допомогою методів POST або PUT. |
||
GATEWAY_INTERFACE |
Номер версії специфікації CGI, яку підтримує сервер. |
||
PATH_INFO |
Додаткова інформація про шлях, передана клієнтом. Наприклад, для запиту http://www.myserver.eom/test.cgi/this/is/a/ path?field=greenзначенням змінної РАТН_ INFO буде /this/is/a/path. |
||
PATH_TRANSLATED |
Те ж, що PATH_INFO , але сервер виробляє всю |
||
|
Можливу трансляцію, наприклад, розширення імен типу "-account". » |
||
QUERY_STRING |
Усі дані, що йдуть за символом «?» у URL. Це також дані, що передаються, коли форма REQ-UEST_METHOD є GET. |
||
REMOTE_ADDR |
IP-адреса клієнта, що робить запит. |
||
REMOTE_HOST |
Ім'я вузла машини клієнта, якщо воно є. |
||
REMOTE_IDENT |
Якщо веб-сервер та клієнт підтримують ідентифікацію типу identd,то це ім'я користувача облікового запису, який робить запит. |
||
REQUEST_METHOD |
Метод, який використовується клієнтом для запиту. Для CGI-програм, які ми збираємося створювати, це буде POST або GET. |
||
SERVER_NAME | Ім'я вузла - або IP-адреса, якщо ім'я недоступне, -машини, на якій виконується веб-сервер. | ||
SERVER_PORT | Номер порту, який використовується веб-сервером. | ||
SERVER_PROTOCOL |
Протокол, який використовує клієнт для зв'язку з сервером. У нашому випадку цей протокол майже завжди є HTTP. | ||
SERVER_SOFTWARE | Дані про версію веб-сервера, що виконує програму CGI. | ||
SCRIPT_NAME |
Шлях до сценарію, вказаний клієнтом. Може використовуватися при посиланні URL на себе, і для того, щоб сценарії, посилання на які існують в різних місцях, могли виконуватися по-різному в залежності від місця. |
||
Наведемо приклад сценарію CGI на Perl, який виводить усі змінні оточення, встановлені сервером, і навіть всі успадковані змінні, такі як PATH, встановлені командним процесором, який запустив сервер.
#!/usr/bin/perl -w
print<< HTML;
Content-type: text/html\n\n
HTML
foreach (keys %ENV) ( print "$_: $ENV($_)
\n"; )
print<
HTML
Всі ці змінні можуть бути використані і навіть змінені вашою програмою CGI. Однак ці зміни не зачіпають веб-сервер, який запустив програму.
Командна строка
CGI допускає передачу CGI-програмі аргументів як параметри командного рядка, який рідко використовується. Рідко вона використовується тому, що практичні застосування її нечисленні, і ми не будемо зупинятися на ній докладно. Суть у тому, що якщо змінна оточення QUERY_STRING не містить символу =, то CGI-програма буде виконуватися з параметрами командного рядка, взятими з QUERY_STRING . Наприклад, http://www.myserver.com/cgi- bin/finger?rootзапустить finger root на www.myserver.com.
Існують дві основні бібліотеки, що забезпечують CGI-інтерфейс для Perl. Перша з них - cgi-lib.plУтиліта cgi-lib.plдуже поширена, оскільки протягом тривалого часу була єдиною наявною великою бібліотекою. Вона призначена для роботи в Perl 4, але працює і з Perl 5. CGI.pm,нова і багато в чому перевершує cgi-lib.pl. CGI.pmнаписана для Perl 5 та використовує повністю об'єктно-орієнтовану схему для роботи з даними CGI. Модуль CGI.pmаналізує стандартний пристрій введення та змінну QUERY_STRING та зберігає дані в об'єкті CGI. Ваша програма повинна створити новий об'єкт CGI і використовувати прості методи, такі як paramQ, для вилучення потрібних вам даних. Приклад 9-2 є короткою демонстрацією того, як CGI.pmінтерпретує дані. Всі приклади на Perl у цьому розділі будуть використовувати CGI.PM.
Приклад 9-2.
Синтаксичний аналіз CGI-даних на Perl
#!/usr/bin/perl -w
use CGI qw(:standard);
# Використовується модуль CGI.pm. qw(:standard) імпортує
# простір імен стандартних CGI-функцій, щоб отримати
# Зрозуміліший код. Це можна робити, якщо у сценарії
# використовується лише один об'єкт CGI.
$ mycgi = новий CGI; #Створити об'єкт CGI, який буде "шлюзом" до даних форми
@fields = $ mycgi-> param; # Вийняти імена всіх заповнених полів форми
print header, start_html("CGI.pm test"); ft Методи "header" та "start_html",
# надані
# CGI.pm, спрощують отримання HTML.
# "header" виводить необхідний заголовок HTTP, a
#"start_html" виводить заголовок HTML з даною назвою,
#a також тег
.print "<р>Дані форми:
";
foreach (@fields) ( print $_, ":",- $mycgi->param($_), "
"; }
# Для кожного поля вивести ім'я та значення, що отримується за допомогою
#
$mycgi->param("fieldname").
print end_html; # Скорочення для виведення завершальних тегів "".
Обробка вхідних даних С
Оскільки основні API для MySQL та mSQL написані на С, ми не будемо повністю відмовлятися від С на користь Perl, але там, де це доречно, наведемо кілька прикладів на С. Є три широко використовувані С-бібліотеки для CGI-програмування: cgicТома Бу-телла (Tom Boutell) *; cgihtmlЮджина Кіма (Eugene Kim) t та libcgiвід EIT*. Ми вважаємо, що cgicє найбільш повним і простим у використанні. У ній, проте, немає можливості перерахування всіх змінних форми, коли вони не відомі вам заздалегідь. Насправді її можна додати шляхом простого патчу, але це виходить за рамки даного розділу. Тому в прикладі 9-3 ми використовуємо бібліотеку cgihtml,щоб повторити на наведений вище сценарій Perl.
Приклад 9-3.Синтаксичний аналіз CGI-даних на С
/*
cgihtmltest.c - Типова CGI-програма для виведення ключів та їх значень
з даних, отриманих від форми */
#include
#include "cgi-lib.h" /* Тут містяться всі визначення функцій СGI */
#include "html-lib.h" /* Тут містяться" всі визначення допоміжних функцій для HTML */
void print_all(list 1)
/* Ці функції виводять дані, передані формою, у тому форматі, як і наведений вище сценарій Perl. Cgihtml надає також вбудовану функцію
Print_entries(), яка робить те саме, використовуючи формат списку HTML. */ (
node* window;
/* Тип "node" визначений у бібліотеці cgihtml та посилається на пов'язаний список, у якому зберігаються всі дані форми. */
window = I.head; /* Встановлює покажчик початку даних форми */
while (window != NULL) ( /* Пройти по зв'язаному списку до останнього (першого порожнього) елемента */
printf(" %s:%s
\n",window->entry. name,replace_ltgt(window->entry.value));
/* Вивести дані. Replace__ltgt() - функція, яка розуміє HTML-кодування тексту та забезпечує його правильний висновок на броузер клієнта. */
window = window->next; /* Перейти до наступного списку. */
} }
int main() (
llist entries; /* Покажчик на проаналізовані дані*/
int status; /* Ціле число, що має статус */
Html__header(); /* Допоміжна функція HTML, що виводить заголовок HTML*/
Html_begin("cgihtml test");
/* Допоміжна функція HTML, що виводить початок сторінки HTML із зазначеним заголовком. */
status = read_cgi_input(&entries); /* Здійснює введення та синтаксичний аналіз даних форми*/
Printf("<р>Дані форми:
");
Print_all(entries); /* Викликає певну функцію print_all(). */
html_end(); /* Допоміжна функція HTML, що виводить кінець сторінки HTML. */
List_clear(&entries); /* Звільняє пам'ять, зайняту даними форми. */
return 0; )
Стандартний пристрій виводу
Дані, що надсилаються CGI-програмою на стандартний пристрій виведення, читаються веб-сервером і надсилаються клієнту. Якщо ім'я сценарію починається з nph-,то дані надсилаються безпосередньо клієнту без втручання з боку веб-сервера. У цьому випадку CGI-програма має сформувати правильний заголовок HTTP, який буде зрозумілий клієнту. В іншому випадку надайте веб-серверу сформувати заголовок HTTP за вас.
Навіть якщо ви не використовуєте nph-Сценарій, серверу потрібно дати одну директиву, яка повідомить йому відомості про вашу видачу. Зазвичай це HTTP-заголовок Content-Type, але може бути і заголовок Location. За заголовком повинен слідувати порожній рядок, тобто переклад рядка або комбінація CR/LF.
Заголовок Content-Type повідомляє серверу, який тип даних видає ваша CGI-програма. Якщо це сторінка HTML, то рядок має бути Content-Type: text/html.Заголовок Location повідомляє серверу інший URL - чи інший шлях тому ж сервері, - куди потрібно направити клієнта. Заголовок повинен мати такий вигляд: Location: http:// www. myserver. com/another/place/.
Після заголовків HTTP і порожнього рядка можна надсилати власне дані, що видаються вашою програмою, - сторінку HTML, зображення, текст або щось інше. Серед CGI-програм, що постачаються із сервером Apache, є nph-test-cgiі test-cgi,які добре демонструють різницю між заголовками у стилях nph та не-nph, відповідно.
У цьому розділі ми будемо використовувати бібліотеки CGI.pmі cgic,у яких є функції виведення заголовків як HTTP, і HTML. Це дозволить вам зосередитися на виведенні змісту. Ці допоміжні функції використані прикладах, наведених раніше у цьому розділі.
Важливі особливості сценаріїв CGI
Ви вже знаєте, в основному, як працює CGI. Клієнт надсилає дані, зазвичай за допомогою форми, веб-серверу. Сервер виконує програму CGI, передаючи їй дані. CGI-програма здійснює свою обробку та повертає свої вихідні дані серверу, який передає їх клієнту. Тепер від розуміння того, як працюють CGI-npor-рами, потрібно перейти до розуміння того, чому вони так широко використовуються.
Хоча вам вже достатньо відомо з цього розділу, щоб зібрати просту працюючу CGI-програму, потрібно розібрати ще кілька важливих питань, перш ніж створювати програми, що реально працюють, для MySQL або mSQL. По-перше, потрібно навчитися працювати з кількома формами. Потім потрібно освоїти деякі заходи безпеки, які завадять зловмисникам отримати незаконний доступ до файлів вашого сервера або знищити їх.
Запам'ятовування стану
Запам'ятовування стану є життєво важливим засобом надання хорошого обслуговування вашим користувачам, а не тільки служить для боротьби із запеклими злочинцями, як це може здатися. Проблема викликана тим, що HTTP є так званим протоколом без пам'яті. Це означає, що клієнт надсилає дані серверу, сервер повертає дані клієнту, і далі кожен йде своєю дорогою. Сервер не зберігає клієнта даних, які можуть знадобитися в наступних операціях. Аналогічно, немає впевненості, що клієнт збереже про досконалу операцію будь-які дані, які можна буде використовувати пізніше. Це накладає безпосереднє та суттєве обмеження на використання World Wide Web.
Складання сценаріїв CGI при такому протоколі аналогічно нездатності запам'ятовувати розмову. Щоразу, розмовляючи з будь-ким, незалежно від того, як часто ви спілкувалися з ним раніше, вам доводиться представлятися і шукати спільну тему для розмови. Немає потреби пояснювати, що це не сприяє продуктивності. Малюнок 9-2 показує, що кожного разу, коли запит досягає програми CGI, це абсолютно новий екземпляр програми, що не має зв'язку з попереднім.
У частині клієнта з появою Netscape Navigator з'явилося рішення, що виглядає поспіхом, зробленим під назвою cookies. Воно полягає у створенні нового HTTP-заголовка, який можна пересилати туди-сюди між клієнтом та сервером, схожим на заголовки Content-Type та Location. Броузер клієнта, отримавши заголовок cookie, повинен зберегти в cookie дані, а також ім'я домену, в якому діє цей cookie. Після цього щоразу при відвідуванні URL в межах вказаного домену заголовок cookie повинен повертатися серверу для використання в програмах CGI на цьому сервері.
Метод cookie використовується переважно для зберігання ідентифікатора користувача. Відомості про відвідувача можна зберегти у файлі на машині сервера. Унікальний ID цього користувача можна надіслати як cookie броузеру користувача, після чого при кожному відвідуванні сайту користувач броузер автоматично надсилає серверу цей ID. Сервер передає ID програмі CGI, яка відкриває відповідний файл і отримує доступ до всіх даних користувача. Все це відбувається непомітним для користувача чином.
Незважаючи на всю корисність цього методу, більшість великих сайтів не використовує його як єдиний засіб запам'ятовування стану. Для цього є низка причин. По-перше, не всі броузери підтримують cookie. Донедавна основний броузер для людей з недостатнім зором (не говорячи вже про людей з недостатньою швидкістю підключення до мережі) – Lynx – не підтримував cookie. "Офіційно" він досі їх не підтримує, хоча це роблять деякі його широко доступні "бічні гілки". По-друге, важливіше, cookie прив'язують користувача до певної машини. Однією з великих переваг Web є те, що вона доступна з будь-якої точки світла. Незалежно від того, де була створена або де зберігається веб-сторінка, її можна показати з будь-якої підключеної до Інтернету машини. Однак якщо ви спробуєте отримати доступ до сайту, що підтримує cookie з чужої машини, всі ваші персональні дані, що підтримувалися за допомогою cookie, будуть втрачені.
Багато сайтів, як і раніше, використовують cookie для персоналізації сторінок користувачів, але більшість доповнює їх традиційним інтерфейсом у стилі «ім'я реєстрації/пароль». Якщо доступ до сайту здійснюється з броузера, що не підтримує cookie, сторінка містить форму, в яку користувач вводить ім'я реєстрації та пароль, присвоєні йому при першому відвідуванні сайту. Зазвичай ця форма маленька і скромна, щоб не відлякувати більшість користувачів, які не зацікавлені в жодній персоналізації, а просто охочих пройти далі. Після введення користувачем у форму імені реєстрації та пароля CGI знаходить файл з даними про цього користувача, начебто ім'я надсилалося з cookie. Використовуючи цей метод, користувач може реєструватися на персональному веб-сайті з будь-якої точки світла.
Крім завдань обліку переваг користувача та тривалого зберігання відомостей про нього можна навести тонший приклад запам'ятовування стану, який дають популярні пошукові машини. Здійснюючи пошук за допомогою таких служб, як AltaVista або Yahoo, ви зазвичай отримуєте значно більше результатів, ніж можна відобразити у зручному для читання вигляді. Ця проблема вирішується тим, що показується невелика кількість результатів – зазвичай 10 або 20 – і дається будь-який засіб переміщення для перегляду наступної групи результатів. Хоча звичайному мандрівнику по Web така поведінка здається звичайною і очікуваною, дійсна його реалізація нетривіальна і вимагає запам'ятовування стану.
Коли користувач вперше робить запит пошуковому механізму, той збирає всі результати, можливо, обмежуючись деякою граничною граничною кількістю. Фокус полягає в тому, щоб видавати ці результати одночасно в невеликій кількості, запам'ятавши при цьому, що користувач запитував ці результати і яку порцію він чекає наступної. Залишаючи осторонь складності самого пошукового механізму, ми постаємо перед проблемою послідовного надання користувачеві деякої інформації на одній сторінці. Розглянемо приклад 9-4, в якому показаний сценарій CGI, що виводить десять рядків файлу і надає можливість переглянути наступні або попередні десять рядків.
Приклад 9-4. Збереження стану у сценарії CGI
#!/usr/bin/perl -w
use CGI;
Open(F,"/usr/dict/words") or die("Не можу відкрити! $!");
#Це файл, який виводитиметься, може бути будь-яким.
$output = новий CGI;
sub print_range (# Це головна функція програми my $start = shift;
# Початковий рядок файлу, my $count = 0;
# Вказівник, my $line = "";
# Поточний рядок файлу, print $output->header,
$output->start_html("Мій словник");
#
Створює HTML із заголовком "Мій словник", print "
while (($count< $start) and ($line =
# Пропустити всі рядки перед початковою, while (($count< $start+10) and
($line ?
#
Надрукувати ще 10 рядків.
my $newnext = $start+10; my $newprev = $start-10;
# Встановити початкові рядки для URL "Next" та "Previous",
print "
";
unless ($start == 0) ( # Включити URL "Previous", якщо тільки ви
# вже не на початку.
print qq%Previous%; )
unless (eof) ( # Включити URL "Next", якщо ви #
не в кінці файлу.
print qq% Next%;
}
print «HTML;HTML
exit(0); )
# Якщо даних немає, почати спочатку,
if (not $output->param) (
&print_range(0); )
# Інакше почати з рядка, вказаного у даних.
&print_range($output->param("start"));
У цьому вся прикладі запам'ятовування стану проводиться з допомогою найпростішого методу. Проблеми зі збереженням даних немає, оскільки ми тримаємо їх у файлі на сервері. Нам потрібно лише знати, звідки почати висновок, тому сценарій просто включає в URL початкову точку для наступної чи попередньої групи рядків – все, що необхідно для генерації чергової сторінки.
Однак якщо вам потрібно щось більше, ніж можливість просто перегортати файл, то покладатися на URL буває обтяжливо. Полегшити цю труднощі можна через використання форми HTML і включення даних про стан в теги типу HIDDEN. Цей метод успішно використовується на багатьох сайтах, дозволяючи робити посилання між взаємопов'язаними CGI-програмами або розширюючи можливості використання однієї CGI-програми, як у попередньому прикладі. Замість посилання на певний об'єкт, такий як початкова сторінка, дані URL можуть вказувати на ID користувача, що автоматично генерується.
Так працюють AltaVista та інші пошукові машини. При першому пошуку генерується ID користувача, який приховано включається до наступних URL-адрес. Із цим ID пов'язані один або кілька файлів, що містять результати запиту. В URL включаються ще дві величини: поточне положення у файлі результатів та напрямок, у якому ви хочете переміщатися в ньому далі. Ці три значення – все, що потрібно для роботи потужних систем навігації великих пошукових машин.
Втім, бракує ще дечого. Файл, що використовувався в нашому прикладі /usr/diet/wordsдуже великий. Що, якщо на середині читання ми його покинемо, але захочемо повернутися до нього пізніше? Якщо не запам'ятати URL наступної сторінки, жодного способу повернутися назад немає, навіть AltaVista це не дозволить. Якщо ви перезавантажите свій комп'ютер або почнете працювати з іншим, неможливо повернутися до результатів попереднього пошуку, не вводячи заново запит. Однак таке довготривале запам'ятовування стану є основою персоналізації вебсайтів, про яку ми говорили вище, і варто подивитися, як ним можна скористатися. Приклад 9-5 є модифікованим варіантом прикладу 9-4.
Приклад 9-5.
Стійке запам'ятовування стану
#!/usr/bin/perl -w
use CGI;
umask 0;
Open(F,"/usr/dict/words") or die("Не можу відкрити! $!");
Chdir("users") or die("He можу перейти в каталог $!");
#
Це каталог, де зберігатимуться всі дані
# про користувача.
Soutput = новий CGI;
if (not$output->param) (
print $output->header,
$output->start_html("Мій словник");
print «HTML;