Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Red Hat Linux и другие RPM-based дистрибутивы (ASP, Mandrake.)




Telnet www.php5.ru 80

GET /php/php5ru.png HTTP/1.0 \r\n
Host: www.php5.ru \r\n\r\n

По экрану пробежит то, что вы увидите, если просмотрите этот png-файл в текстовом редакторе.

I-2. HTML-формы. Методы отправки данных на сервер

С HTML-формами вы наверняка уже встречались:

  1. <form method="GET" action="/cgi-bin/form_handler.cgi">
  2. Введите Ваше имя: <input type="text" name="name">
  3. <br>
  4. <input type="submit" name="okbutton" value="OK">
  5. </form>

Сохранив данный код в HTML-файле и просмотрев его с помощью вашего любимого браузера, вы увидите привычную HTML-форму:

Введите Ваше имя:

Рассмотрим используемые в этом небольшом примере тэги подробнее.

Тэг <form>, имеющий парный завершающий тэг </form>, собственно и задает форму. Его атрибуты - оба необязательные:

  • action - указывает URL (полный или относительный), на который будет отправлена форма. Отправка формы - это такой же запрос к серверу, как и все остальные (как я уже описал выше).

Если этот атрибут не указать, большинство браузеров (точнее говоря, все известные мне браузеры) отправляют форму на текущий документ, то есть "саму на себя". Это удобное сокращение, но по стандарту HTML атрибут action обязателен.

  • method - способ отправки формы. Их два.
    • GET - отправка данных формы в адресной строке.
      Вы могли заметить на различных сайтах присутствие в конце URL символа "?" и следующих за ним данных в формате параметр=значение. Здесь "параметр" соответствует значению атрибута name элементов формы (см. ниже про тэг <input>), а "значение" - содержимому атрибута value (в нем, например, содержится ввод пользователя в текстовое поле того же тэга <input>).
      Для примера - попробуйте поискать что-нибудь в Яндексе и обратите внимание на адресную строку браузера. Это и есть способ GET.
    • POST - данные формы отправляются в теле запроса. Если не совсем понятно (или совсем непонятно), что это такое - не беспокойтесь, скоро мы к этому вопросу вернемся.

Если атрибут method не указан - подразумевается "GET".

Тэг <input> - задает элемент формы, определяемый атрибутом type:

  • Значение "text" задает однострочное текстовое поле ввода
  • Значение "submit" задает кнопку, при нажатии которой происходит отправка формы на сервер

Возможны и другие значения (да и <input> - не единственный тэг, задающий элемент формы), но их мы рассмотрим в следующих главах.

Итак, что же происходит, когда мы нажимаем кнопку "OK"?

  1. Браузер просматривает входящие в форму элементы и формирует из их атрибутов name и value данные формы. Допустим, введено имя Vasya. В этом случае данные формы - name=Vasya&okbutton=OK
  2. Браузер устанавливает соединение с сервером, отправляет на сервер запрос документа, указанного в атрибуте action тэга <form>, используя метод отправки данных, указанный в атрибуте method (в данном случае - GET), передавая в запросе данные формы.
  3. Сервер анализирует полученный запрос, формирует ответ, отправляет его браузеру и закрывает соединение
  4. Браузер отображает полученный от сервера документ

Отправка того же запроса вручную (с помошью telnet) выглядит следующим образом (предположим, что доменное имя сайта - www.example.com):

telnet www.example.com 80

GET /cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK HTTP/1.0 \r\n
Host: www.example.com \r\n
\r\n

Как вы, скорее всего, уже догадались, нажатие submit-кнопки в форме с методом отправки "GET" аналогично вводу соответствующего URL (со знаком вопроса и данными формы в конце) в адресной строке браузера: http://www.example.com/cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK

На самом деле, метод GET используется всегда, когда вы запрашиваете с сервера какой-либо документ, просто введя его URL, или щелкнув по ссылке. При использовании <form method="GET"... >, к URL просто добавляются знак вопроса и данные формы.

Возможно, все эти технические подробности и упражнения с telnet-ом кажутся вам невероятно скучными и даже ненужными ("а при чем тут PHP?"). А зря.:) Это основы работы по протоколу HTTP, которые необходимо знать назубок каждому Web-программисту, и это не теоретические знания - все это пригодится на практике.

Теперь заменим первую строку нашей формы на следующую:

  1. <form method="POST" action="/cgi-bin/form_handler.cgi">

Мы указали метод отправки "POST". В этом случае данные отправляются на сервер несколько другим способом:

telnet www.example.com 80

POST /cgi-bin/form_handler.cgi HTTP/1.0 \r\n
Host: www.example.com \r\n
Content-Type: application/x-www-form-urlencoded \r\n
Content-Length: 22 \r\n
\r\n
name=Vasya&okbutton=OK

При использовании метода POST данные формы отправляются уже после "двух Enter-ов" - в теле запроса. Все, что выше - на самом деле заголовок запроса (и когда мы использовали метод GET, данные формы отправлялись в заголовке). Для того, чтобы сервер знал, на каком байте закончить чтение тела запроса, в заголовке присутствует строка Content-Length; о том же, что данные формы будут переданы виде параметр1=значение1&параметр2=значение2..., причем значения передаются в виде urlencode - то есть, точно так же, как и с помощью метода GET, но в теле запроса, - серверу сообщает заголовок "Content-Type: application/x-www-form-urlencoded".

О том, что такое urlencode - чуть ниже.

Преимущество метода POST - отсутствие ограничения на длину строки с данными формы.

При использовании метода POST невозможно отправить форму, просто "зайдя по ссылке", как было с GET.

Для краткости изложения, введем термины "GET-форма" и "POST-форма", где префикс соответствует значению атрибута method тэга <form>.

При использовании POST-формы, в ее атрибуте action можно указать после знака вопроса и параметры GET-формы. Таким образом, метод POST включает в себя и метод GET.

I-3. Технология CGI

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

Сам по себе веб-сервер умеет просто отдавать запрошенную страницу, и ничего более того, и ему все переданные данные формы, в общем-то, совершенно безразличны. Для того, чтобы можно было обработать эти данные с помощью какой-либо программы и динамически сформировать ответ броузеру, и была изобретена технология CGI (Common Gateway Interface).

Взглянем на этот URL: http://www.example.com/cgi-bin/form_handler.cgi. Первое предположение, которое можно сделать на его счет, обычно такое: сервер отдает содержимое файла form_handler.cgi из каталога cgi-bin. Однако, в случае с технологией CGI дело обстоит по-другому. Сервер запускает программу form_handler.cgi и передает ей данные формы. Программа же формирует текст, который передается браузеру в качестве ответа на запрос.

Программу form_handler.cgi можно написать на любом языке программирования, главное - соблюдать в программе стандарт CGI. Можно использовать, например, популярный скриптовый язык Perl. А можно написать все и на Си. Или на shell-скриптах... Но мы, для примера, напишем эту программу на Си. Но сначала разберемся, как происходит обмен данными между веб-сервером и CGI-программой.

  • Перед запуском CGI-программы, сервер устанавливает переменные окружения (вам они наверняка знакомы по команде PATH). В каждый мало-мальски серьезном языке программирования есть средства для чтения переменных окружения. Стандарт CGI определяет весьма значительный набор переменных, которые должны быть определены перед запуском CGI-программы. Рассмотрим сейчас только три из них:
    • REQUEST_METHOD - метод передачи данных - GET или POST (есть и другие, но пока мы их не рассматриваем)
    • QUERY_STRING - содержит часть URL после вопросительного знака, или, другими словами, данные GET-формы.
    • CONTENT_LENGTH - длина тела запроса (данные POST-формы).
  • Сервер запускает CGI-программу. Тело запроса передается программе в виде стандартного ввода (stdin) - будто бы эти данные были введены с клавиатуры.
  • Программа выдает ответ броузера на стандартный вывод (stdout) - "на экран". Этот вывод перехватывается веб-сервером и передается браузеру.
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(void)
  4. {
  5. // Читаем переменные среды, установленные веб-сервером
  6. char *query_string = getenv("QUERY_STRING");
  7. char *request_method = getenv("REQUEST_METHOD");
  8. char *post_data; // Буфер для данных POST-запроса
  9. int post_length = 0; // Длина тела запроса
  10. if (strcmp(request_method, "POST") == 0) { // Если получен POST-запрос,
  11. post_length = atoi(getenv("CONTENT_LENGTH")); // сначала читаем из
  12. // переменной среды его длину,
  13. if (post_length) { // если она не нулевая,
  14. post_data = (char*)malloc(post_length+1); // выделяем память для буфера,
  15. fread(post_data, post_length, 1, stdin); // читаем со стандартного ввода тело запроса,
  16. post_data[post_length] = 0; // завершаем строку нулевым байтом.
  17. }
  18. }
  19. // Выводим заголовок ответа...
  20. printf("Content-type: text/html\r\n\r\n");
  21. // и его тело:
  22. printf("<h1>Здравствуйте!</h1>\r\n");
  23. if (strlen(query_string)) {
  24. printf("<p>Параметры GET-формы: %s\r\n", query_string);
  25. }
  26. if (post_length) {
  27. printf("<p>Параметры POST-формы: %s (длина тела запроса: %d)\r\n", post_data, post_length);
  28. free(post_data); // не забываем освободить выделенную в строке 17 память
  29. }
  30. return 0;
  31. }

Это простейшая CGI-программа на Си, выводящая содержимое полученных от веб-сервера параметров форм. Браузер в результате получит примерно следующий код (если "засабмитить" на эту программу POST-форму из последнего примера):

<h1>Здравствуйте!</h1>
<p>Параметры POST-формы: name=Vasya&okbutton=OK (длина тела запроса: 22)

Что при этом отобразится на экране пользователя, думаю, понятно без комментариев.:)

Как видите, даже простейшая программа вывода параметров не так-то проста. Более того, по стандарту HTTP почти все не алфавитно-цифровые символы (в т.ч. и русские буквы) передаются в так называемом UrlEncoded-виде (%XX, где XX - шестнадцатеричный код символа), и, если добавить в приведенную Си-программу код расшифровки UrlEncode, она уже не поместится на экран. А это - всего лишь базовые операции. А как вырастет программа на Си, если необходимо работать с базой данных?

Впрочем, написание CGI-программ на Си - довольно редкое извращение.:) Чаще всего это делают на Perl - языке, разработанном специально для обработки текстовых данных, а наличие модуля CGI делает написание CGI-скриптов намного более простой задачей. Здесь я не буду вас знакомить с Perl, отмечу лишь, что проблем остается достаточно: все же Perl не предназначен для Web, это язык универсальный. Да и сама технология CGI несовершенна: при каждом обращении происходит запуск программы (в случае с Perl - интерпретатор языка), а эта операция довольно ресурсоемкая: для домашней странички Васи Пупкина производительности, конечно, достаточно, но серьезный портал с десятками и сотнями тысяч хитов в сутки потребует уже огромных аппаратных мощностей.

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

В принципе, PHP можно скомпилировать и как CGI-приложение, и использовать так же, как и Perl - но это для нестандартных веб-серверов или особых извращенцев.:)

II. PHP: Препроцессор Гипертекста

В 1994-м году, один программист, по имени Rasmus Lerdorf, намучавшись с классическим перловым модулем CGI, решил написать несколько собственных Perl-скриптов, дабы было попроще создавать собственную домашнюю страницу, и назвал все это дело Personal Home Page (PHP). Через некоторое время ему понадобилось обрабатывать формы, ну и для увеличения производительности все было переписано на C - так появился Personal Home Page/Forms Interpreter (PHP/FI) 2.0. Труды свои Расмус, следуя принципам Open Source, выложил на всеобщее обозрение, и, в принципе, на некоторм количестве сайтов PHP/FI вполне успешно использовался, хотя был довольно примитивен.

В 1997-м на PHP/FI - в поисках инструмента для удобного Веб-скриптинга - наткнулись два других программера - Andi Gutmans и Zeev Suraski. Сама идея им понравилась, но функциональность и скорость работы PHP/FI оставляли желать лучшего, и Andi и Zeev решились переписать PHP с нуля. Язык получился универсальный и мощный, и вскоре привлек внимание множества веб-разработчиков: к концу 1998 года PHP3 использовался на ~10% веб-серверов. Скромное название "Personal Home Page" уже не очень-то соответствовало реальности, и название было изменено на - в лучших Unix-традициях - рекурсивное: P HP: H ypertext P reprocessor.

"Движок" PHP 4, названный Zend Engine, разрабатывался усилиями уже сформировавшегося и с тех пор непрерывно расрастающегося PHP community, и в 2000-м году вышла 4-я версия PHP, ставшая менее чем через полгода стандартом для Веб-разработки под Unix (и не только): каждый уважающий себя хостер предоставлял поддержку PHP. Сейчас подходит к концу разработка PHP5, основанного на новом Zend Engine 2...

Впрочем, хватит лирики. Давайте посмотрим на простой PHP-скрипт. Сначала немного изменим HTML-форму из предыдущего раздела:

  1. <form method="POST" action="form_handler.php">
  2. Введите Ваше имя: <input type="text" name="name">
  3. <br>
  4. <input type="submit" name="okbutton" value="OK">
  5. </form>

А теперь - form_handler.php:

  1. <html>
  2. <body>
  3. <?
  4. echo "<h1>Привет, <b>". $_POST['name']. "</b></h1>!";
  5. ?>
  6. </body>
  7. </html>

В отличие от Си или Perl, php-скрипт представляет собой обычную, в общем-то, HTML-страницу: "просто так" написанные тэги передаются "как есть", будто бы это обычный html-ник. Сам скрипт заключается в специальные тэги <? и ?>, внутри которых мы используем для вывода текста оператор echo. Таких блоков может быть сколько угодно, все, что между ними, интерпретируется как обычный html.

Переменные GET-запроса попадают в массив $_GET, переменные POST-запроса - в массив $_POST, серверные переменные (типа IP-адреса, имени скрипта и т.д.) - в $_SERVER, оператор "точка" (.) - объединение строк... Причем все служебные операции (чтение stdin и переменных среды, Url-декодирование) уже произвел сам PHP. Удобно, не так ли?

Далее. Зачем нам два файла - HTML с формой и PHP-скрипт? Вполне достаточно одного скрипта:

  1. <html>
  2. <body>
  3. <?
  4. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  5. echo "<h1>Привет, <b>". $_POST['name']. "</b></h1>!";
  6. }
  7. ?>
  8. <form method="POST">
  9. Введите Ваше имя: <input type="text" name="name">
  10. <br>
  11. <input type="submit" name="okbutton" value="OK">
  12. </form>
  13. </body>
  14. </html>

Мы убрали из тэга form атрибут action - это значит, что форма отправляется "сама на себя", т.е. на текущий URL. Это иногда называют "postback form". В строке 4 с помощью оператора if проверяется, использовался ли для загрузки документа метод POST (аналог строки 13 примера на Си), и - если это так - в следующей строке выводится приветствие.

На этой простой программе - своего рода Web-варианте "Hello World" - мы и завершим вводную главу.

Самоучитель PHP: Глава 2. Установка и настройка Apache+PHP

Содержание главы

Версия для печати

I. Установка Apache

1. - в ОС Windows

2. - в ОС семейства Unix

II. Установка PHP

1. - в ОС Windows

2. - в ОС семейства Unix

III. Настройка Apache+PHP

IV. Установка PHP5

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

Если вы решили использовать Apache 2, настоятельно рекомендуется собирать его с prefork MPM - см. документацию.
Также (это касается пользователей Windows) не стоит соблазняться удобством установки готовых комплектов, типа "Денвер-2": все, конечно, "заработает само", но при необходимости изменить файлы конфигурации - а это вам обязательно понадобится - отсутствие опыта самостоятельной установки вам совсем не поможет. Как вариант - можете установить Apache+PHP вручную, разобраться, как все настраивать, ну а потом деинсталлировать плоды своих трудов и установить тот же "Денвер", если он вам так нравится.:)

Мы рассмотрим установку Apache+PHP в ОС Windows (рассматривая только "настоящие" ОС - NT/2000/XP/2003) и Unix (в частности, Linux и FreeBSD).

Apache+PHP... "А как же MySQL?" - спросит продвинутый пользователь... А MySQL мы установим попозже - пока он нам не нужен.

I. Установка Apache

I-1. Установка Apache в ОС семейства Windows

1. Скачайте Windows-дистрибутив - Apache 1.3.xx Win32 Binary (Self extracting) - с ближайшего к вам зеркала:
httpd.apache.org

2. Убедитесь, что логин, под которым вы работаете, входит в группу Administrators

3. Убедитесь, что 80-й TCP-порт не занят каким-либо другим сервисом или приложением, например, Microsoft IIS. Если 80-й порт занят, измените порт в настройках IIS-a (или другого сервиса) на другой, или же отключите или деинсталлируйте данное приложение.

При желании, вы можете самостоятельно установить PHP под Microsoft IIS (следуя инструкции в install.txt), запустить простой скрипт, посмотреть, как это все тормозит, после чего снести IIS и установить Apache.:)

4. Запустите скачанный файл... Ну под винду-то вы софт ставить, надеюсь, умеете?:) Когда спросит, запускать ли Apache сервисом (для всех пользователей) - выбирайте "сервисом" (это настройка по умолчанию).

I-2. Установка Apache в ОС семейства Unix

Классически, в Unix программное обеспечение устанавливается путем сборки из исходников:

· Скачиваем и распаковываем дистрибутив с httpd.apache.org с помощью броузера типа lynx/links или команды fetch/wget, например:

$ fetch http://apache.rin.ru/dist/httpd/apache_1.3.31.tar.gz
$ tar xzf apache_1.3.31.tar.gz

· Конфигурируем Apache:

$ cd apache_1.3.31
$ ./configure

Для тонкой настройки Apache, следует изучить файл INSTALL и указать необходимые параметры в строке./configure. Впрочем, как правило, настройки по умолчанию вполне подходят.

· Компилируем Apache:

$ make

· Устанавливаем Apache:

$ su - заходим под суперпользователем (root), если все предыдущие операции производили из-под своего обычного логина)
# make install

На этапе configure, вероятно, вы увидите ошибки, связанные с отсутствием в системе необходимых библиотек. Их необходимо скачать и установить в соответствии с инструкциями, находящимися в файлах INSTALL дистрибутивов (обычно - это та же последовательность./configure && make && make install). Это дело довольно долгое и занудное, посему уже давно большинство Unix-систем включают в себя то или иное более удобное средство установки программного обеспечения.

FreeBSD

FreeBSD включает специальное средство для установки программного обеспечения - порты (ports), представляющие собой набор скриптов, автоматически скачивающих, настраивающих, компилирующих и устанавливающих программные продукты, включая необходимые для запуска библиотеки (dependences - зависимости). Я здесь не буду расписывать подробно, как в FreeBSD работать с портами - это описано в FreeBSD Handbook и множестве книг. Предположим, что в вашей системе библиотека портов установлена и обновлена.

· Переходим в каталог порта Apache:
$ cd /usr/ports/www/apache13

· Запускаем из-под root'а команду сборки и установки Apache (дистрибутив скачается автоматически):
$ su
# make install

· Если нужно автоматически запускать Apache при загрузке - прописываем в /etc/rc.conf:
apache_enable="YES"

Собственно, вот и всё.;)

При необходимости тонкой настройки изучите Makefile и добавьте необходимые параметры после команды make install (например, make install WITH_APACHE_SUEXEC=yes - для поддержки suexec).

Red Hat Linux и другие RPM-based дистрибутивы (ASP, Mandrake...)

Red Hat Linux включает менеджер пакетов RPM. Подход к установке из RPM принципиально другой -.rpm-пакеты содержат уже скомпилированные бинарники. Это дает выигрыш во времени (компилировать ничего не нужно), однако, лишает возможности собрать программу так, как вы хотите.

Для установки Apache из rpm необходимо загрузить.rpm-файл Apache 1.3 (откуда - ищите сами гуглем: Apache Software Foundation (apache.org) не распространяет RPM-ки) и запустите: rpm -Uvh apache*

Gentoo Linux

Gentoo Linux - являющийся по сути своей "BSD-style Linux" - содержит portages - систему портов, похожую на используемую в FreeBSD. Установка производится с помощью команды emerge, например:

$ cd /usr/portage/net-www/apache
$ su
# emerge apache-1.3.31.ebuild

Не запускайте просто emerge apache - это приведет к установке Apache 2.

Для автоматического запуска Apache при загрузке, введите

# rc-update add apache default

Другие дистрибутивы Linux

Другие дистрибутивы Linux (Debian, Slackware,...) содержат собственные менеджеры пакетов - обратитесь к документации. В любом случае (даже в случае другой Unix OS) вы можете скомпилировать и установить Apache вручную - как описано выше.

II. Установка PHP

II-1. Установка PHP в ОС семейства Windows

Скачайте со страницы www.php.net/downloads.php ZIP-архив Windows Binaries (PHP 4.x.x Zip package).

Не качайте "PHP 4.x.x installer" - там отсутствуют многие необходимые файлы!

Распакуйте архив в C:\PHP (или в любое другое место - но в дальнейшем будет предполагаться, что вы выбрали именно C:\PHP). Скопируйте файл php4ts.dll в каталог C:\WINDOWS\SYSTEM32 (или соответствующий). Скопируйте файл php.ini-dist в каталог C:\WINDOWS и переименуйте его в php.ini.

II-2. Установка PHP в ОС семейства Unix

Процесс установки PHP аналогичен установке Apache, за исключением того, что при сборке PHP вам понадобится указать гораздо больше конфигурационных опций.

При ручной сборке из исходников - для этого необходимо скачать и распаковать исходный код с www.php.net/downloads.php - сначала запустите ./configure --help и изучите список параметров сборки (весьма внушительный).

В любом случае, понадобится параметр --with-apxs=/путь/к/apxs - это необходимо для сборки модуля Апача mod_php. Например, если Apache установлен в /usr/local, то параметр будет выглядеть следующим образом: --with-apxs=/usr/local/sbin/apxs.

После конфигурирования, запустите make, и make install.

Чем больше вы используете опций, подключающих различные расширения, тем больше понадобится вручную скачивать и устанавливать необходимые библиотеки. Лучше, конечно, воспользоваться менеджером пакетов или портов вашей ОС.

Независимо от выбранного способа, после успешной установки, скопируйте php.ini-dist в php.ini:
cd /usr/local/etc
cp php.ini-dist php.ini

(в зависимости от ОС, вместо /usr/local/etc может использоваться каталог /etc и т.д.).

FreeBSD

PHP удобно устанавливать из портов FreeBSD.

Воспользовавшись командой su для получения прав суперпользователя, перейдем в каталог /usr/ports/lang/php4.

Есть два варианта сборки PHP из портов - интерактивный и с помощью параметров команды make.

В первом случае, просто запустим команду make install. После того, как make скачает и распакует дистрибутив php, на экране появится окно со списком возможных опций конфигурирования - просто поставьте "крестики" против нужных.

У интерактивного способа, при всем его удобстве, есть недостаток - выбранные однажды параметры нельзя сохранить для использования той же конфигурации повторно. Можно указать все нужные параметры в командной строке, например make install WITH_MYSQL=YES WITH_GD=YES. Список возможных опций находится в файле /usr/ports/lang/php4/scripts/php4_options (этим файлом, кстати, и пользуется скрипт, выводящий окно в интерактивном режиме).

Update: недавно (видимо, с большого похмела) мейнтенер порта PHP решил все переделать. И не только решил (увы). Теперь сборка PHP со статической линковкой расширений (т.е. компиляция PHP и выбранных расширений в один so-файл) из портов невозможна. Либо ручками, либо - если динамические (shared) расширения устраивают - cd /usr/ports/lang/php4, make install, cd /usr/ports/lang/php4_extensions, make install. Для php5 - аналогично. Соответствующие строки extension=.. в php.ini пропишутся автоматически. Впрочем, при использовании PHP как Apache-модуля, динамические расширения ничуть не медленнее статических, так что не стоит особо расстраиваться по этому поводу.:)

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...