Schetchiksg.ru

Счетчик СГ
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Php счетчик текстовый файл

Сессии в PHP

Сессии в PHP представляют из себя механизм сохранения на стороне сервера информации о компьютере клиента. На самом деле сессии в PHP — это не такая сложная тема, но для её понимания нужно знать принцип работы cookie в PHP. Так что, если вы не знаете как работают cookie в PHP, то сначала читайте соответствующую статью, а потом уже возвращайтесь сюда.

Слово session с английского переводится как сеанс, так сам смысл сессий в PHP становится более понятным, но у программистов прижился термин «сессии», его и мы будем использовать в этой статье.

Сессии в PHP очень похожи на механизм cookie, те же самые пары ключ => значение, только они хранятся на стороне сервера.

Функция session_start()

Сеанс нам нужно начать, для этого существует функция session_start() . Эта функция стартует сеанс, или сессию, как угодно можно назвать это.

Функция session_start() желательно вызывать в самом начале страницы, но в моих примерах я этого не делаю.

Массив $_SESSION

Сессии — это группы переменных, которые хранятся на сервере, но относятся к одному уникальному посетителю. Повторю, это ключевой момент: сессии хранятся на сервере.

Для того, чтобы обеспечить взаимодействие каждого посетителя с его данными из его сессии используется файл cookie, команду создать который PHP даёт сам, вам об это беспокоится не нужно. Этот cookie имеет значение только для сервера и не может быть использован для получения данных о пользователе.

На сервере данные сессии хранятся в текстовом файле и они доступны в программе PHP в массиве $_SESSION . Чтобы сохранить переменную в сессии нужно присвоить ей значение в этом массиве.

Давайте наконец начнём использовать примеры. Всё очень просто.

Теперь попробуем получить значение из массива $_SESSION в другом примере.

Обратите внимание, если во втором примере мы удалим функцию session_start() то у нас не будет доступа к данным массива $_SESSION .

Функция session_id()

После того, как сессия создана, вы автоматически получаете доступ к уникальному идентификатору сессии при помощи функции session_id() . Эта функция позволяет как задавать, так и получать значение идентификатора сессии.

Можете посмотреть в панели инструментов для разработчиков вашего браузера (в Chrome для этого нажмите Ctrl + Shift + I, потом Resources, и там найдёте cookie), этот домен положил вашему браузеру cookie с именем PHPSESSID и примерно таким значением: «7g5df9rkd1hhvr33lq1k6c72p7».

Именно по значению PHPSESSID сервер будет определять ваш браузер и работать с соответствующим набором переменных, которые будут доступны скрипту через массив $_SESSION, как уже писалось ранее.

Функция session_name()

Если функции session_id() позволяет получать значение идентификатора сессии, функция session_name() позволяет узнать имя сессии.

Ещё раз про функцию session_start()

Теперь мы знаем больше про механизм работы сессий в PHP и нужно ещё раз вернуться к функции session_start() . Эта функция инициализирует механизм сессий для текущего пользователя. Как именно это происходит:

  • Если пользователь запустил сайт впервые, то session_start() устанавливает cookie у клиента и создаёт временное хранилище на сервере, связанное с идентификатором пользователя.
  • Определяет хранилище, связанное с переданным текущим идентификатором.
  • Если в хранилище на сервере есть данные, они помещаются в массив $_SESSION.
  • Если register_globals из файла php.ini равен On, то все элементы массива $_SESSION превращаются в глобальные переменные.

Пример использования сессии

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

Вся работа сессий основана на массиве $_SESSION , это хорошо видно в данном примере.

Если закрыть окно браузера, то сессия прекратится, наш счётчик обнулится. Такое поведение сессий в PHP можно изменить, к этому вопросу мы вернёмся чуть дальше в статье.

Завершение сессии

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

Для того, чтобы завершить сессию нам нужно:

  1. Очистить массив $_SESSION.
  2. Удалить временное хранилище на сервере.
  3. Удалить сессионный cookie.

Очистить массив $_SESSION можно при помощи функции session_unset() .

Функция session_destroy() удаляет временное хранилище на сервере. Кстати, она больше ничего не делает.

Удалить сессионный cookie нужно при помощи функции setcookie() , которую мы изучили в уроке pабота с cookie в PHP.

Пример завершения сессии:

Теперь можете провести эксперимент: запустить в одном окне пример со счётчиком, накрутить счётчик, а потом запусть пример с удалением сессии и снова обновить страницу со счётчиком.

Удаление файла cookies можно сделать так:

setcookie(session_name(), », time() — 60*60*24*32, ‘/’)

Ещё раз про функции session_name() и session_id()

Функции session_name() и session_id() на практике используются редко, но я о них пишу, так как в статье нужно раскрыть сам механизм работы сессий в PHP.

При помощи этих функций можно задавать собственные имена и идентификаторы сессий, но делать это не рекомендуется. Если вы захотели задать их, то пропишите эти функции с аргументами перед функцией session_start() , как в примере ниже:

При использовании данного примера всем пользователям будет назначен один и тот же идентификатор сессии.

Тут подробней остановимся, если вы запустите пример из секции про функцию session_name() (вот ссылка) в разных браузерах (например в Chrome и в Internet Explorer), то в каждом браузере будет свой, уникальный идентификатор сессии. Браузеры хранят файлы cookies каждый в своей папке, поэтому функция session_start() даст каждому браузеру создать свой, уникальный идентификатор и, соответственно, для каждого браузера будет создано уникальное хранилище на сервере. Поэтому пример со счётчиком (этот) в каждом браузере будет работать независимо друг от друга.

Если задать одинаковый идентификатор сессии для всех пользователей, то они будут работать с одним хранилищем на сервере. Вот пример счётчика, который будет считать посещения с разных браузеров:

Если вы запустите этот пример, то не факт что вы увидите там единицу. Другие посетители могли уже изменить значения в хранилище сессий на сервере. Когда в этом случае сервер удаляет хранилище — я не знаю, поэтому при превышении счётчиком значения 100 буду завершать сессию.

Читайте так же:
Метрика метки для счетчиков

Установка времени ожидания

По умолчанию, сессия «живёт» до тех пор, пока посетитель не закроет окно браузера. Это обусловлено тем, что функция session_start() ложит клиенту такой cookie.

Время жизни сессии можно изменить используя функцию session_set_cookie_params() , вот её синтаксис.

session_set_cookie_params (int lifetime [, string path [, string domain [, bool secure]]])

На практике достаточно использовать только первый параметр (lifetime), сюда записываете время в секундах, определяющее сколько сервер должен помнить состояние сессии после закрытия браузера.

Действие функции session_set_cookie_params() распространяется только на период работы скрипта.

Вот пример использования этой функции:

Накрутите счётчик и закройте браузер, через 30 сукунд опять откройте этот пример. Ваша сессия сохранится.

Опубликовано Вадим В. Костерин

ст. преп. кафедры ЦЭиИТ. Автор более 130 научных и учебно-методических работ. Лауреат ВДНХ (серебряная медаль). Посмотреть больше записей

Php счетчик посещений страницы. Счётчик посещений страниц

Простой текстовый счетчик на PHP

Начнем с создания самого простого текстового счетчика, который будет обсчитывать только одну страничку – ту, на которой он будет размещен. Но перед тем как переходить непосредственно к программированию, давайте остановимся на его алгоритме. В данном случае он очень простой, но, сформулировав его словами, нам будет проще понять, как работает код. Итак, алгоритм работы счетчика будет следующий:

  1. Прочитать текущее содержимое счетчика;
  2. Увеличить текущее содержимое счетчика на единицу;
  3. Сохранить обновленное содержимое счетчика;
  4. Вывести на печать обновленное значение счетчика.

Теперь важный вопрос — где мы будем хранить значение счетчика? Т.к. страничка запрашивается разными людьми и с разных компьютеров, то хранить его мы можем только на сервере. В качестве хранилища может выступать либо файл, либо база данных. Работу с базой данных мы сейчас разбирать не будем, а остановимся на обычном текстовом файле, как наиболее подходящем варианте во многих случаях.

Я сразу приведу PHP-код, реализующий самый простой из всех возможных типов счетчика, а затем уже дам ряд комментариев.

Как видите, скрипт достаточно прозрачный и практически полностью следует сформулированному ранее алгоритму. При этом, для удобства дальнейшей поддержки кода, я в первой же строке определил переменную $file_counter , которую уже и использую. Постарайтесь, по возможности, всегда определять переменные для всех более-менее важных исходных данных и не используйте их напрямую.

Перед тем как читать значение счетчика из файла, я, при помощи функции file_exists() , проверяю — существует ли данный файл вообще? Если нет, то сразу же присваиваю счетчику нулевое значение. Если же файл существует, то читаем из него текущее значение счетчика. Для того чтобы прочитать содержимое файла, необходимо использовать следующую конструкцию:

Для работы с файлами в PHP, как и во многих других языках программирования, предварительно необходимо открыть файл на чтение или запись. Для открытия файла используется функция fopen() , в качестве передаваемых ей параметров мы должны указать путь к файлу и способ доступа («r» — для чтения, «w» — для записи). В случае успешного открытия файла мы получаем его дескриптор, который далее и используется при любых операциях с файлом.

На следующем шаге, используя функцию fread() , мы читаем содержимое файла. Т.к. у нас это очень простой счетчик, то все содержимое файла и является значением счетчика. Но для того чтобы прочитать содержимое файла, нам необходимо, кроме дескриптора файла, также указать и размер читаемых данных. В случае если файл небольшой, проще всего прочитать его в переменную целиком. А значит, нам необходимо предварительно узнать размер файла в байтах. Это делается при помощи функции filesize() .

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

Прочитав значение счетчика, его необходимо увеличить на единицу и сохранить обновленное значение в файле. При сохранении файла, точно так же, как и при открытии, необходимо вначале получить дескриптор файла, а уже затем делать с файлом какие-либо операции. В отличие от чтения, нам сейчас необходимо открыть файл на запись, указав режим доступа «w». При открытии файла в режиме записи он автоматически усекается до нулевой длины. Для сохранения строки в файле мы используем функцию fwrite() , передавая ей дескриптор файла и собственно значение переменной $counter в качестве параметров.

Файл может отсутствовать при первом запуске скрипта, и в этом случае он будет создан автоматически — при первом же сохранении счетчика.

Начнем с создания самого простого текстового счетчика, который будет обсчитывать только одну страничку – ту, на которой он будет размещен. Но перед тем как переходить непосредственно к программированию, давайте остановимся на его алгоритме. В данном случае он очень простой, но, сформулировав его словами, нам будет проще понять, как работает код. Итак, алгоритм работы счетчика будет следующий:

  1. Прочитать текущее содержимое счетчика;
  2. Увеличить текущее содержимое счетчика на единицу;
  3. Сохранить обновленное содержимое счетчика;
  4. Вывести на печать обновленное значение счетчика.

Теперь важный вопрос — где мы будем хранить значение счетчика? Т.к. страничка запрашивается разными людьми и с разных компьютеров, то хранить его мы можем только на сервере. В качестве хранилища может выступать либо файл, либо база данных. Работу с базой данных мы сейчас разбирать не будем, а остановимся на обычном текстовом файле, как наиболее подходящем варианте во многих случаях.

Я сразу приведу PHP-код, реализующий самый простой из всех возможных типов счетчика, а затем уже дам ряд комментариев.

Как видите, скрипт достаточно прозрачный и практически полностью следует сформулированному ранее алгоритму. При этом, для удобства дальнейшей поддержки кода, я в первой же строке определил переменную $file_counter , которую уже и использую. Постарайтесь, по возможности, всегда определять переменные для всех более-менее важных исходных данных и не используйте их напрямую.

Читайте так же:
Сколько осталось до конца учебного года счетчик

Перед тем как читать значение счетчика из файла, я, при помощи функции file_exists() , проверяю — существует ли данный файл вообще? Если нет, то сразу же присваиваю счетчику нулевое значение. Если же файл существует, то читаем из него текущее значение счетчика. Для того чтобы прочитать содержимое файла, необходимо использовать следующую конструкцию:

Для работы с файлами в PHP, как и во многих других языках программирования, предварительно необходимо открыть файл на чтение или запись. Для открытия файла используется функция fopen() , в качестве передаваемых ей параметров мы должны указать путь к файлу и способ доступа («r» — для чтения, «w» — для записи). В случае успешного открытия файла мы получаем его дескриптор, который далее и используется при любых операциях с файлом.

На следующем шаге, используя функцию fread() , мы читаем содержимое файла. Т.к. у нас это очень простой счетчик, то все содержимое файла и является значением счетчика. Но для того чтобы прочитать содержимое файла, нам необходимо, кроме дескриптора файла, также указать и размер читаемых данных. В случае если файл небольшой, проще всего прочитать его в переменную целиком. А значит, нам необходимо предварительно узнать размер файла в байтах. Это делается при помощи функции filesize() .

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

Прочитав значение счетчика, его необходимо увеличить на единицу и сохранить обновленное значение в файле. При сохранении файла, точно так же, как и при открытии, необходимо вначале получить дескриптор файла, а уже затем делать с файлом какие-либо операции. В отличие от чтения, нам сейчас необходимо открыть файл на запись, указав режим доступа «w». При открытии файла в режиме записи он автоматически усекается до нулевой длины. Для сохранения строки в файле мы используем функцию fwrite() , передавая ей дескриптор файла и собственно значение переменной $counter в качестве параметров.

Файл может отсутствовать при первом запуске скрипта, и в этом случае он будет создан автоматически — при первом же сохранении счетчика.

Помогите чайнику, плиз. Я дописываю движок своего сайта, размер которого
растет буквально на глазах. Дело в том, что у меня все скрипты напичканы
всякими проверками. Например «счетчик кол-ва просмотров страницы»:

1. проверка существования файла
2. читаем файл
3. проверяем, файл должен содержать только одну строку
4. проверяем, в строке должны быть только цифры
5. увеличиваем счетчик
6. пишем обратно в файл
7. проверяем, записалось ли

Проверка стоит даже на существование собственных скритов движка и
файлы-шаблоны. Это скажется на скорости работы сайта.
Мне в инете попадались вот такие фразы: «сбои работы сервера»,
«хакерские атаки» и т.д., после чего сайт не работал или ругался на
отсутствие файлов.

Вопросы:
1. Возможны ли ситуации, при которых файл счетчика показов страницы
будет потерян (обрезан) в момент записи при сбоях (перегрузках, и т.д.) ?
Хакера в учет не брать.
Проблемы одновременного использования файла двумя
пользователями (чтение-запись) тоже.
2. Возможны ли потери собственных скриптов?
3. На хостере есть архивация. Я понимаю, что это, но не знаю, как
используется эта штука. Можно в двух словах объяснить, какая польза от
этой архивации?
4. Я написал выше пример «замороченного» счетчика, а что Вы думаете об
этих многочисленных проверках?

Заранее благодарю Вас.

Ответ: На моем сайте, ВСЁ сохраняется в одном файле (по поводу подсчета просмотров страниц). Раз в полгода ВСЁ это дело стирается, так как работает ПОСТОЯННО, а значит, является самой уязвимой вещью на сайте. Не вижу в этом ничего плохого, так как сама такая статистика направлена только на одно — выявление самых популярных страниц своего сайта и ПОНИМАНИЯ почему же они самые посещаемые.

Ну и пусть, стираются раз в полгода, я сам стираю этот файл, если не происходят сбои на сервере.

По поводу торможения, могу сказать, что в Google есть функция «эффективность сайта», там все сайты с загрузкой страниц более секунды считаются медленными, когда ЭТО увидел сократил свой объем статистики до 1 часа (было сутки), но все-равно страницы генерируются за 1,5 секунды в среднем.

Выбирать Вам, что Вы хотите иметь статистику по сайту, либо чтобы сайт работал как молния.

Думаю, есть золотая середина, ищите её и все будет хорошо.

По поводу проверок, проверки одной строки, проверки цифр, итд — на это время не расходуется, самый большой расход идёт в ЦИКЛАХ, и в считывании БОЛЬШИХ баз данных, всё остальное работает МОМЕНТАЛЬНО. По поводу архивации — это бред. никто и ничего не архивирует — раз в день скачивайте свои базы из интернета, они всегда будут свежие, ПОЛЕТИТ сервак (всё сотрётся), Вы всегда сможете ВСЁ восстановить. И здесь не важно сохраняется инфа в простых файлах, либо в MySql, вылетает так, что и в первом и втором случае уже ничего не восстановишь, пока не запишешь по новому.

Итак, начнем. Для начала давайте определимся, что именно нам надо делать. При клике на ссылку, для подсчета количества кликов, нам надо специальным скриптом засчитать клик, а после предоставить посетителю интересующую его информацию (сделать редирект на нужный файл). В принципе, последовательность (за счет клика и выдача информации) можно поменять местами, однако учтите, что если счетчик используется для подсчета скачиваний файлов, то для того чтобы после скачки файла выполнялся скрипт, потребуется писать специальный скрипт-загрузчик файлов. Зачем вам лишние проблемы? Такой же принцип работы будет и у счетчика посещений. В данном случае, для ускорения загрузки страницы можно обойтись без редиректа, а просто вставить код счетчика в загружаемую страницу.

Читайте так же:
Битрикс как добавить счетчик

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

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

Первой строчкой кода — $f =fopen(«stat.dat «,»a+ «); мы открываем файл stat.dat для чтения и записи, связываем его с файловой переменной $f. Именно этот файл будет хранить данные о состоянии счетчика. Для правильной работы советую устанавливать для данного файла права доступа 777 или аналогичные с полным доступом на чтение и запись.

Следующая строчка — flock($f ,LOCK_EX); очень важна для работоспособности скрипта. Что она делает? Она на время работы данного скрипта (или до ее снятия) блокирует доступ к файлу для других скриптов или копии данного. Почему это так важно? Давайте представим ситуацию: в тот момент, когда пользователь1 кликает на ссылку, запускающую скрипт подсчета кликов, по той же ссылке кликает пользователь2, запуская копию того же скрипта. Как вы увидите далее, в зависимости от того, на какой стадии выполнения находится скрипт, запущенный пользователем1, скрипт запущенный пользователем2 и работающий параллельно со своей копией может попросту обнулить счетчик. Эту ошибку допускают практически все начинающие программисты на PHP, создавая подобные счетчики. Теперь, я думаю ясно, зачем нам блокировка доступа к файлу — в данном случае скрипт, запущенный пользователем2 будет ждать пока отработает скрипт, запущенный пользователем1 (не стоит пугаться, что это замедлит загрузку страниц — даже самые медленные серверы выполняют данный скрипт за сотые доли секунды).

С 3-й строчкой кода $count =fread($f ,100); все ясно. В переменную $count считываем значение счетчика.

Теперь нам осталось произвести запись в файл обновленных данных. Для этого нужно предварительно очистить файл ftruncate($f ,0); вот тут и может возникнуть та опасная ситуация с обнулением счетчика, про которую я говорил. Однако мы используем блокировку файла, так что бояться нечего.

Записываем обновленные данные о значении счетчика fwrite($f ,$count );

Для надежности принудительно очищаем буфер ввода/вывода для данного файла fflush($f );

Снимаем блокировку с файла flock($f ,LOCK_UN); на самом деле ее можно не снимать — она автоматически снимается после закрытия файла. Однако для полноты примера я ее все же написал.

Закрытие файла fclose($f ); тоже не обязательная функция т.к. все открытые скриптом файлы, после завершения его работы, автоматически закрываются. Но опять же, для полноты примера. =) кроме того, если на этом скрипт не заканчивается, а работать с файлом более не понадобится, рекомендуется сразу же закрывать файл.

Ну вот и все. Как видите совсем не сложно. Теперь для подсчета количества посещений, просто вставляйте данный код в страницу. А если же вы захотели подсчитать количество скачек какого-то файла, то вставляйте данный код в отдельный PHP файл, ссылку с имени файла заменяем на ссылку на данный скрипт, а в конец скрипта дописываем редирект на файл для скачки. Лучше всего его выполнить на PHP: Header(«location:/download_dir/file_to_download.rar «);

Ах да. Надо же еще выводить значение счетчика, иначе считать то зачем =). Значения, разумеется, берем из файла. Можно сделать как в примере самого счетчика:

Лабораторная работа №3. Создание тестовой системы и счетчика посещений страницы средствами CGI и PHP

Лабораторная работа №3. Создание тестовой системы и счетчика посещений страницы средствами CGI и PHP

1. Создать каталог [диск с меткой User]:infocom.

2. Установить web-сервер Apache в каталог [диск с меткой User]:infocomApache2.2 как консольное приложение, а не как сервис.

3. Установить PHP в каталог [диск с меткой User]:infocomphp.

4. Настроить файлы httpd. conf и php. ini (см. презентацию в файле apache+php. ppt)

Во всех вариантах задания необходимо разработать CGI-модуль и PHP-скрипт.

ОПРЕДЕЛИТЬ СКОРОСТЬ РАБОТЫ CGI-МОДУЛЯ И PHP-СКРИПТА.

CGI. Проверка знания правил дорожного движения и текстовый счетчик посещения страницы.

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

CGI. Проверка знания таблицы умножения и текстовый счетчик посещения страницы.

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

CGI. Любой психологический тест и текстовый счетчик посещения страницы.

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

CGI. Проверка знания языка HTML и текстовый счетчик посещения страницы.

PHP. Проверка знания языка HTML с тематическими вопросами и вывод результатов с процентами успешных ответов по каждой теме.

CGI. Экзамен по дисциплине и текстовый счетчик посещения страницы.

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

CGI. Проверка знания словарного запаса (англ. или нем. или франц.) и текстовый счетчик посещения страницы.

PHP. Проверка знания словарного запаса (англ. или нем. или франц.) с записью результатов прохождения теста разными пользователями в файл и вывода результатов в виде диаграммы.

CGI. Проверка знания таблицы умножения и текстовый счетчик посещения страницы.

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

Читайте так же:
Счетчик свг 15 метер размеры

CGI. Любой психологический тест и текстовый счетчик посещения страницы.

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

CGI. Проверка знания языка HTML и текстовый счетчик посещения страницы.

PHP. Вывод отдельных слов иностранного языка, из которых нужно построить фразу по правилам. Рядом с каждым словом поле, в котором можно определить порядковый номер слова во фразе. Предусмотреть кнопку помощи для решения задачи. Предусмотреть вывод итогового результата.

CGI. Экзамен по дисциплине и текстовый счетчик посещения страницы.

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

CGI. Проверка знания правил дорожного движения и текстовый счетчик посещения страницы.

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

Содержание отчета (отчет в электронном виде):

— титульный лист (один для всех лабораторных работ);

— задание на лабораторную работу №3;

— исходные коды разметки документов, исходные коды скриптов;

— сравнительный анализ скорости работы CGI и PHP скриптов;

— выводы по работе.

CGI (Common Gateway Interface) – общий шлюзовой интерфейс

Один из способов формирования динамических HTML-документов заключается в использовании приложений CGI.

CGI – это интерфейс для запуска внешних программ под управлением web-сервера.

Приложение CGI – программа, использующая CGI-интерфейс, получает информацию от удаленного пользователя, обрабатывает ее, и возвращает результат (динамически сформированный HTML-документ, гиперссылка на существующий HTML-документ, графическое изображение и т. д.) Так как CGI-приложение – это программа, она должна быть оттранслирована для той операционной системы, под управлением которой работает web-сервер.

На стороне клиента размещается форма ввода, содержащая некоторые поля для ввода данных и кнопку для отсылки данных. После заполнения полей и нажатия кнопки данные в запросе клиента пересылаются на сторону сервера, где web-сервер передает присланные данные CGI-приложению.

После обработки полученных данных CGI-приложение создает документ и передает его web-сервер, который в ответе сервера возвращает документ на сторону клиента.

Передача информации от клиента к серверу и передача сформированного документа от сервера к клиенту изображена на рис. 1.

Рис. 1. Передача информации от клиента к серверу и передача сформированного документа от сервера к клиенту.

Для создания формы на стороне клиента для занесения данных используется тег

Атрибут action=url определяет url GCI-приложения, предназначенного для обработки присланных данных. По умолчанию используется текущий url.

Атрибут method=get|post указывает метод передачи данных серверу. По умолчанию используется метод get.

Метод get предполагает передачу данных GCI-приложению через переменные среды (environment variables), устанавливаемые на стороне сервера.

В зависимости от web-сервера и операционной системы могут использоваться разные переменные среды.

Для передачи данных, присланных методом get, используется переменная QUERY_STRING. Значением переменной QUERY_STRING будет строка, содержащая данные в формате name1=value1&name2=value2& … &nameN=valueN, где name – это имя поля формы, value – значение поля формы.

При использовании метода post GCI-приложение получает присланные данные через стандартный поток ввода.

Количество байт переданных данных можно получить через переменную среды CONTENT_LENGTH.

Вне зависимости от метода передачи данных, результат своей работы GCI-приложение должно направить в стандартный поток вывода.

Чаще всего GCI-приложение используется для создания HTML-документов на основе данных, полученных от клиента. В этом случае, первой строкой должен быть заголовок HTTP Content-type: text/html, за которой необходимо вывести пустую строку, отделяющую заголовки HTTP от данных HTML-документа.

Web-сервер возвращает результат, сформированный GCI-приложением, клиенту, возможно дополняя его заголовками HTTP.

GCI-приложение может сформировать полный ответ (со всеми заголовками HTTP). В этом случае web-сервер ничего не изменяет в результате работы GCI-приложения, только пересылает его клиенту как есть.

Пример: на стороне клиента в поля формы заносятся имя и возраст, в зависимости от возраста возвращаются разные приветствия (рассматриваются два варианта: для методов get и post).

HTML-документ, содержащий форму:

CGI-приложение (файл hello. cpp)

//из строки извлекаются подстроки “Maria” и “18”

//и присваиваются переменным name и age соответственно

HTML-документ, содержащий форму:

CGI-приложение (файл hello. cpp)

char * string=new char[length];

//из строки извлекаются подстроки “Maria” и “18”

//и присваиваются переменным name и age соответственно

fopen

(PHP 4, PHP 5, PHP 7, PHP 8)

fopen — Открывает файл или URL

Описание

fopen() закрепляет именованный ресурс, указанный в аргументе filename , за потоком.

Список параметров

Если filename передан в форме «scheme://. «, он считается URL и PHP проведёт поиск обработчика протокола (также известного как «обёртка») для этой схемы. Если ни одна обёртка не закреплена за протоколом, PHP выдаст замечание, чтобы помочь вам отследить потенциальную проблему в вашем скрипте и затем продолжит выполнение, как если бы filename указывал на обыкновенный файл.

Если PHP установлено, что filename указывает на локальный файл, тогда выполняется попытка открыть поток к этому файлу. Файл должен быть доступен PHP, так что вам следует убедиться, что права доступа на файл это разрешают. Если вы включили open_basedir, то накладываются дальнейшие ограничения.

Если PHP установил, что filename указывает на зарегистрированный протокол и этот протокол зарегистрирован как сетевой URL, PHP выполняет проверку состояния директивы allow_url_fopen. Если она выключена, PHP выдаст предупреждение и вызов fopen закончится неудачей.

Список поддерживаемых протоколов доступен в разделе Поддерживаемые протоколы и обёртки. Некоторые протоколы ( обёртки ) поддерживают контекст и/или опции php.ini . Обратитесь к соответствующей странице с описанием используемого протокола для получения списка опций, которые могут быть установлены. (например, значение php.ini user_agent используется обёрткой http ).

На платформе Windows, необходимо экранировать все обратные слеши в пути к файлу или использовать прямые слеши.

Параметр mode указывает тип доступа, который вы запрашиваете у потока. Он может быть одним из следующих вариантов:

Список возможных режимов для fopen() , используя mode

modeОписание
‘r’Открывает файл только для чтения; помещает указатель в начало файла.
‘r+’Открывает файл для чтения и записи; помещает указатель в начало файла.
‘w’Открывает файл только для записи; в противном случае ведёт себя так же, как и ‘w+’ .
‘w+’Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует — пытается его создать.
‘a’Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует — пытается его создать. В данном режиме функция fseek() не применима, записи всегда добавляются в конец.
‘a+’Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует — пытается его создать. В данном режиме функция fseek() влияет только на позицию чтения, записи всегда добавляются в конец.
‘x’Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт false и выдаст ошибку уровня E_WARNING . Если файл не существует, попытается его создать. Это эквивалентно указанию флагов O_EXCL|O_CREAT для внутреннего системного вызова open(2) .
‘x+’Создаёт и открывает для чтения и записи; в остальном имеет то же поведение, что и ‘x’ .
‘c’Открывает файл только для записи. Если файл не существует, то он создаётся. Если же файл существует, то он не обрезается (в отличие от ‘w’ ), и вызов к этой функции не вызывает ошибку (также как и в случае с ‘x’ ). Указатель на файл будет установлен на начало файла. Это может быть полезно при желании заблокировать файл (смотрите flock() ) перед изменением, так как использование ‘w’ может обрезать файл ещё до того как была получена блокировка (если вы желаете обрезать файл, можно использовать функцию ftruncate() после запроса на блокировку).
‘c+’Открывает файл для чтения и записи; в остальном имеет то же поведение, что и ‘c’ .
‘e’Установить флаг close-on-exec (закрыть при запуске) на открытый файловый дескриптор. Доступно только в PHP скомпилированном на системах поддерживающих POSIX.1-2008.

Разные семейства операционных систем имеют разные соглашения относительно окончания строк. Когда вы пишете текст и хотите вставить разрыв строки, вы должны использовать правильные символы (или символ) для вашей операционной системы. Системы семейства Unix используют n в качестве символа конца строки, системы семейства Windows используют rn в качестве символов окончания строки и системы семейства Macintosh (Mac OS Classic) используют r в качестве символа конца строки.

Если вы используете неверный символ конца строки при редактировании файлов, вы можете обнаружить, что при открытии эти файлы «странно выглядят».

Windows предлагает флаг режима текстовой трансляции ( ‘t’ ), который автоматически переведёт n в rn во время работы с файлом. И наоборот — вы также можете использовать ‘b’ , чтобы принудительно включить бинарный режим, в котором ваши данные не будут преобразовываться. Чтобы использовать эти режимы, укажите ‘b’ или ‘t’ последней буквой параметра mode .

Флагом трансляции по умолчанию является ‘b’ . Вы можете использовать режим ‘t’ , если работаете с текстовыми файлами и используете n для обозначения конца строки в вашем скрипте, но при этом предполагаете, что ваши файлы будут использоваться в таких приложениях, как «Блокнот» (в устаревших версиях). Во всех остальных случаях используйте флаг ‘b’ .

Если вы укажете флаг ‘t’ во время работы с бинарными файлами, вы можете столкнуться со странными проблемами с вашими данными, включая повреждённые файлы изображений и проблемы с символами rn .

Опять же из соображений портируемости крайне рекомендуется переписать старый код, который полагается на режим ‘t’ , чтобы вместо этого он использовал правильные концы строк и режим ‘b’ .

Необязательный третий параметр use_include_path может быть установлен в ‘1’ или true , если вы также хотите провести поиск файла в include_path.

Возвращаемые значения

Возвращает указатель на файл в случае успешного выполнения или false в случае возникновения ошибки

Ошибки

В случае неудачного завершения работы генерируется ошибка уровня E_WARNING .

Список изменений

ВерсияОписание
7.0.16, 7.1.2Добавлена опция ‘e’ .

Примеры

Пример #1 Примеры использования fopen()

Примечания

При использовании SSL, Microsoft IIS нарушает протокол, закрывая соединение без отправки индикатора close_notify . PHP сообщит об этом как «SSL: Fatal Protocol Error» в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP умеет определять, что на стороне сервера находится проблемный IIS при открытии потока с помощью обёртки https:// и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.

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

Данная функция также может принимать директории в качестве параметра filename . Если вы не знаете, является ли filename файлом или директорией, то вам может понадобиться использовать функцию is_dir() до вызова функции fopen() .

Смотрите также

  • Поддерживаемые протоколы и обёртки
  • fclose() — Закрывает открытый дескриптор файла
  • fgets() — Читает строку из файла
  • fread() — Бинарно-безопасное чтение файла
  • fwrite() — Бинарно-безопасная запись в файл
  • fsockopen() — Открывает соединение с интернет-сокетом или доменным сокетом Unix
  • file() — Читает содержимое файла и помещает его в массив
  • file_exists() — Проверяет существование указанного файла или каталога
  • is_readable() — Определяет существование файла и доступен ли он для чтения
  • stream_set_timeout() — Установить значение тайм-аута для потока
  • popen() — Открывает файловый указатель процесса
  • stream_context_create() — Создаёт контекст потока
  • umask() — Изменяет текущую umask
  • SplFileObject
голоса
Рейтинг статьи
Ссылка на основную публикацию