Php и взаимодействие с файловой системой web сервера


Содержание

Как предоставить веб-доступ для взаимодействия с файловой системой?

Мне нужно иметь возможность предоставлять веб-доступ для взаимодействия с файловой системой, для загрузки и загрузки файлов в каталог. В общем, люди будут обращаться к этим файлам с помощью sshfs, но в крайнем случае мы хотим, чтобы у людей был веб-доступ к этим файлам. Мы хотим запустить веб-сервер, возможно apache2, и какое-то веб-приложение или что-то на файловом сервере, что позволит людям входить на сайт и взаимодействовать с файловой системой. Если бы этот веб-доступ был чем-то вроде dropbox, это было бы здорово, но это не должно было быть почти таким. Нам просто нужны возможности загрузки и загрузки.

Мы не хотим использовать WebDAV или SparkleShare.

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

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

Добро пожаловать

В интернете очень много устаревшей информации, которая приводит к заблуждению, распространению неверных решений и написанию плохого кода у начинающих PHP-разработчиков. Это нужно остановить. PHP: Правильный Путь — легкочитаемое руководство для быстрого ознакомления с правилами эффективного использования PHP, принятыми стандартами написания кода и ссылками на признанные руководства по всему интернету.

Переводы

Руководство PHP: Правильный путь уже (или вскоре будет) переведено на множество различных языков:

Дисклеймер

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

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

Как внести вклад

Помогите сделать этот сайт лучшим ресурсом для начинающих PHP программистов! Помочь используя GitHub

Расскажите о нас

Руководство PHP: Правильный путь содержит веб-баннеры, которые вы можете использовать на своём сайте. Окажите поддержку, показав начинающим PHP-разработчикам где они могут найти полезную информацию!

Начало

Использование стабильной версии (7.2)

Если вы только начинаете работу с PHP, убедитесь в том, что вы используете текущую стабильную версию PHP 7.2. За последние несколько лет PHP добился больших успехов, добавив новые возможности.

Наиболее часто в ближайшем будущем вы будете видеть, что используются версии PHP 5.x, с последней 5.6. Но вы должны попробовать использовать последнюю стабильную версию, если это возможно. Не дайте скромной разнице между числами 5.2 и 5.6 ввести вас в заблуждение, эта разница представляет важные изменения. Если вам нужна функция или пример её использования, вы всегда можете найти документацию на php.net.

Встроенный веб-сервер

Вы можете начать изучение PHP без необходимости в установке и конфигурировании полноценного веб-сервера (необходим PHP 5.4 или новее). Для запуска сервера вам необходимо выполнить следующую команду из терминала в корневой папке веб-проекта:

Установка на Mac

OSX поставляется с предзапакованным PHP, но, в лучшем случае, он немного отстает от стабильной версии. Lion поставляется с PHP 5.3.6 и Mountain Lion имеет 5.3.10.

Для обновления PHP в OSX вы можете установить его с помощью нескольких пакетных менеджеров, наиболее рекомендуемый из которых php-osx by Liip.

Другой вариант, скомпилировать самостоятельно, в этом случае убедитесь, что у вас установлен либо Xcode, либо его аналог от Apple “CLI для Xcode”, который можно загрузить с Apple Mac Developer Center.

В качестве полного набора «всё-в-одном», который включает PHP, веб-сервер Apache и СУБД MySQL, и всё это с хорошим управлением через GUI, попробуйте MAMP.

Установка в Windows

PHP для Windows можно получить несколькими путями. Вы можете загрузить установочные файлы и, до недавнего времени, вы могли использовать ‘.msi’ установщик. Начиная с PHP версии 5.3.0 установщик не поддерживается.

Для изучения и локальной разработки вы можете использовать встроенный в PHP 5.4+ веб-сервер, о конфигурации которого можно не беспокоиться. Если вы предпочитаете сервера «всё-в-одном», которые включают в себя полноценный веб-сервер и MySQL, тогда можете воспользоваться такими инструментами, как Web Platform Installer, Zend Server CE, XAMPP или WAMP, которые помогут быстро развернуть окружение для разработки в Windows. Но, стоит сказать, что эти инструменты будут отличаться от продакшна, так что будьте осторожны и учитывайте эти различия, если вы работаете на Windows и деплоите на Linux.

Если вам нужно запустить конечную систему на Windows, то IIS7 даст вам лучшую стабильность и производительность. Вы можете использовать phpmanager (плагин для IIS7) для легкого конфигурирования и управления PHP. IIS7 поставляется с встроенным FastCGI, вам нужно просто настроить PHP в качестве обработчика. Для получения помощи и дополнительной информации посетите iis.net.

Vagrant

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

Если вы разрабатываете на Windows и деплоите на Linux (или что-либо отличающееся от Windows) или разрабатываете в команде, вы должны рассмотреть возможность использования виртуальной машины. Это звучит сложно, но, используя Vagrant, вы можете установить простую виртуальную машину всего лишь в несколько шагов. Они могут быть как выполнены вручную, так и с помощью специализированного софта, например, Puppet или Chef, который автоматизирует эту задачу. Использование этого софта гарантирует использование одинаковой конфигурации для нескольких машин, что избавляет вас от необходимости поддержки сложных списков установки. Вы также можете удалить вашу машину, и пересоздать её без большого количества ручных шагов, что делает создание «свежей» виртуалки очень простым.

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

Стандарты написания кода

Сообщество PHP является очень большим и разнообразным, сочетая в себе бесчисленное количество библиотек, фреймворков, и различных компонентов. Для PHP разработчика это обычная практика — выбрать несколько из них и соединить в одном проекте. Очень важно придерживаться общих стандартов написания кода (так точно, насколько это возможно) в своём PHP коде, чтобы позволить разработчикам сочетать и использовать различные библиотеки для своих проектов.

Группа Совместимости Фреймворков предложила и одобрила ряд стилевых рекомендаций, известных как PSR-0, PSR-1 и PSR-2. Не дайте веселым именам смутить вас, эти рекомендации представляют собой набор правил, которых начинают придерживаться такие проекты, как Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium и другие. Вы можете использовать их при работе над собственным проектом, или в дальнейшем использовать ваш собственный стиль.

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

Вы можете использовать PHP_CodeSniffer чтобы проверить код на соответствие одной из этих рекомендаций, а также плагин для текстовых редакторов, таких как, к примеру, Sublime Text 2 чтобы получить отчёт в реальном времени.

Используйте PHP Coding Standards Fixer, созданный Фабиеном Потенсьером, для автоматического исправления синтаксиса вашего кода так, чтобы он соответствовал этим стандартам, что спасет вас от исправления каждой проблемы вручную.

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

Основные моменты языка

Парадигмы программирования

PHP представляет собой гибкий, динамичный язык, который поддерживает несколько техник программирования. Он значительно развился в течение последних нескольких лет: добавлена мощная объектно-ориентированная модель в PHP 5.0 (2004), анонимные функции (замыкания) и пространства имен в PHP 5.3 (2009), а также трейты в PHP 5.4 (2012).

Объектно-ориентированное программирование

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

Функциональное программирование

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

Рекурсия — это особенность, которая позволяет функции вызывать саму себя, это поддерживается языком, но бо́льшая часть кода PHP фокусируется на итерации.

Анонимные функции (замыкания) поддерживаются PHP начиная с версии 5.3 (2009).

В PHP 5.4 добавлена возможность связывать замыкание с областью видимости объекта, а также улучшена поддержка callables (всё, что может быть вызвано), так что они могут быть использованы наравне с анонимными функциями практически во всех случаях.

Meta Programming

PHP поддерживает несколько форм метапрограммирования, что реализуется с помощью таких механизмов, как Reflection API и Магические Методы. Доступно много Магических Методов, например: __get() , __set() , __clone() , __toString() , __invoke() , и т.д., которые позволяют отслеживать поведение внутри класса. Разработчики Ruby часто говорят, что PHP не хватает method_missing , но он доступен, как __call() и __callStatic() .

Пространства имен

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

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

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

Один из рекомендуемых способов использования пространств имен описан в PSR-4, который призван обеспечить стандарты для описания файлов, классов и пространств имен, что позволяет создавать подключаемый (plug-and-play) код.

Стандартная Библиотека PHP (SPL)

Стандартная библиотека PHP (SPL) поставляется вместе с PHP и предоставляет набор классов и интерфейсов. Она состоит в основном из часто используемых классов структур данных (стек, очередь, куча, и т.д.), а также итераторов, которые предназначены для прохождения через эти структуры данных или ваши собственные классы, которые реализуют интерфейсы SPL.

Интерфейс командной строки

Главная цель, с которой был создан PHP — это разработка веб-приложений, но он также полезен при написания кода для интерфейса командной строки (CLI). PHP программы командной строки могут помочь вам автоматизировать такие общие задачи, как тестирование, развертывание и администрирование приложения.

CLI PHP программы очень мощные, потому что вы можете использовать код вашего приложения напрямую, без нужды в создании и обеспечении безопасности веб-интерфейса (GUI) для него. Только убедитесь, что вы не используете для ваших скриптов (CLI) корень вашего веб-сервера.

Попробуйте запустить PHP из консоли:

Опция -i выдаст вам конфигурацию вашего PHP, подобно функции phpinfo .

Опция -a предоставляет доступ к интерактивной оболочке, подобно ruby IRB или интерактивной оболочки python. Также существует целый ряд других полезных опций командной строки.

Давайте напишем простую «Привет, $name» программу CLI. Чтобы это сделать, создайте файл с именем hello.php , как показано ниже.

PHP устанавливает две специальные переменные, основанных на аргументах, с которыми запущен ваш скрипт. $argc — это переменная с числовым значением, которая содержит количество переданных аргументов, $argv — это массив, содержащий значение каждого аргумента. Первый аргумент — всегда название вашего PHP скрипта, в этом случае hello.php .

Выражение exit() используется с ненулевым числом, чтобы дать оболочке понять, что команда не удалась. Часто используемые коды завершения можно найти здесь

Для запуска сценария, указанного выше, наберите в командной строке:

XDebug

Один из самых полезных инструментов в разработке программного обеспечения — хороший отладчик. Он позволяет вам отследить исполнение вашего кода и контролировать содержимое вашего стека. XDebug — это PHP отладчик, который может использоваться различными IDE, чтобы дать вам возможность устанавливать Брейкпоинты (точки отладки кода) и контролировать стек. Он также позволяет использовать такие инструменты, как PHPUnit и KCacheGrind, для покрытия кода тестами и его профилирования.

Если вы оказываетесь в безвыходном положении при использовании var_dump/print_r, и у вас не получается найти решение, то возможно вам поможет использование отладчика.

Установка XDebug может оказаться сложной, но одна из самых полезных его функций это «Удаленная отладка» — если вы разрабатываете код локально и затем тестируете его в локальной машине или на другом сервере, Удаленная Отладка — это возможность, которую вы захотите сразу же включить.

Стандартно, вы отредактируете ваш Apache VHost или .htaccess файл со следующими значениями:

“remote_host” и “remote_port” будут указывать на ваш локальный компьютер и порт, который вы указали в вашей IDE для прослушивания. Дальше достаточно включить режим «ожидания соединений» в вашей IDE, и загрузить URL:

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

Менеджер зависимостей

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

В настоящее время существует две основные системы управления пакетами для PHP — Composer и PEAR. Какая из них подходит именно вам? Ответ — обе.

  • Используйте Composer для управления зависимостями одного проекта.
  • Используйте PEAR для управления зависимостями всех проектов во всей вашей системе.

В общем, пакеты Composer будут доступны только в проектах, для которых вы явно укажете его использование, тогда как пакеты PEAR будут доступны во всех ваших PHP проектах. PEAR, на первый взгляд, может показаться более простым подходом, но есть преимущества в использовании подхода «проект-к-проекту» для зависимостей.

Composer и Packagist

Composer является блестящим менеджером зависимостей для PHP. Укажите список зависимостей вашего проекта в файле composer.json и, с помощью нескольких простых команд, Composer автоматически скачает зависимости вашего проекта и установит для вас автозагрузку.

На данный момент существует много PHP библиотек, которые совместимы с Composer, готовых для использования в вашем проекте. Список этих «пакетов» есть на Packagist, официальном репозитории для Composer-совместимых PHP библиотек.

Как установить Composer

Вы можете установить Composer локально (в вашей текущей рабочей директории; хотя это не рекомендуется) или глобально (например /usr/local/bin). Предположим, вы хотите установить Composer локально. Из корневой директории вашего проекта выполните:

Это позволит загрузить файл composer.phar (бинарный PHP-архив). Вы можете запустить его, используя php для управления зависимостями вашего проекта. Обратите внимание: Если вы скачаете код напрямую в ваш интерпретатор, пожалуйста, сперва прочитайте код онлайн, для подтверждения его безопасности.

Как установить Composer (вручную)

Ручная установка Composer — это продвинутая техника; однако, существуют причины, по которым разработчик может предпочесть именно этот метод использованию интерактивной установки. Интерактивная установка проверяет настройки PHP, чтобы подтвердить, что:

  • Используется необходимая версия PHP
  • Файлы .phar могут быть верно выполнены
  • Определенные права на каталог достаточны
  • Не установлены конфликтные расширения
  • Установлены необходимые настройки php.ini

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

Путь $HOME/local/bin (или другой каталог, выбранный вами) должен находиться в вашей переменной окружения $PATH . Это позволит быть доступной команде composer .

Если вы прочтете документацию Composer, которая гласит, что нужно запускать Composer с помощью команды php composer.phar install , вы можете заменить эту команду на:

Как объявить и установить зависимости

Composer продолжает следить за зависимостями вашего проекта в файле composer.json . Вы можете управлять им вручную, если вам нравится, или же использовать сам Composer. Команда php composer.phar require добавляет зависимость в проект и, если в каталоге нет файла composer.json , он будет создан. Далее мы рассмотрим пример, который добавляет Twig, как зависимость вашего проекта. Запустите это в корневой директории вашего проекта, куда вы загружали composer.phar :

Аналогично команда php composer.phar init проведет вас через создание полного файла composer.json для вашего проекта. Есть и другой путь, когда вы создадите файл composer.json вы можете сказать Composer, чтобы он скачал все ваши зависимости в папку vendors/ . Это также применимо для проектов, которые вы загрузили и которые предоставляют файл composer.json :

Затем добавьте этот код в основной PHP-файл вашего приложения; это укажет PHP использовать автозагрузчик Composer для зависимостей вашего проекта.

Теперь вы можете использовать зависимости вашего проекта и они будут автоматически загружаться (по требованию).

Обновление зависимостей

Composer создает файл composer.lock который хранит точную версию каждого пакета, который он загрузил во время первого запуска php composer.phar install . Если вы поделились проектом с другими разработчиками и файл composer.lock является частью него, то при запуске php composer.phar install они получат ту же версию, что и вы. Чтобы обновить ваши зависимости запустите php composer.phar update .

Очень удобно гибко указывать требуемые версии. Если вы нуждаетесь в версии

1.8, что значит “всё что новее 1.8.0, но меньше 2.0.x-dev”. Вы также можете использовать шаблон * , например 1.8.* . Теперь команда Composer php composer.phar update обновит все ваши зависимости до новейших версий, которые соответствуют указанным ограничениям.

Проверка ваших зависимостей на безопасность

Security Advisories Checker является веб-сервисом и инструментом командной строки, оба из которых изучают ваш файл composer.lock и сообщают, если есть необходимость в обновлении какой-либо из ваших зависимостей.

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

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

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

Как установить PEAR

Вы можете установить PEAR, загрузив установщик phar и выполнив его. Документация PEAR содержит подробную инструкцию по установке для каждой операционной системы.

Если вы используете Linux, вы также можете посмотреть наличие PEAR в пакетном менеджере вашего дистрибутива. Debian и Ubuntu, к примеру, содержат информацию о пакете php-pear в пакетном менеджере apt.

Как установить пакет

Если пакет существует в списке пакетов PEAR, вы можете установить его, указав официальное название:

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

Обработка зависимостей PEAR с Composer

Если вы уже используете Composer и желаете установить какой-то код из PEAR, вы можете использовать Composer для обработки зависимостей PEAR. Этот пример установит код из pear2.php.net :

Первый раздел «repositories» даст понять Composer, что он должен сделать “initialise” (или “discover” в терминологии PEAR) репозиторий pear. Затем секция require укажет именам пакетов префикс, как ниже:

Префикс “pear” жестко ограничен, чтобы избежать любых конфликтов, так как каналы Pear могут быть схожи с другими поставщиками пакетов например, вместо короткого имени (или полного URL) может быть использовано для объявления в каком канале находится пакет.

Когда код будет установлен он будет доступен в вашей папке vendor и автоматически доступен через автозагрузчик (файл Autoload) Composer.

Чтобы использовать этот пакет PEAR просто объявите как ниже:

Практики написания кода

Основы

PHP — это обширный язык, который позволяет разработчикам всех уровней писать код не только быстро, но и эффективно. В любом случае, изучая язык, мы нередко забываем основы, которые мы изучали изначально (или бегло просмотрели), в пользу коротких путей и/или вредных привычек. Чтобы помочь в борьбе с этой общей проблемой, эта секция предназначена для напоминания разработчикам основ практик написания кода PHP.

Дата и время

PHP содержит встроенный класс DateTime, предназначенный для чтения, записи, сравнения и вычисления даты или времени. Также в PHP много функций, связанных с датой и временем, помимо класса DateTime, но класс предоставляет хороший объектно-ориентированный интерфейс для решения большинства задач. Он способен даже обрабатывать временные зоны, но это уже не рассматривается в данном коротком введении.

Для начала работы с DateTime, сконвертируйте «сырую» строку даты и времени в объект с помощью фабричного метода createFromFormat() или выполните new \DateTime , чтобы получить текущую дату и время. Используйте метод format() для конвертирования DateTime обратно в строку для вывода.

Вычисления с DateTime возможны с использованием класса DateInterval. У класса DateTime есть методы add() и sub() , которые принимают DateInterval, как аргумент. Не пишите код, который ожидает одинаковое число секунд каждый день, перевод часов и смена часовых поясов разрушат это предположение. Вместо этого используйте интервалы дат. Для расчета разницы между датами используйте метод diff() . Он вернет новый объект DateInterval, который очень легко отобразить.

С объектами DateTime, вы можете использовать стандартные методы сравнения:

И последний пример для демонстрации класса DatePeriod. Он используется для перебора повторяющихся событий. Класс может принимать два объекта DateTime, начало и конец, и интервал, для которого он вернет все события между ними.

Design Patterns

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

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

Исключения

Исключения — это неотъемлемая часть большинства популярных языков программирования, но зачастую PHP разработчики не уделяют им должного внимания. Языки, подобные Ruby, очень подробно обрабатывают исключения, поэтому, если что-то идёт не верно, например: не удался HTTP запрос, запрос к базе данных происходит неправильно или если запрошенное изображение не было найдено, Ruby (или используемые гемы) выбросит исключение на экран, помогающее понять где вы допустили ошибку.

PHP сам по себе довольно слаб в плане этого и вызов file_get_contents() , как правило, даст вам только FALSE и предупреждение. Многие устаревшие PHP-фреймворки, как CodeIgniter, просто вернут false, добавят сообщение в свой собственный журнал и, может быть, дадут вам использовать метод, как $this->upload->get_error() , чтобы посмотреть, что пошло не так. Проблема в том, что вы должны искать ошибку и проверять документацию, чтобы понять, какой ошибочный метод существует в этом классе, вместо того, чтобы сделать это всё более очевидным.

Еще одна проблема в том, что классы автоматически выдают ошибку на экран и закрывают процесс. Когда вы делаете это, вы не даете другому разработчику динамически обработать эту ошибку. Исключения должны быть выброшены, чтобы дать разработчику знать об ошибке и выбрать, как её обработать. Например:

Исключения SPL

Универсальный класс Exception предоставляет очень мало отладочного контекста для разработчика; как бы то ни было, для того чтобы исправить это, можно создать специализированный класс, который будет расширять возможности универсального класса Exception :

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

Например, если вы используете магический метод __call() и вами был вызван неизвестный метод, то вместо выбрасывания стандартного исключения, которое очень расплывчато, или вместо создания своего исключения, вы можете просто использовать throw new BadFunctionCallException; .

Базы данных

Скорее всего, ваш PHP код будет использовать базу данных для сохранения информации. Существует несколько вариантов для подключения и взаимодействия с базой данных. Рекомендуемым вариантом до PHP 5.1.0 было использование нативных (родных) драйверов, таких как mysql, mysqli, pgsql, etc.

Встроенные драйвера замечательны, если вы используете ОДНУ базу данных в ваших приложениях, но если, например, вы используете MySQL и немного MSSQL, или вам нужно подключиться в базе данных Oracle, тогда вы не сможете использовать те же драйвера. Вам нужно будет изучить новый API для каждой базы данных — и это может оказаться нерациональным.

Обратите внимание, что расширение mysql для PHP больше не поддерживается, и его официальным статусом, начиная с PHP версии 5.4.0, является «Устарело в связи с длительным сроком использования». Это значит, что оно будет удалено в течение нескольких следующих релизов, так что в PHP 5.6 (или в версиях, следующих за 5.5) оно вполне может пропасть. Если вы используете mysql_connect() и mysql_query() в своих приложениях, тогда вам придется столкнуться с переписыванием кода, поэтому лучшим вариантом сейчас является использование в приложениях mysqli или PDO вместо mysql, прежде чем вы в дальнейшем столкнётесь с нерабочими приложениями. Если вы начинаете изучение баз данных с нуля, тогда полностью откажитесь от использования расширения mysql — используйте Расширение MySQLi или PDO.

PDO — это абстрактная библиотека для подключения к базе данных, встроенная в PHP с версии 5.1.0, которая обеспечивает единый интерфейс для взаимодействия с большим количеством различных баз данных. PDO не будет переводить ваши SQL запросы или эмулировать отсутствующие возможности; он чист для подключения к нескольким типам баз данных с тем же API.

Более важно, что PDO позволяет вам безопасно вводить пользовательские данные (например идентификатор) в ваши SQL запросы, без беспокойства о SQL-инъекциях. Это возможно благодаря использованию PDO выражений и связывания (bound) параметров.

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

Это ужасный код. Вы вставляете необработанные параметры в SQL запрос. Это приведёт к взлому. Просто представьте, что взломщик сделает запрос http://domain.com/? >, который присвоит переменной $_GET[‘id’] значение 1;DELETE FROM users и приведёт к удалению всех ваших пользователей! Вместо этого, вы должны очистить ввод идентификатора с помощью связывания параметров PDO.

Это правильный код. Он использует связанный параметр в выражении PDO. Это позволяет избежать ввода некоректного ID перед тем, как передать запрос в базу данных, тем самым предотвращая потенциальные SQL-инъекции.

Вы также должны понимать, если подключение не закрыто должным образом, то оно использует много ресурсов, которые тратятся впустую, впрочем это больше относится к другим языкам. Используя PDO, вы можете неявно закрывать подключение уничтожив объект — все ссылки на него будут удалены, т.е. установлены в NULL. Если не сделать этого явно, PHP закроет подключение за вас, когда выполнение скрипта завершится, если только вы не используете постоянные подключения.

Уровни абстракции

Многие фреймворки предоставляют собственный уровень абстракции, который может строиться на основе PDO. Такая фактическая абстракция баз данных позволяет оборачивать запросы на PHP в методы, которые отсутствуют в одной системе баз данных, но работают в другой. Это, конечно, добавит небольшие накладные расходы, но если вы строите портативные приложения, которым необходима работа с MySQL, PostgreSQL и SQLite, тогда, для чистоты кода, минимальными накладными расходами можно пренебречь.

Некоторые уровни абстракции построены с использованием PSR-0 стандарта, поэтому могут быть установлены в любое приложение:

Безопасность

Безопасность веб-приложений

Есть плохие люди, которые могут и хотят взломать ваши веб-приложения. Важно принять необходимые меры предосторожности, чтобы укрепить безопасность вашего приложения. К счастью, прекрасные люди в The Open Web Application Security Project (OWASP) составили полный список известных проблем безопасности и методов защиты от них. Это должно быть прочитано любым разработчиком, заботящимся о безопасности.

Хэширование паролей

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

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

Хэширование паролей с функцией password_hash


В PHP 5.5 была представлена функция password_hash . Сейчас она использует BCrypt, сильнейший алгоритм, поддерживаемый PHP. Она будет обновлена в будущем, для поддержки бОльшего числа алгоритмов, по мере необходимости. Библиотека password_compat была создана для обратной совместимости с PHP >= 5.3.7.

Ниже мы хэшируем строку и далее сверяем её с новой строкой. Поскольку наши две исходные строки отличаются (‘secret-password’ и ‘bad-password’) эта авторизация будет неудачной.

Фильтрация данных

Никогда не доверяйте пользовательскому вводу, который передаётся вашему PHP коду. Всегда проверяйте и очищайте пользовательский ввод перед его использованием в коде. Функции filter_var и filter_input помогут очистить переменные, а также проверить соответствие введённых данных некоторому формату (например, адрес электронной почты).

Пользовательский ввод может быть различным: $_GET и $_POST , данные введённые в форму, некоторые значения в суперглобальной переменной $_SERVER и тело HTTP запроса, открытое с помощью fopen(‘php://input’, ‘r’) . Запомните, что пользовательский ввод не ограничивается данными формы, отправленной пользователем. Отправляемые и загружаемые файлы, значения сессий, данные cookie и данные сторонних веб-сервисов также приравниваются к пользовательскому вводу.

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

Данные могут быть отфильтрованы по-разному, в зависимости от их назначения. Например, когда нефильтрованные данные, введённые пользоватем, передаются в HTML код страницы, он может выполнить HTML и JavaScript на вашем сайте! Этот тип атаки известен, как Cross-Site-Scripting (XSS) и может иметь очень серьёзные последствия. Один из способов избежать XSS заключается в очистке ввода от всех HTML тэгов (их удалением, или заменой на HTML символы) с помощью функции strip_tags или экранирование символов в равносильные им HTML сущности с функцией htmlentities или htmlspecialchars .

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

Илон Маск рекомендует:  Что такое код ldap_next_reference

Последний пример, принимает пользовательский ввод, чтобы определить, какой файл загружать из файловой системы. Это может быть использовано для изменения имени файла на путь файла. Вам нужно убрать “/”, “../”, нулевые байты или другие символы из пути файла, так чтобы скрипт не мог загружать скрытые, непубличные или конфиденциальные файлы.

Санитизация

Санитизация удаляет (или экранирует) неправильные или небезопасные символы из пользовательского ввода.

Например, вам необходимо нормализовать пользовательский ввод перед подключением ввода в HTML или его вставкой в сырой SQL запрос. Когда вы используете связанные параметры с PDO, они будут очищать ввод за вас.

Иногда требуется разрешить некоторые безопасные HTML тэги в вводе, когда он подключается в HTML страницу. Это очень трудно сделать и многие избегают этого, используя ограниченное форматирование, как например Markdown или BBCode, либо библиотеки с белым списком, как HTML Purifier, существующие по этой причине.

Валидация

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

Конфигурационные файлы

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

  • Рекомендуется хранить вашу конфигурационную информацию там, где к ней не может быть получен доступ напрямую, а доступ к ней осуществлялся через файловую систему.
  • Если вы вынуждены хранить конфигурационные файлы в корневом каталоге, именуйте файл с расширением .php . Это гарантирует, что, если к скрипту обратятся напрямую, он не будет выведен, как обычный текст.
  • Информация в файлах конфигурации, должна быть защищена соответственно, либо с помощью шифрования или системных прав группы/пользователя файла.

Использование глобальных переменных

Примечание: С появлением PHP 5.4 директива register_globals была удалена и больше не может быть использована. Это касается тех, кому нужно обновить старое приложение.

Включенный параметр конфигурации register_globals делает несколько типов переменных (в том числе из $_POST , $_GET и $_REQUEST ) глобальными, доступными в глобальной области видимости вашего приложение. Это может легко привести к проблемам с безопасностью, поскольку ваше приложение не сможет эффективно определить откуда пришли данные.

Например : $_GET[‘foo’] будет доступна через $foo , которая может заместить переменную, которая не была объявлена. Если вы используете PHP register_globals off (выключена).

Сообщения об ошибках

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

Разработка

Для того, чтобы видеть все возможные ошибки во время разработки, настройте следующие параметры в вашем php.ini :

Установка значения в -1 покажет каждую возможную ошибку, даже если новые уровни и константы будут добавлены в новых версиях PHP. Константа E_ALL ведёт себя так-же в PHP 5.4. — php.net

Константа уровня ошибок E_STRICT была введена в 5.3.0 и не является частью E_ALL , как бы то ни было, она стала частью E_ALL в 5.4.0 Что это значит? Для вывода всех возможных ошибок в версии 5.3 вам нужно использовать либо -1 либо E_ALL | E_STRICT .

Вывод всех ошибок разными версиями PHP

  • -1 or E_ALL
  • 5.3 -1 or E_ALL | E_STRICT
  • > 5.3 -1 or E_ALL

Продакшн

Чтобы спрятать все ошибки вашей среды во время продакшна, настройте ваш php.ini следующим образом:

С этими настройками в продакшне, ошибки всё также будут записываться в лог ошибок веб сервера, но не будут показаны пользователю. Для подробной информации об этих настройках, смотрите руководство PHP:

Тестирование

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

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

Тесто-ориентированная разработка

Разработка через тестирование (TDD) представляет собой процесс разработки программного обеспечения, который опирается на повторении очень короткого цикла разработки: сперва, разработчик пишет автоматизированные тесты, которые определяют желаемое улучшение или новую функцию, далее производит код, который успешно пройдет этот тест и наконец производит рефактор кода для соответствия стандартам. Kent Beck, человек которому приписывают статус разработчика или “переоткрывателя” техники, TDD предлагает простую конструкцию, а также вселяет уверенность.

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

Модульное тестирование (Unit Testing)

Модульное тестирование — это подход к программированию, который позволяет удостовериться, что функции, классы и методы работают, как ожидается с момента начала и до конца разработки. Проверяя значения, которые приходят и выходят из различных функций и методов, вы можете быть уверены, что внутренняя логика работает правильно. Используя Внедрение Зависимостей и внедрение классов «макетов» и заглушек, вы можете убедиться, что зависимости используются правильно для большего покрытия тестами.

При создании класса или функции, вы должны создать модульный тест для каждого возможного поведения. На базовом уровне, вы должны убедиться, что ваш код выдаёт ошибку, если вы отсылаете неправильные аргументы и работает, если вы отсылаете правильные аргументы, соответственно. Это поможет убедиться в том, что изменения, которые вы сделаете относительно этого класса или функции позднее не помешают старым работать как ожидалось. Единственная альтернатива этому var_dump() в test.php, который не является способом создания приложений — больших или маленьких.

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

PHPUnit является фреймворком тестирования стандарта де-факто для написания модульных тестов в PHP приложениях, но также существует несколько альтернатив.

Интеграционное тестирование

Интеграционное тестирование (иногда называется Интеграция и Тестирование, с аббревиатурой “I&T”) это фаза в тестирование програмнного обеспечения, в котором отдельные модули, комбинируются и тестируются, как группа. Это происходит после модульного тестирования и перед валидационным тестированием. Integration testing takes as its input modules that have been unit tested, groups them in larger aggregates, applies tests defined in an integration test plan to those aggregates, and delivers as its output the integrated system ready for system testing.

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

Функциональное тестирование

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

Инструменты функционального тестирование

  • Selenium
  • Mink
  • Codeception это фреймворк для тестирования (всё-в-одном), включающий инструменты подтверждающего тестирования

Поведенческо-ориентированная разработка

Существует две разновидности Поведенческо-ориентированной разработки (BDD): SpecBDD и StoryBDD. SpecBDD концентрируется на техническом поведении или коде, в то время как StoryBDD концентрируется на деле, будущем поведении или взаимодействии. PHP имеет фреймворки для обоих типов BDD.

Используя StoryBDD, вы пишите читаемые людьми истории, которые объясняют поведение вашего приложения. Эти истории могут быть запущены, как актуальные тесты для вашего приложения. Фреймворк, используемый в PHP приложениях для StoryBDD — Behat, который вдохновлён проектом для Ruby Cucumber и реализует Gherkin DSL для объяснения особенностей поведения.

Вместе со SpecBDD, вы пишите спецификацию, которая объясняет, как ваш код должен себя вести. Вместо тестирования функции или метода, вы объясняете, как эта функция или метод должен себя вести. PHP предлагает фреймворк PHPSpec для данных целей. Этот фреймворк вдохновлён проектом RSpec для Ruby.

Инструменты

  • Behat, StoryBDD фреймворк для PHP, вдохновлённый проектом для Ruby Cucumber;
  • PHPSpec, SpecBDD фреймворк для PHP, вдохновлённый проектом для Ruby RSpec;
  • Codeception это фреймворк для тестирования (всё-в-одном), использующий принципы BDD;

Дополнительные инструменты тестирования

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

Инструменты

  • Selenium автоматизационный инструмент для браузера интегрируемый с PHPUnit
  • Mockery Mock Object Framework интегрируемый с PHPUnit или PHPSpec

Сервера и развертывание

PHP приложения могут быть развернуты и запущены на продакшн веб-сервере рядом способов.

Платформа, как сервис (PaaS)

PaaS предоставляет системную и сетевую архитектуры, необходимые для запуска PHP приложений в веб. Это означает, как минимум, отсутствие настройки для запуска PHP приложений или PHP фреймворков.

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

Виртуальный или выделенный сервер

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

nginx и PHP-FPM

PHP, через встроенный в него менеджер процессов FastCGI (FPM), очень хорошо сочетается с nginx, который является легковесным и высокопроизводительным веб-сервером. Он использует меньше памяти, чем Apache и может лучше обрабатывать конкурентные запросы. Это особенно важно на виртуальном сервере, для которого может быть критичен объем используемой памяти.

Apache и PHP

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

Apache имеет несколько возможных конфигураций для запуска PHP. Самая популярная и лёгкая для установки prefork MPM вместе с mod_php5. Хотя это не самое эффективное в отношении памяти решение, оно очень просто для установки и использования. Наверное, это лучшее решение, если вы не хотите углубляться в серверное администратирование. Если вы хотите использовать mod_php5, вы обязаны использовать prefork MPM.

Если вы хотите получить больше производительности и стабильности с Apache, тогда вы можете взглянуть на ту же FPM систему, как в nginx и запустить worker MPM или event MPM, используя mod_fastcgi или mod_fcgid. Эта конфигурация позволит получить существенную экономию в памяти и будет намного быстрее, но потребует больше работы для установки.

Виртуальный хостинг

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

Построение и развёртывание вашего приложения

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

Среди задач, которые вы, возможно, захотите автоматизировать:

  • Управление зависимостями
  • Компиляция, минификация файлов (assets)
  • Запуск тестов
  • Создание документации
  • Запаковка
  • Развёртывание

Создание инструментов автоматизации

Инструменты построения — коллекция скриптов, которые обрабатывают общие задачи развёртки приложений. Инструменты постройки не являются частью вашего приложения, они взаимодействуют с вашим приложением «извне».

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

Phing самый простой путь, чтобы начать автоматическую развёртку в мире PHP. С Phing вы можете контролировать ваш процесс запаковки, развёртки или тестирования с помощью простого построечного XML файла. Phing (который базируется на Apache Ant) предоставляет богатый набор задач, часто необходимых для установки или обновления веб приложения, и может быть расширен дополнительными нестандартными задачами, написанными на PHP.

Capistrano — система для начинающих-профессиональных разработчиков для исполнения команд в структуризованном, воспроизводимом пути на одной или многих удалённых машинах. Предварительно он настроен для развёртки приложений Ruby on Rails. Как бы то ни было люди успешно развёртывают и PHP приложения с ним. Успех использования Capistrano зависит на умении работы с Ruby и Rake.

Сообщение в блоге Dave Gardner PHP Deployment with Capistrano является хорошей отправной точкой для PHP разработчиков, заинтересованных в Capistrano.

Chef является нечто большим, чем просто фрэймворк развёртки. Это очень мощный интеграционный фрэймворк, основанный на Ruby, который не просто развёртывает ваше приложение, но и может построить всё серверное окружение или виртуальный сервер.

Ресурсы о Chef для PHP разработчиков:

Для дальнейшего изучения:

Непрерывная интеграция

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

Существуют разные пути, для осуществления непрерывной интеграции для PHP. Недавно Travis CI закончил великолепную работу по созданию непрерывной интеграции, реально даже для маленьких проектов. Travis CI — сервис непрерывной интеграции для сообщества с открытым исходным кодом. Оно интегрируется с GitHub и предлагает первоклассную поддержку для многих языков, включая PHP.

Для дальнейшего изучения:

Кэширование

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

Кэширование байткода

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

И тут настает время кэширования байткода. Оно предотвращает избыточные компиляции, сохраняя в памяти байткод и переиспользуя его в последовательных вызовах. Установка подобного кэширования — вопрос пары минут, а скорость вашего приложения поднимется существенно. Поэтому нет причин не использовать кэширование.

Начиная с PHP 5.5 появилось встроенное расширение для кэширования байткод — OPcache. Оно также доступно в виде отдельного расширения для ранних версий.

Популярные системы подобного кэширования:

  • APC (PHP 5.4 и более ранние)
  • XCache
  • Zend Optimizer+ (часть Zend Server)
  • WinCache (расширение для MS Windows Server)

Кэширование объектов

Бывают моменты, когда вам необходимо кэшировать определённые объекты в вашем коде, такие как данные, которые неразумно получать ещё раз из базы данных, когда результат вряд ли изменится. Вы можете использовать ПО для кэширования чтобы сохранить эти кусочки данных в памяти, что позволит чрезвычайно быстро обратиться к ним позже. Если вы сохраните эти объекты в хранилище данных и после получите их и выдадите напрямую из кэша для некоторых запросов, вы можете получить существенное улучшение производительности и уменьшение нагрузки на сервер базы данных.

Множество популярных решений для кэширования байткода также дают вам кэшировать данные, поэтому нет причин, чтобы не воспользоваться ими. APC, XCache и WinCache предоставляют API для сохранения данных из вашего PHP кода в свой кэш в памяти.

Самыми популярными системами кэширования объектов являются APC и memcached. APC — идеальный выбор для кэширования объектов, он включает простой API для добавления данных в кэш память и при этом очень просто устанавливается и используется. Единственное существующее ограничение APC состоит в том, что он привязан к серверу на котором установлен. Memcached, напротив, устанавливается как отдельный сервис, и к нему можно получить доступ по сети, что позволяет хранить объекты в очень быстром централизованном хранилище данных и множество других систем могут получать эти данные из него.

Учтите, если PHP запущен как (Fast-)CGI приложение внутри вашего веб-сервера, то каждый PHP процесс будет иметь собственный кэш, например, APC данные не будут расшарены между вашими процессами. В этом случае имеет смысл подумать об использовании вместо него memcached, так как он не ограничен процессом PHP.

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

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

Подробнее о популярных системах кэширования объектов:

Практическая работа №16 [Работа со строками. Работа с файловой системой. Взаимодействие PHP и MySQL]

Цель: Научиться работать со строками и файловой системой в PHP . Практически, реализовать взаимодействие PHP и MySQL.

иметь практический опыт:

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

уметь:

  • использовать технологии построения и эксплуатации распределенных информационных систем;
  • использовать язык PHP при написании WEB -страниц;

знать:

  • принципы построения распределенных систем обработки информации;
  • средства создания серверного и клиентского программного обеспечения;
  • принципы построения и методы работы в распределенных системах обработки информации;
  1. Теоретическая часть

MySQL – это одна из самых популярных и самых распространенных СУБД (система управления базами данных) в интернете. Она не предназначена для работы с большими объемами информации, но ее применение идеально для интернет сайтов, как небольших, так и достаточно крупных.

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

Немаловажным фактором является ее бесплатность. MySQL распространяется на условиях общей лицензии GNU (GPL, GNU Public License).

Ранее для долговременного хранения информации мы работали с файлами: помещали в них некоторое количество строчек, а затем извлекали их для последующей работы. Задача длительного хранения информации очень часто встречается в программировании Web-приложений: подсчёт посетителей в счётчике, хранение сообщений в форуме, удалённое управление содержанием информации на сайте и т.д.

Между тем, профессиональные приёмы работы с файлами очень трудоёмки: необходимо заботится о помещении в них информации, о её сортировке, извлечении, при этом не нужно забывать, что все эти действия будут происходить на сервере хост-провайдера, где с очень большой вероятностью стоит один из вариантов Unix — следовательно, нужно так же заботится о правах доступа к файлам и их размещении. При этом объём кода значительно возрастает, и совершить ошибку в программе очень просто.

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

Приложение на РНР, использующее для хранения информации базу данных (в частности MySql) всегда работает быстрее приложения, построенного на файлах. Дело в том, что базы данных написаны на языке C++, и написать на PHP программу, которая работала бы с жёстким диском эффективнее базы данных — задача неразрешимая по определению, поскольку программы на PHP в принципе работают медленнее, чем программы на C++, так как РНР — интерпретатор, а С++ — компилятор.

Таким образом, основное достоинство базы данных заключается в том, что она берёт на себя всю работу с жёстким диском и делает это очень эффективно.

Реляционные базы данных

Задача длительного хранения и обработки информации появилась практически сразу с появлением первых компьютеров. Для решения этой задачи в конце 60-х годов были разработаны специализированные программы, получившие название систем управления базами данных (СУБД). СУБД проделали длительный путь эволюции от системы управления файлами, через иерархические и сетевые базы данных. В конце 80-х годов доминирующей стала система управления реляционными базами данных (СУРБД). С этого времени такие СУБД стали стандартом де-факто, и для того, чтобы унифицировать работу с ними, был разработан структурированный язык запросов (SQL), который представляет собой язык управления именно реляционными базами данных.

Существуют следующие разновидности баз данных:

  • иерархические;
  • реляционные;
  • объектно-ориентированные;
  • гибридные.

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

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

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

Гибридные СУБД совмещают в себе возможности реляционных и объектно-ориентированных баз данных.

Практическая часть

Часть 1

PHP, как и большинство языков программирования, имеет функции для работы с файлами. Эти функции можно условно разделить на 2 группы. В первую попадают функции управления файлами и каталогами (копирование, перемещение, создание и т.д.). Ко второй группе относятся функции для работы с содержимым файлов.

Под управлением файлами и каталогами в PHP подразумеваются такие операции как:

  • Создание/удаление
  • Копирование/перемещение
  • Переименование
  • Изменение аттрибутов
  • Чтение содержимого каталога

Копирование файлов производится с помощью функции copy(). Функция имеет всего 2 параметра — имя исходного файла и имя конечного файла. Функция возвращает TRUE, если копирование прошло успешно, и FALSE если произошла ошибка. Если конечный файл уже существует — он будет перезаписан и функция вернёт TRUE. При использовании copy() на Windows-платформе есть особенность: если скопировать файл нулевого размера, то файл успешно скопируется, но copy() вернёт FALSE.

Пример копирования файла:

$source = ‘readme.txt’;


$dest = ‘readme_copy.txt’;

if(!copy($source, $dest)) <

echo « Ошибка копирования файла $source.
\n»;

Обратите внимание на конструкцию «
\n» в конце строки с ошибкой. Этот простой приём позволяет получать читаемый вид выводимого текста независимо от того куда текст выводится — в консоль отладчика или в браузер. Очень удобно на этапе отладки скрипта.

Более сложный процесс — перемещение файла. Для выполнения перемещения служит функция rename(). Как и предыдущая функция, rename() принимает всего 2 агрумента — старое и новое имя файла. Если пути старого и нового файлов одинаковые — файл просто переименуется, а если разные — будет перемещен, но повому пути и переименован.

Пример переменования и перемещения файла:

$number = 123;

$source = ‘readme.txt’;

$dest = «./backups/readme_$number.txt»;

if(!rename($source, $dest)) <

echo « Ошибка перемещения файла $source.
\n»;

В этом примере исходный файл readme.txt перемещается в подкаталог backups и переименовывается в readme_123.txt.

Удалить существующий файл можно с помощью функции unlink(). Файловая система Unix позволяет создавать жесткие ссылки на существуюие файлы. Ссылка похожа на ярлыки Windows, но в Unix нельзя удалить исходный файл, пока на него есть жесткие ссылки. Функция unlink() удаляет вашу ссылку на файл, а если ссылок больше нет — удаляет его.

$file = «./backups/readme_123.txt»;

if(!unlink($file)) <

echo «Ошибка удаления файла $file.
\n»;

Для удаления каталогов служит другая функция — rmdir(). Она принимает единственный параметр — имя каталога, который нужно удалить. Удаляемый каталог должен быть пуст, иначе операция завершится с ошибкой. Если каталог успешно удалён — функция вернёт TRUE, в противном случае — FALSE.

$directory = «./backups»;

if(!rmdir($directory)) <

echo «Ошибка удаления каталога $directory.
\n»;

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

Для создания каталога в PHP применяется функция mkdir(). Функция получает 1 параметр — имя создаваемого каталога. Если каталог успешно создан — функция вернёт TRUE, а при ошибке — FALSE.

$directory = «./backups»;

if(!mkdir($directory)) <

echo «Ошибка создания каталога $directory.
\n»;

Поиск файлов и каталогов

Для поиска файлов в каталогах сервера используется несколько функций: glob(), fnmatch() и функции работы с каталогами (opendir(), readdir(), rewinddir(), closedir()).

Функция opendir() открывает указанный каталог и устанавливает внутренний указатель на первый файл. Функция возвращает так называемый «handle» (читается «хэндл») или «указатель». Этот указатель передаётся всем последующим функциям при работе с данным каталогом.

Функция readdir() возвращает имя текущего файла в каталоге и перемещает внутренний указатель на следующий файл. Если последний файл уже был прочитан — функция вернёт FALSE. Функция rewinddir() сбрасывает внутренний указатель на первый файл в каталоге.

Функция closedir() закрывает ранее открытый каталог и освобождает всеи используемые ресурсы.

Функция fnmatch($pattern, $filename) проверяет, соответствует ли имя файла $filename маске $pattern.

Пример поиска файла по шаблону:

$dir = «./backups/»;

// проверяем, что $dir — каталог

if (is_dir($dir)) <

// открываем каталог

if ($dh = opendir($dir)) <

// читаем и выводим все элементы

// от первого до последнего

while (($file = readdir($dh)) !== false) <

if(fnmatch(‘myfile_*.txt’, $file))

echo ‘ Резервная копия : ‘;

echo «$file : » .

filetype($dir . $file) . «
\n»;

// закрываем каталог

closedir($dh);

Функция glob($pattern) возвращает массив файлов и каталогов, соответствующих маске $pattern. Если произошла ошибка или ничего не найдено — функция вернёт FALSE.

foreach (glob(«./backups/*.txt») as $filename) <

echo «$filename : » . filesize($filename) . « байт \n»;

Часть 2

SQL может применяться в прикладных программах двумя способами: в виде встроенного SQL и интерфейса программирования приложений (Application Program Interface, API). Первый способ напоминает использование PHP — инструкции SQL размещаются среди кода прикладной программы. В настоящий момент такой стиль не поддерживает ни MySQL ни PHP. Второй подход заключается в том, что программа взаимодействует с СУБД посредством совокупности функций. Именно такой подход используется при взаимодействии PHP и MySQL.

mysql_connect

resource mysql_connect ([string server [, string username [, string password]]])

Эта функция устанавливает соединение с сервером server MySQL и возвращает дескриптор соединения с базой данных, по которому все другие функции, принимающие этот дескриптор в качестве аргумента, будут однозначно определять выбранную базу данных. Вторым и третьим аргументами этой функции являются имя пользователя username и его пароль password соответственно:

$dblocation = «localhost»; // Имя сервера

$dbuser = «root»; // Имя пользователя

$dbpasswd = «»; // Пароль

$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);

if (!$dbcnx) // Если дескриптор равен 0 соединение не установлено

В настоящий момент сервер базы данных не доступен, поэтому

корректное отображение страницы невозможно.

Переменные $dblocation , $dbuser и $dbpasswd хранят имя сервера, имя пользователя и пароль, и, как правило, прописываются в отдельном файле (к примеру, config.php), который потом вставляется в каждый PHP-файл, в котором имеется код для работы с MySQL:

$dblocation = «localhost»;

$dbname = «forum»;

$dbuser = «root»;

$dbpasswd = «»;

mysql_close

bool mysql_close ([resource link_identifier])

Эта функция разрывает соединение с сервером MySQL, и возвращает true при успешном выполнении операции и false в противном случае. Функция принимает в качестве аргумента дескриптор соединения с базой данных, возвращаемый функцией mysql_connect .

// устанавливаем соединение с базой данных

$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);

if (!$dbcnx)

echo («

В настоящий момент сервер базы данных не доступен, поэтому

корректное отображение страницы невозможно.

// Завершаем работу в случае неудачи

if( mysql_close($dbcnx)) // разрываем соединение

echo(«Соединение с базой данных прекращено»);

echo(«Не удалось завершить соединение»);

mysql_select_db

bool mysql_select_db (string database_name [, resource link_identifier])

Использование этой функции эквивалентно вызову команды USE в SQL-запросе, т. е. функция mysql_select_db выбирает базу данных для дальнейшей работы, и все последующие SQL-запросы применяются к выбранной базе данных. Функция принимает в качестве аргументов название выбираемой базы данных database_name и дескриптор соединения resource. Функция возвращает true при успешном выполнении операции и false в противном случае. К примеру:

// Код соединения с базой данных

if (!@mysql_select_db($dbname, $dbcnx))

В настоящий момент база данных не доступна, поэтому

корректное отображение страницы невозможно.

Имеет смысл помещать функции для соединения и выбора базы данных в тот же файл (config.php), где объявлены переменные с именами сервера, пользователя и паролем:

$dblocation = «localhost»;

$dbname = «softtime»;

$dbuser = «root»;

$dbpasswd = «»;

$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);

В настоящий момент сервер базы данных не доступен, поэтому

корректное отображение страницы невозможно.

if (!@mysql_select_db($dbname, $dbcnx))

В настоящий момент база данных не доступна, поэтому

корректное отображение страницы невозможно.

mysql_query

resource mysql_query (string query)

Эта функция применяется для отправки серверу SQL-запросов. Функция возвращает дескриптор запроса в случае успеха и false в случае неудачного выполнения запроса. В листинге 13.32 показан код, с помощью которого извлекается одна строка из таблицы authors базы данных forum .

Результат выполнения показан на следующем рисунке:

array mysql_fetch_array (resource result)

Эта функция возвращает значения полей в виде ассоциативного массива, в качестве аргумента принимает дескриптор запроса возвращаемый функцией mysql_query . Вот как с помощью этой функции можно вывести все строки таблицы authors :

include «config.php»;

$ath = mysql_query(«select * from authors;»);

if( $ath)

// Определяем таблицу и заголовок

echo » имя пароль

e-mail url

«;

// Так как запрос возвращает несколько строк, применяем цикл

while( $author = mysql_fetch_array($ath))

echo »

«.$author[‘name’].» «.$author[‘passw’].»

&nbsp «.$author[’email’].» «.

$author[‘url’].»

«;

echo «

«;

Результат показан на следующем рисунке:

mixed mysql_result (resource result, int row)

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

include «config.php»;

$ath = mysql_query(«select name from authors;»);

if( $ath)

mysql_fetch_object

object mysql_fetch_object (resource result)

Эта функция возвращает поля записи данных в виде объекта. Ниже приведен пример, в котором с помощью этой функции из таблицы authors выводятся имя, URL и e-mail авторов.

include «config.php»;

$ath = mysql_query(«select * from authors;»);

if( $ath)

while($row = mysql_fetch_object($ath))

name: «.$row->name.»

url: «.$row->url.»

email: «.$row->email.»

Error: «.mysql_error()

Результат выполнения показан на следующем рисунке:

array mysql_fetch_row (resource result)

В отличие от функции mysql_fetch_object , эта функция возвращает не объект, а массив, в котором содержатся значения полей:

include «config.php»;

$ath = mysql_query(«select * from authors;»);

if( $ath)

while($row = mysql_fetch_row($ath))

name: «.$row[1].»

url: «.$row[4].»

email: «.$row[3].»

Error: «.mysql_error()

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

Задание: Реализовать все примеры, приведённые в практической части, ответить на контрольные вопросы, выполнить отчёт.

Контрольные вопросы:

  1. Назовите функции для работы с файлами в PHP .
  2. Назовите операции, осуществляемые под управлением файлами и каталогами в PHP7
  3. Перечислите способы применения SQL в прикладных программах?

Работа с файловой системой

Создание файла

Функция fopen

Вообще говоря, в PHP не существует функции, предназначенной именно для создания файлов. Большинство функций работают с уже существующими файлами в файловой системе сервера. Есть несколько функций, которые позволяют создавать временные файлы, или, что то же самое, файлы с уникальным для текущей директории именем. А вот для того, чтобы создать самый обычный файл, нужно воспользоваться функцией, которая открывает локальный или удаленный файл. Называется эта функция fopen () . Что значит «открывает файл»? Это значит, что fopen связывает данный файл с потоком управления программы. Причем связывание бывает различным в зависимости от того, что мы хотим делать с этим файлом: читать его, записывать в него данные или делать и то и другое. Синтаксис этой функции такой:

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

Параметр имя_файла должен быть строкой, содержащей правильное локальное имя файла или URL-адрес файла в сети. Если имя файла начинается с указания протокола доступа (например, http://. или ftp://. ), то интерпретатор считает это имя адресом URL и ищет обработчик указанного в URL протокола. Если обработчик найден, то PHP проверяет, разрешено ли работать с объектами URL как с обычными файлами (директива allow_url_fopen ). Если allow_url_fopen=off , то функция fopen вызывает ошибку и генерируется предупреждение. Если имя файла не начинается с протокола, то считается, что указано имя локального файла. Чтобы открыть локальный файл, нужно, чтобы PHP имел соответствующие права доступа к этому файлу.

Параметр use_include_path , установленный в значение 1 или TRUE, заставляет интерпретатор искать указанный в fopen () файл в include_path . Напомним, что include_path — это директива из файла настроек PHP, задающая список директорий, в которых могут находиться файлы для включения. Кроме функции fopen () она используется функциями include() и require() .

Параметр тип_доступа может принимать одно из следующих значений (см. таб. 9.1).

Итак, чтобы создать файл, нужно, как бы нелепо это ни звучало, открыть несуществующий файл на запись.

Создавая файл, нужно учитывать, под какой операционной системой вы работаете, и под какой ОС предположительно этот файл будет читаться. Дело в том, что разные операционные системы по-разному отмечают конец строки. В Unix-подобных ОС конец строки обозначается \n , в системах типа Windows — \r\n . Windows предлагает специальный флаг t для перевода символов конца строки систем типа Unix в свои символы конца строки . В противоположность этому существует флаг b , используемый чаще всего для бинарных файлов , благодаря которому такой трансляции не происходит. Использовать эти флаги можно, просто дописав их после последнего символа выбранного типа доступа к файлу. Например, открывая файл на чтение, вместо r следует использовать rt , чтобы перекодировать все символы конца строки в \r\n . Если не использовать флаг b при открытии бинарных файлов , то могут появляться ошибки, связанные с изменением содержимого файла. Из соображений переносимости программы на различные платформы рекомендуется всегда использовать флаг b при открытии файлов с помощью fopen () .

Таблица 9.1. Значения принимаемые параметром тип доступа
Тип доступа Описание
r Открывает файл только для чтения; устанавливает указатель позиции в файле на начало файла.
r+ Открывает файл для чтения и записи; устанавливает указатель файла на его начало.
w Открывает файл только для записи; устанавливает указатель файла на его начало и усекает файл до нулевой длины. Если файл не существует, то пытается создать его.
w+ Открывает файл для чтения и записи; устанавливает указатель файла на его начало и усекает файл до нулевой длины. Если файл не существует, то пытается создать его.
a Открывает файл только для записи; устанавливает указатель файла в его конец. Если файл не существует, то пытается создать его.
a+ Открывает файл для чтения и записи; устанавливает указатель файла в его конец. Если файл не существует, то пытается создать его.
x Создает и открывает файл только для записи; помещает указатель файла на его начало. Если файл уже существует, то fopen () возвращает false и генерируется предупреждение. Если файл не существует, то делается попытка создать его. Этот тип доступа поддерживается начиная с версии PHP 4.3.2 и работает только с локальными файлами.
x+ Создает и открывает файл для чтения и записи; помещает указатель файла на его начало. Если файл уже существует, то fopen () возвращает false и генерируется предупреждение. Если файл не существует, то делается попытка создать его. Этот тип доступа поддерживается, начиная с версии PHP 4.3.2, и работает только с локальными файлами.

Что происходит, если открыть или создать файл с помощью fopen не удается? В этом случае PHP генерирует предупреждение, а функция fopen возвращает как результат своей работы значение false . Такого рода предупреждения можно «подавить» (запретить) с помощью символа @ .

Например, такая команда не выведет предупреждения, даже если открыть файл не удалось:

Таким образом, функция fopen () позволяет создать только лишь пустой файл и сделать его доступным для записи . Как же записать данные в этот файл? Как прочитать данные из уже существующего файла?

Прежде чем ответить на эти вопросы, рассмотрим, как закрыть установленное с помощью fopen () соединение.

Функции файловой системы


Описание родственных функций вы сможете найти в разделах Каталоги и Выполнение программ.

За списком оберток URL для работы с удаленными файлами и пояснениями обращайтесь к главе Поддерживаемые протоколы и обертки.

Содержание

  • basename — Возвращает последний компонент имени из указанного пути
  • chgrp — Изменяет группу файла
  • chmod — Изменяет режим доступа к файлу
  • chown — Изменяет владельца файла
  • clearstatcache — Очищает кеш состояния файлов
  • copy — Копирует файл
  • delete — См. описание функции unlink или unset
  • dirname — Возвращает имя родительского каталога из указанного пути
  • disk_free_space — Возвращает размер доступного пространства в каталоге или файловой системе
  • disk_total_space — Возвращает общий размер файловой системы или раздела диска
  • diskfreespace — Псевдоним disk_free_space
  • fclose — Закрывает открытый дескриптор файла
  • feof — Проверяет, достигнут ли конец файла
  • fflush — Сбрасывает буфер вывода в файл
  • fgetc — Считывает символ из файла
  • fgetcsv — Читает строку из файла и производит разбор данных CSV
  • fgets — Читает строку из файла
  • fgetss — Читает строку из файла и удаляет HTML-теги
  • file_exists — Проверяет существование указанного файла или каталога
  • file_get_contents — Читает содержимое файла в строку
  • file_put_contents — Пишет данные в файл
  • file — Читает содержимое файла и помещает его в массив
  • fileatime — Возвращает время последнего доступа к файлу
  • filectime — Возвращает время изменения индексного дескриптора файла
  • filegroup — Получает идентификатор группы файла
  • fileinode — Возвращает индексный дескриптор файла
  • filemtime — Возвращает время последнего изменения файла
  • fileowner — Возвращает идентификатор владельца файла
  • fileperms — Возвращает информацию о правах на файл
  • filesize — Возвращает размер файла
  • filetype — Возвращает тип файла
  • flock — Портируемая консультативная блокировка файлов
  • fnmatch — Проверяет совпадение имени файла с шаблоном
  • fopen — Открывает файл или URL
  • fpassthru — Выводит все оставшиеся данные из файлового указателя
  • fputcsv — Форматирует строку в виде CSV и записывает её в файловый указатель
  • fputs — Псевдоним fwrite
  • fread — Бинарно-безопасное чтение файла
  • fscanf — Обрабатывает данные из файла в соответствии с форматом
  • fseek — Устанавливает смещение в файловом указателе
  • fstat — Получает информацию о файле, используя открытый файловый указатель
  • ftell — Возвращает текущую позицию указателя чтения/записи файла
  • ftruncate — Урезает файл до указанной длины
  • fwrite — Бинарно-безопасная запись в файл
  • glob — Находит файловые пути, совпадающие с шаблоном
  • is_dir — Определяет, является ли имя файла директорией
  • is_executable — Определяет, является ли файл исполняемым
  • is_file — Определяет, является ли файл обычным файлом
  • is_link — Определяет, является ли файл символической ссылкой
  • is_readable — Определяет существование файла и доступен ли он для чтения
  • is_uploaded_file — Определяет, был ли файл загружен при помощи HTTP POST
  • is_writable — Определяет, доступен ли файл для записи
  • is_writeable — Псевдоним is_writable
  • lchgrp — Изменяет группу, которой принадлежит символическая ссылка
  • lchown — Изменяет владельца символической ссылки
  • link — Создаёт жёсткую ссылку
  • linkinfo — Возвращает информацию о ссылке
  • lstat — Возвращает информацию о файле или символической ссылке
  • mkdir — Создаёт директорию
  • move_uploaded_file — Перемещает загруженный файл в новое место
  • parse_ini_file — Обрабатывает конфигурационный файл
  • parse_ini_string — Разбирает строку конфигурации
  • pathinfo — Возвращает информацию о пути к файлу
  • pclose — Закрывает файловый указатель процесса
  • popen — Открывает файловый указатель процесса
  • readfile — Выводит файл
  • readlink — Возвращает файл, на который указывает символическая ссылка
  • realpath_cache_get — Получает записи из кеша realpath
  • realpath_cache_size — Получает размер кеша realpath
  • realpath — Возвращает канонизированный абсолютный путь к файлу
  • rename — Переименовывает файл или директорию
  • rewind — Сбрасывает курсор файлового указателя
  • rmdir — Удаляет директорию
  • set_file_buffer — Псевдоним stream_set_write_buffer
  • stat — Возвращает информацию о файле
  • symlink — Создаёт символическую ссылку
  • tempnam — Создаёт файл с уникальным именем
  • tmpfile — Создаёт временный файл
  • touch — Устанавливает время доступа и модификации файла
  • umask — Изменяет текущую umask
  • unlink — Удаляет файл

User Contributed Notes 8 notes

I made this function to search and/or display files by extension or for a string occurance in the filename. Any comments or enhancements are welcome offcourse. I’ll update this function soon.

usage: list_files([string], [string], [int 1 | 0], [int 1 | 0]);

search for extension: list_files([string], [string], [0], [int 1 | 0]);
returns array: $myArray = list_files([string], [string], [0], [0]);
echo result: list_files([string], [string], [0], [1]);

search for string occurance: list_files([string], [string], [1], [int 1 | 0]);
returns array: $myArray = list_files([string], [string], [1], [0]);
echo result: list_files([string], [string], [1], [1]);

function list_files ( $directory , $stringSearch , $searchHandler , $outputHandler ) <
$errorHandler = false ;
$result = array();
if (! $directoryHandler = @ opendir ( $directory )) <
echo ( «\n» );
return $errorHandler = true ;
>
if ( $searchHandler === 0 ) <
while ( false !== ( $fileName = @ readdir ( $directoryHandler ))) <
if(@ substr ( $fileName , — @ strlen ( $stringSearch )) === $stringSearch ) <
@ array_push ( $result , $fileName );
>
>
>
if ( $searchHandler === 1 ) <
while( false !== ( $fileName = @ readdir ( $directoryHandler ))) <
if(@ substr_count ( $fileName , $stringSearch ) > 0 ) <
@ array_push ( $result , $fileName );
>
>
>
if (( $errorHandler === true ) && (@ count ( $result ) === 0 )) <
echo ( «\n» );
>
else <
sort ( $result );
if ( $outputHandler === 0 ) <
return $result ;
>
if ( $outputHandler === 1 ) <
echo ( «\n» );
>
>
>

You have an array of directories (straightforward list of directories):

= array(
‘/home/drapeko/var’ ,
‘/home/drapeko/var/y’ ,
‘/home/drapeko’ ,
‘/home’ ,
‘/var/libexec’
);
);
?>

And you would like to transform this array to hierarchy of directories:

= array (
‘home’ => array (
‘drapeko’ => array (
‘var’ => array (
‘y’ => array()
)
)
),
‘var’ => array(
‘libexec’ => array()
)
);
?>

How can you do it?

First of all the below function will help us.

/**
* This function converts real filesystem path to the string array representation.
*
* for example,
* ‘/home/drapeko/var/y will be converted to $result_array[‘home’][‘drapeko’][‘var’][‘y’]
* ‘/home/drapeko/var/y/file.txt will be converted to $result_array[‘home’][‘drapeko’][‘var’][‘y’]
*
* @param $path realpath of the directory
* @return string string array representation of the path
*/
function pathToArrayStr ( $path ) <
// TODO constants/configs?
$res_path = str_replace (array( ‘:/’ , ‘:\\’ , ‘/’ , ‘\\’ , DIRECTORY_SEPARATOR ), ‘/’ , $path );
// if the first or last symbol is ‘/’ delete it (e.g. for linux)
$res_path = preg_replace (array( «/^\//» , «/\/$/» ), » , $res_path );
// create string
$res_path = ‘[\» . str_replace ( ‘/’ , ‘\’][\» , $res_path ). ‘\’]’ ;

return $res_path ;
>
?>

It simply converts the real path of the file to array string representation.

How can you use this function? I know it looks like a little confusing. But it’s quite simple. Consider the example below:

= array();
$check = array();
foreach( $array as $val ) <
$str = pathToArrayStr ( $val , ‘result’ );
foreach( $check as $ck ) <
if ( strpos ( $ck , $str ) !== false ) <
continue 2 ;
>
>
$check [] = $str ;
eval( ‘$result’ . $str . ‘ = array();’ );
>
print_r ( $result );
?>

Heh, how do you find it? This approach has helped me very much. I hope you will find it useful. :)

This function searches a directory and returns an array of all files whose filename matches the specified regular expression. It’s similar in concept to the Unix find program.

function findfile($location=»,$fileregex=») <
if (!$location or !is_dir($location) or !$fileregex) <
return false;
>

$all = opendir($location);
while ($file = readdir($all)) <
if (is_dir($location.’/’.$file) and $file <> «..» and $file <> «.») <
$subdir_matches = findfile($location.’/’.$file,$fileregex);
$matchedfiles = array_merge($matchedfiles,$subdir_matches);
unset($file);
>
elseif (!is_dir($location.’/’.$file)) <
if (preg_match($fileregex,$file)) <
array_push($matchedfiles,$location.’/’.$file);
>
>
>
closedir($all);
unset($all);
return $matchedfiles;
>

This is a function I use to determine if a file contains Binary information. I use this for my search engine so that it doesn’t try to index files like .zip or .mp3 or any other file that doesn’t contain readable information. It makes use of the Character Type Extension if it’s loaded, if it’s not then it uses Regular Expressions.

function is_binary($link)
<
$tmpStr = »;
@$fp = fopen($link, ‘rb’);
@$tmpStr = fread($fp, 256);
@fclose($fp);

if($tmpStr != »)
<
$tmpStr = str_replace(chr(10), », $tmpStr);
$tmpStr = str_replace(chr(13), », $tmpStr);

Pollard@php.net contributed this in response to a question on setting these variables .
This option *IS* settable within your PHP scripts.
Example:

( ‘auto_detect_line_endings’ , true );
$contents = file ( ‘unknowntype.txt’ );

ini_set ( ‘auto_detect_line_endings’ , false );
$content2 = file ( ‘unixfile.txt’ );
?>

Note, with PHP 4.3 anytime Mac files are read using fgets or file you’ll need to auto_detect_line_endings since \n is otherwise assumed. However, with PHP 5.0, stream_get_line() will allow you to specify what line ending character to read up to.

\\ Read a line from a MAC file
stream_get_line($fp, 4096, «\r»);

\\ Read a line from a UNIX file
stream_get_line($fp, 4096, «\n»);

\\ Read a line from a DOS file
stream_get_line($fp, 4096, «\r\n»);

\\ Read a line up to any filesystem line ending
ini_set(‘auto_detect_line_endings’, true); fgets($fp);

\\ You can also make up your own line ending characters:
\\ Read up to the first instance of «:»
stream_get_line($fp, 4096, «:»);

a function based on «tunnelareaten at gmail dot com»s idea to search for files in a given directory by a searchstring or by fileextension.

I added support to search recursively through all sub-directories an to determine weather the filepath should be returned or not.

// recursive function to get contents of given folder by searchterm or fileextension
// (does not show folders)
// standards: Foldername: string
// Searchterm: string
// Searchtype: ext/search (file-extension or searchterm within filename)
// SaveCompletePath: true/1
// usage: array FileSearch_r($Folder,$Search[,$SearchType,$SavePath])

function FileSearch_r ( $Dir , $Search , $SearchType = «search» , $SavePath = 1 ) <
$Array =array();
$D = dir ( $Dir );
while ( false !==( $Entry = $D -> read ()))
if ( $Entry != ‘.’ && $Entry != ‘..’ ) <
$Entry = $Dir . $Entry ;
if ( is_dir ( $Entry )) $Array = array_merge ( $Array , FileSearch_r ( $Entry . ‘/’ , $Search , $SearchType , $SavePath ));
else
if ( $SearchType == «search»
? substr_count ( $Entry , $Search )> 0
:( $SearchType == «ext»
? substr ( $Entry ,- strlen ( $Search ))=== $Search
: true ))
$Array []= $Entry ;
>
$D -> close ();
sort ( $Array , SORT_STRING );
if(!(bool) $SavePath ) $Array = str_replace ( $Dir , «» , array_values ( $Array ));
return $Array ;
>
?>

Here is a useful function if you’re having trouble writing raw bytes into a file.

It receives an integer and returns an array containing the ASCII values of the bytes on each index of the array.

function int2bytes($number) <
$byte = $number;
$i=0;
do <
$dec_tmp = $byte;

$byte = bcdiv($byte,256,0);
$resto = $dec_tmp — (256 * $byte);
$return[] = $resto;
> while($byte >= 256);
if($byte) $return[] = $byte;
return array_reverse($return);
>

$arr will contain the following values:
Array
(
[0] => 1
[1] => 40
[2] => 56
)

Now, to write this data to the file, just use a fputs() with chr(), just like this:

Php и взаимодействие с файловой системой web сервера

HTTP ( HyperText Transfer Protocol , протокол передачи гипертекста) — протокол прикладного уровня для передачи данных в первую очередь в виде текстовых сообщений. Основой протокола HTTP является технология «клиент-сервер», то есть предполагается существование потребителей (клиентов), которые инициируют соединение и посылают запрос, и поставщиков (серверов), которые ожидают соединения для получения запроса, производят необходимые действия и возвращают обратно сообщение с результатом.

Полное описание протокола содержится в спецификации, опубликованной на сайте http://www.w3.org/protocols или в RFC 2616.

Клиент инициирует взаимодействие с сервером и посылает запрос, содержащий:

IT-блог о веб-технологиях, серверах, протоколах, базах данных, СУБД, SQL, компьютерных сетях, языках программирования и создание сайтов.

О модели взаимодействия клиент-сервер простыми словами. Архитектура «клиент-сервер» с примерами

Привет, посетитель сайта ZametkiNaPolyah.ru! Продолжаем рубрику Сервера и протоколы. В этой записи мы поговорим о том, как работают приложения и сайты в сети Интернет, да и вообще в любой компьютерной сети. В основе работы приложения лежит так называемая модель взаимодействия клиент-сервер, которая позволяет разделять функционал и вычислительную нагрузку между клиентскими приложениями (заказчиками услуг) и серверными приложениями (поставщиками услуг).

Модель взаимодействия клиент-сервер. Архитектура «клиент-сервер».

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

Концепция взаимодействия клиент-сервер

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

Здесь мы разберемся с концепцией, которая позволяет нам выполнять все эти действия в сети Интернет. Данная концепция получила название «клиент-сервер». Как понятно из названия, в данной концепции участвуют две стороны: клиент и сервер. Здесь всё как в жизни: клиент – это заказчик той или иной услуги, а сервер – поставщик услуг. Клиент и сервер физически представляют собой программы, например, типичным клиентом является браузер. В качестве сервера можно привести следующие примеры: все HTTP сервера (в частности Apache), MySQL сервер, локальный веб-сервер AMPPS или готовая сборка Denwer (последних два примера – это не проста сервера, а целый набор серверов).

Клиент и сервер взаимодействую друг с другом в сети Интернет или в любой другой компьютерной сети при помощи различных сетевых протоколов, например, IP протокол, HTTP протокол, FTP и другие. Протоколов на самом деле очень много и каждый протокол позволяет оказывать ту или иную услугу. Например, при помощи HTTP протокола браузер отправляет специальное HTTP сообщение, в котором указано какую информацию и в каком виде он хочет получить от сервера, сервер, получив такое сообщение, отсылает браузеру в ответ похожее по структуре сообщение (или несколько сообщений), в котором содержится нужная информация, обычно это HTML документ.

Сообщения, которые посылают клиенты получили названия HTTP запросы. Запросы имеют специальные методы, которые говорят серверу о том, как обрабатывать сообщение. А сообщения, которые посылает сервер получили название HTTP ответы, они содержат помимо полезной информации еще и специальные коды состояния, которые позволяют браузеру узнать то, как сервер понял его запрос.

Сейчас мы схематично описали, как взаимодействуют клиент и сервер на седьмом уровне модели OSI, но, на самом деле это взаимодействие происходит на всех семи уровнях. Когда клиент отправляет запрос, сообщение упаковывается, можно представить, что сообщение заворачивается в семь оберток (хотя их может быть намного больше или же меньше), а когда сообщение получает сервер, он начинает эти обертки разворачивать.

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

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

Простая схема взаимодействия клиент-сервер

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

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

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

Давайте теперь ответим на вопрос: «зачем веб-мастеру или веб-разработчику понимать концепцию взаимодействия клиент-сервер?». Ответ, естественно, очевиден. Чтобы что-то делать своими руками нужно понимать, как это работает. Чтобы сделать сайт и, чтобы он правильно работал в сети Интернет или хотя бы просто работал, нам нужно понимать, как работает сеть Интернет.

Мы уже упоминали, что большая часть сетевых протоколов имеют архитектуру клиент-сервер. Например, веб-мастеру или веб-разработчику будут интересны протоколы седьмого и шестого уровня эталонной модели. Сетевым администраторам важно понимать, как происходит взаимодействие на уровнях с пятого по второй. Для инженеров связи наибольший интерес представляют протоколы с четвертого по первый уровень модели OSI.

Поэтому если вы действительно хотите быть профессионалом в сфере web, то сперва вам необходимо понимать, как происходит взаимодействии в сети (именно на седьмом уровне), а уже потом начинать изучать инструменты, которые позволят создавать сайты.

Архитектура «клиент-сервер»

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

Существует два вида архитектуры взаимодействия клиент-сервер: первый получил название двухзвенная архитектура клиент-серверного взаимодействия, второй – многоуровневая архитектура клиент-сервер (иногда его называют трехуровневая архитектура или трехзвенная архитектура, но это частный случай).

Принцип работы двухуровневой архитектуры взаимодействия клиент-сервер заключается в том, что обработка запроса происходит на одной машине без использования сторонних ресурсов. Двухзвенная архитектура предъявляет жесткие требования к производительности сервера, но в тоже время является очень надежной. Двухуровневую модель взаимодействия клиент-сервер вы можете увидеть на рисунке ниже.

Двухуровневая модель взаимодействия клиент-сервер

Здесь четко видно, что есть клиент (1-ый уровень), который позволяет человеку сделать запрос, и есть сервер, который обрабатывает запрос клиента.

Если говорить про многоуровневую архитектуру взаимодействия клиент-сервер, то в качестве примера можно привести любую современную СУБД (за исключением, наверное, библиотеки SQLite, которая в принципе не использует концепцию клиент-сервер). Суть многоуровневой архитектуры заключается в том, что запрос клиента обрабатывается сразу несколькими серверами. Такой подход позволяет значительно снизить нагрузку на сервер из-за того, что происходит распределение операций, но в то же самое время данный подход не такой надежный, как двухзвенная архитектура. На рисунке ниже вы можете увидеть пример многоуровневой архитектуры клиент-сервер.

Многоуровневая архитектура взаимодействия клиент-сервер

Типичный пример трехуровневой модели клиент-сервер. Если говорить в контексте систем управления базами данных, то первый уровень – это клиент, который позволяет нам писать различные SQL запросы к базе данных. Второй уровень – это движок СУБД, который интерпретирует запросы и реализует взаимодействие между клиентом и файловой системой, а третий уровень – это хранилище данных.

Если мы посмотрим на данную архитектуру с позиции сайта. То первый уровень можно считать браузером, с помощью которого посетитель заходит на сайт, второй уровень – это связка Apache + PHP, а третий уровень – это база данных. Если уж говорить совсем просто, то PHP больше ничего и не делает, кроме как, гоняет строки и базы данных на экран и обратно в базу данных.

Преимущества и недостатки архитектуры клиент-сервер

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

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

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

Установка и настройка PHP и MySQL на IIS сервер


Инструкция по установке и настройке IIS, PHP и MySQL на VPS с операционной системой Windows Server.

Что это такое?

Веб-сервер IIS представляет собой встроенную платформу для работы с сайтами на VPS с ОС Windows. Поддерживает настройку большого количества дополнительных модулей и приложений, в том числе PHP и MySQL, являющимися стандартами де-факто.

Аналогом связки является WAMP-стек, в котором вместо IIS используется веб-сервер Apache.

Данный набор ПО часто называют стеком, потому что каждый уровень зависит от его базового (нижнего) уровня. Ваша операционная система Windows — это базовый уровень. Затем IIS, ваш веб-демон IIS находится поверх ОС. Затем база данных хранит всю информацию, обслуживаемую веб-демоном, а любой язык сценариев P* используется для управления и отображения всех данных, а также для взаимодействия с пользователем.

Установка IIS

Подключитесь к виртуальному серверу Windows с правами суперпользователя.

Зайдите в Диспетчер серверов, в правом верхнем углу выберете Управление -> Добавить роли и компоненты.

Выберете тип: установка ролей и компонентов.

Выберете сервер из пула и нажмите Далее.

На следующем шаге отметьте галочкой нужную нам роль — Веб-сервер IIS.

На следующем этапе важно отметить дополнительный компонент “Функции .NET Framework 3.5”, по желанию можно отметить дополнительные составляющие, но для базовой работы IIS они не являются необходимыми. В результате выполните установку веб-сервера, он отобразится в диспетчере.

Установщик веб-платформы

Необходимо установить сервис под названием Установщик веб-платформы, с помощью которого будет происходить установка PHP и MySQL. Откройте диспетчер служб IIS как показано на изображении.

В вертикальном меню справа выберете “Получить новые компоненты веб-платформы”.

Вы будете перенаправлены на веб-сайт в браузере по умолчанию. Скачайте данный сервис и установите его.

Примечание: если у вас не получается скачать файл в IE из-за настроек безопасности, необходимо их отключить.

Примечание: чтобы открыть приложение, выберете тот же пункт меню “Получить новые компоненты веб-платформы”.

Виртуальный сервер на базе Windows

  • Лицензия включена в стоимость
  • Тестирование 3-5 дней
  • Безлимитный трафик

Настройка PHP и MySQL на IIS

Зайдите в Установщик веб-платформы, с помощью поиска найдите последнюю доступную версию MySQL и PHP и нажмите Добавить.

Затем установите выбранные приложения.

Перед вами появится окно для ввода пароля для суперпользователя СУБД.

Примечание: при возникновении ошибок проверьте присутствие .NET Framework 3.5.
Если он установлен, возможно, вы столкнулись с проблемой, известной в поздних версиях IIS: ошибкой проверки сигнатур при загрузке пакетов установки PHP Manager. В этом случае установите PHP Manager вручную из инсталлятора, доступного на Github. После установки таким способом при проверке компонентов PHP может появиться информация о несоответствии версий этих компонентов. Сообщение можно проигнорировать.

Проверка

Проверить корректность установки на IIS можно следующем образом. В диспетчере служб появится иконка Администратор PHP.

Откройте утилиту и перейдите по ссылке “Проверить phpinfo()”.

В появившемся окне выберете сайт для проверки.

В результате должна отобразиться похожая страница.

Для проверки установки СУБД откройте PowerShell и перейдите в директорию с помощью команды:

cd “C:\Program Files\MySQL\MySQL Server 5.5\bin”

Записки IT специалиста

Технический блог специалистов ООО»Интерфейс»

  • Главная
  • Windows Server. Добавляем поддержку PHP веб-серверу IIS.

Windows Server. Добавляем поддержку PHP веб-серверу IIS.

  • Автор: Уваров А.С.
  • 02.07.2012

В прошлой статье мы рассказывали как настроить веб-сервер IIS для запуска на нем ASP.NET приложений. Не менее популярным языком для веб-приложений является PHP, поддержка которого позволит запускать на нашем сервере большое число популярных CMS, разработанных с его применением. Тем более что установить PHP для веб-сервера IIS довольно просто.

Сразу внесем ложку дегтя в бочку с медом. Большинство популярных решений на базе PHP не поддерживают работу с СУБД MS SQL, для их работы потребуется также установить MySQL, что несколько выходит за рамки этой статьи.

Учитывая, что большинство из них разрабатываются для платформы LAMP, то их взаимоотношения с MS SQL Server еще долгое время будут оставаться напряженными. Даже Joomla 2.5, в которой заявлена поддержка MS SQL содержит большое число ошибок реализации данного механизма, что практическое использование данной связки не представляется возможным.

Поэтому, если вам необходимо использовать массовые CMS разработанные для связки PHP + MySQL, то мы бы советовали все-таки обратить внимание на решения на платформе Linux.

В тоже время вы можете использовать связку PHP + IIS + MS SQL для разработки собственных решений или при использовании PHP движков поддерживающих данную СУБД, например старшие версии Битрикс. В следующих статьях мы также расскажем, как установить MySQL на платформу Windows, если вы все таки решите использовать IIS для запуска популярных PHP систем управления сайтом.

Итак, что нам понадобиться, чтобы установить PHP для IIS? Прежде всего сам PHP, скачиваем его с официального сайта в виде msi инсталлятора, также хотим обратить ваше внимание, что скачивать нужно потоконебезопасную (Non Thread Safe) версию.

За безопасность потоков в нашем случае будет отвечать IIS, при установке потокобезопасной версии вы можете столкнуться с неожиданным (вплоть до полной неработоспособности) поведением скриптов. Несмотря на то, что последней версией PHP является 5.4, мы будем использовать 5.3, так как еще не все популярные скрипты полностью совместимы с последней версией PHP.

Перед тем, как устанавливать PHP необходимо добавить веб-серверу поддержку технологии CGI, для этого перейдите в Диспетчер сервера — Роли — Веб-сервер — Добавить службы ролей. Также мы добавили поддержку технологии SSI, которая часто используется в популярных CMS.

Теперь можно запускать инсталлятор PHP, путь установки лучше заменить на более короткий и без пробелов, например C:\PHP, в соответствующем окне выбираем режим работы IIS FastCGI. Все необходимые настройки PHP и IIS будут сделаны автоматически.

Для работы с СУБД MS SQL установим драйвер Microsoft Drivers 3.0 for PHP for SQL Server, также мы рекомендуем установить Windows Cache Extension for PHP, чтобы PHP приложения могли эффективно кэшировать данные, работая на платформе Windows. Для установки необходимо указать папку с расширениями PHP, в нашем случае это C:\PHP\ext, куда будут распакованы необходимые библиотеки.

В файл C:\PHP\php.ini добавим следующие строки, которые обеспечат подключение и загрузку необходимых модулей:

Также советуем обратить внимание на следующие опции:

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

Также мы советуем установить модуль URL Rewrite Module 2.0, после чего перезапустите веб-сервер через оснастку Диспетчер служб IIS.

После чего при помощи этой оснастки создадим новый сайт phpsite.local, для обращения к нему по URL не забудьте добавить соответствующие записи в файлы hosts на клиентах или A-запись на вашем DNS-сервере.

Установим необходимые права на папку с сайтом, чтобы PHP имел доступ к содержимому папки необходимо добавить полные права, кроме группы IIS_IUSRS, также группе IUSR.

Для проверки создадим в корневом каталоге сайта файл index.php со следующим содержимым:

Теперь на клиентской машине в браузере наберем http://phpsite.local, если все сделано правильно вы должны увидеть следующую страницу:

На этом установку и настройку PHP для веб-сервера IIS можно считать успешно завершенной. Моно приступать к размещению и запуску своих приложений, написанных с применением этого языка. В следующей статье мы дополним наш сервер СУБД MySQL, что позволит вам запускать весь спектр популярных PHP-приложений.

Разработка web-приложений на стороне сервера

Государственный университет – Высшая школа экономики

Учебно-методическое пособие по курсу «Базы данных»

НА СТОРОНЕ СЕРВЕРА

Учебно-методическим советом факультета «Бизнес-информатика» ГУ-ВШЭ

в качестве учебного пособия для студентов 20.04.2010

2. Программа курса. 6

Раздел 1. Основы языка программирования PHP. 6

1.1 Введение в PHP. 7

1.2 Установка интерпретатора PHP. 10

1.3 Полезные конструкции на PHP. 14

1.4 Управляющие структуры PHP. 16

1.5 Работа с файловой системой. 18

1.6 Базы данных и PHP. 18

Раздел 2. Основы технологии и .. 25

2.1 Введение в .. 25

2.3 Полезные конструкции на .. 32

2.4 Управляющие структуры .. 34

2.5 Работа с файловой системой. 35

2.6 Базы данных и .. 36

Раздел 3. Разработка приложений для WEB с использованием MySQL.. 41

3.1 Введение в MySQL.. 41

3.2 Взаимодействие MySQL и PHP. 43

3.3 Визуальные средства проектирования для MySQL. 52

4. Контрольная работа и методические рекомендации к ее выполнению.. 58

5. Вопросы итогового контроля. 60

6. Рекомендуемая литература. 62

1. Введение

В настоящее время количество приложений с использованием систем управления реляционными базами данных (СУБД) неуклонно растет. Особенно на этом фоне выделяются разработки под Интернет.

Современные информационные системы, такие как динамические WEB-сайты, используют СУБД для управления контентом (информационным наполнением) и обеспечения интерфейса взаимодействия с пользователями. Динамические Web-сайты, как правило, основаны на шаблонных страницах (в частности, HTML-формата), в которые вставляется (когда пользователь запрашивает соответствующие страницы через WEB-браузер) постоянно меняющееся информационное наполнение, извлекаемое из СУБД.

Отметим, что HTML (от англ. HyperText Markup Language — «язык разметки гипертекста») — стандартный язык разметки документов во Всемирной паутине. Большинство WEB-страниц создаются при помощи языка HTML (или XHTML).

Динамические WEB-сайты, как правило, создаются с использованием различных скриптовых языков программирования и технологий, среди которых, наиболее распространенными являются:

n PHP (англ. PHP: Hypertext Preprocessor — «PHP: препроцессор гипертекста») — скриптовый язык программирования общего назначения, интенсивно применяющийся для разработки WEB-приложений, в том числе взаимодействующих с СУБД;

n ASP.NET — технология создания WEB-приложений и WEB-сервисов от компании Microsoft. Она является составной частью платформы . . Разработчики могут писать код для , используя практически любые языки программирования, в том числе, и входящие в комплект .NET Framework (C#, Visual , и ). имеет преимущество в скорости по сравнению со скриптовыми технологиями, так как при первом обращении код компилируется и помещается в специальный кэш, и впоследствии только исполняется, не требуя затрат времени на парсинг, оптимизацию, и т. д.

Существуют и другие языки программирования и технологии создания динамических WEB-приложений, взаимодействующих с СУБД, например, язык программирования Java Server Pages (JSP), технология Java 2 Enterprise Edition и JDBC, технология создания расширений ISAPI и приложений CGI на языке программирования C++ и др. Такие технологии имеют определенные достоинства и недостатки, связанные с быстродействием, функциональными возможностями, и др. Вместе с тем, в процессе обучения программированию приложений баз данных для WEB целесообразно ориентироваться на наиболее популярные инструменты, такие как PHP, и (). При этом следует отметить, что скриптовый язык программирования PHP является более простым в использовании и ориентирован на проектирование малых и средних динамических WEB-сайтов (таких как, форумы, блоги, интернет-магазины и др.), а технология предназначена для проектирования больших информационных систем (например, Интернет-порталов) и предполагает активное использование методов объектно-ориентированного программирования (ООП) и визуальных средств разработки, в частности, Microsoft Visual Studio. Также отметим, что технология PHP наилучшим образом адаптирована для работы с СУБД MySQL, а для взаимодействия с СУБД Microsoft SQL Server (посредством специальной технологии ) .

Основной целью изучения темы «Разработка WEB-приложений на стороне сервера», изучаемой в рамках курса «Базы данных», является обучение студентов методологии проектирования приложений взаимодействующих с СУБД для WEB. Основные задачи темы: расширение и углубление теоретических знаний в области разработки баз данных; овладение специальными языками программирования, обеспечивающими возможность разработки приложений баз данных для WEB; изучение специфики технической реализации СУБД для WEB, в частности, на примере MySQL; изучение наиболее типичных примеров создания динамических WEB-страниц, взаимодействующих с СУБД.

Освоение темы предполагает знание основ технологий реляционных баз данных, программирования на языках: Си, Visual Basic и SQL, а также теоретических основ веб-дизайна (HTML, CSS и др.).

2. Программа курса

Раздел 1. Основы языка программирования PHP

Как было отмечено ранее, PHP (англ. PHP: Hypertext Preprocessor — «PHP: препроцессор гипертекста») — скриптовый язык программирования общего назначения, интенсивно применяющийся для разработки WEB-приложений, в том числе взаимодействующих с СУБД.

В отличие, в частности, от сценариев JavaScript и VBScript, выполняемых на стороне «клиента», PHP сценарии выполняются на стороне «сервера» и позволяют работать с различными СУБД, например MS SQL Server, Oracle, серверной файловой системой, почтовыми сервисами и др.

Обратите внимание. Для работы с PHP (ASP, JSP и др.) (в отличие от JavaScript) нужен установленный и специально настроенный WEB-сервер, например, Internet Information Server (IIS). К примеру, если у Вас установлена операционная система Windows XP/Vista и т. п., то Вы можете скачать дистрибутив PHP c сайта: www. (например, для пятой версии: http://ru. /get/php-5.2.12-Win32.zip/from/a/mirror).

Обратите внимание. PHP является свободно распространяемым продуктом, класса Open Source (открытого исходного кода).

Отметим, что файл, использующий PHP-сценарии, должен, как правило, иметь расширение «*.php».

1.1 Введение в PHP

Имена переменных обозначаются знаком $. То же самое «Hello, World!» можно получить следующим образом:

Конкатенация (присоединение) строк осуществляется с помощью. (точки); обычные арифметические операции определяются так, как Вы того и ожидаете:

даст Hello 6 people!

Обратите внимание. Синтаксис PHP очень похож на C.

Cтрока, заключенная в двойные кавычки, означает, что встречающиеся в этой строке переменные будут заменены их значениями, в то время как если строка заключена в одинарные кавычки, такая замена не производится. Так

Обратите внимание на то, что \n в строке означает переход к новой строке, совсем как в Perl или в C. Однако это работает только в тех строках, которые взяты в двойные кавычки.

PHP обеспечивает доступ к переменным окружения как к регулярным переменным. Например, при нажатии на кнопку формы инициируется передача данных формы методом GET или POST

после нажатия на кнопку «Вход»

Очевидное достоинство PHP в том, что Вам не надо заботиться о получении, раскодировании и любой другой обработке данных из формы, как например при написании CGI программы на языке C/C++. За нас все делает PHP. Очень легко и красиво он автоматически заполняет несколько встроенных массивов:

$_SERVER ($HTTP_SERVER_VARS) — для серверных переменных;

$_ENV ($HTTP_ENV_VARS) — для переменных среды, в которой работает PHP;

$_COOKIE ($HTTP_COOKIE_VARS) — для переменных передающихся посредством cookies;

$_GET ($HTTP_GET_VARS) — для параметров формы, переданных посредством метода GET;

$_POST ($HTTP_POST_VARS) — для параметров формы, переданных методом POST;

$_FILES ($HTTP_POST_FILES) — для закачиваемых посредством метода POST файлов;

$_REQUEST — массив содержащий внутри себя массивы $_GET, $_POST и $_COOKIE;

$_SESSION ($HTTP_SESSION_VARS) — для хранения параметров сессии.

Используя $_REQUEST, Вы получаете доступ к данным формы. Можете сохранить эти данные в Базе Данных и т. д.

1.2 Установка интерпретатора PHP

Шаг 1. Распакуйте дистрибутив в папку C:\PHP

Шаг 2. Настройте Internet Information Server на своем локальном компьютере, так чтобы выполнялась обработка файлов с расширением *.php. Для этого нужно зайти в Панель управления Windows, далее – Администрирование, далее — Диспетчер служб IIS. Затем нужно добавить обработку php-сценариев фильтром ISAPI для всех узлов по умолчанию с помощью вкладки «Фильтры ISAPI» (рис. 1)

Рис. 1. Добавление фильтра ISAPI для обработки PHP-сценариев.

Отметим, что Internet Server Application Programming Interface (ISAPI) — это API (Application Programming Interface — набор готовых классов, функций, структур и констант, предоставляемых приложением (библиотекой, сервисом) для использования во внешних программных продуктах.) для Internet Information Services, коллекции сетевых служб Microsoft Windows. Соответственно, фильтры ISAPI представляют собой динамические библиотеки DLL, напрямую взаимодействующие с IIS.

Далее, нужно добавить «Сопоставление сценария PHP с исполняемым файлом ISAPI-фильтра (php5isapi. dll). Это можно сделать в разделе «Сопоставление обработчиков» системы администрирования IIS (рис. 2).

Рис. 2. Настройка «Сопоставления обработчиков» IIS для PHP.

Обратите внимание. Для различных версий ОС Windows, интерфейс Диспетчера служб IIS также будет различным. К примеру, в для Windows XP добавление фильтра ISAPI для PHP имеет вид рис. 3.

Рис. 3. Добавление фильтра ISAPI для обработки PHP-сценариев в для IIS 6.0 ОС Windows XP.

Шаг 3. Скопируйте php5ts. dll из дистрибутива в папку C:\Windows\system32

Шаг 4. Убедитесь, что PHP работает под управлением Вашего IIS. Для этого создайте файл test. php в папке IIS (C:\Inetpub\wwwroot) c таким кодом:

Должен быть получен вот такой результат

Рис. 4. Оценка корректности установки и конфигурирования PHP.

Обратите внимание на параметр Loaded Configuration File. К примеру, в нашем случае он имеет следующее значение: «C:\Program Files\PHP\php. ini». Это означает, что кофигурационный файл, с помощью которого Вы можете переопределять параметры PHP модуля, находится в папке «C:\Program Files\PHP), и загружен успешно.

Шаг5. Сконфигурируйте файл php. ini под Ваши задачи.

Рис. 5. Конфигурирование PHP под собственные задачи.

1.3 Полезные конструкции на PHP

include(«login. php»); //Вставка файла login. php в текущий файл

//Здесь произвольный HTML код

//Данный блок кода будет выполнятся, только если переменная $action примет значение «Вход», т. е. если Пользователь нажмет на кнопку «Вход

//Функция isset позволяет проверить установлено ли значение переменной $action

Простейший способ установить cookie на PHP таков:

Затем, для каждой последующей страницы на Вашем сайте, просматриваемой в течение данной сессии (пока пользователь не покинет сайт) переменная $name будет иметь значение ‘bret’ и его можно легко прочитать средствами PHP. Этот тип cookie известен как cookie-сессия, поскольку значение сохраняется в течение пользовательской сессии.

С помощью cookie можно создать, в частности, «Корзину покупок» для Интернет-магазина или запомнить «профиль» пользователя. Если Вы хотите, чтобы значение cookie запоминалось браузером после того, как пользователь закончит сессию, Вы должны передать функции setcookie() третий параметр — дату истечения срока действия cookie. Поскольку PHP сформировался в основном в среде Unix, Вы должны представить время истечения срока действия cookie как число секунд, прошедших с 1 января 1970 г.

Например, если Вы хотите, чтобы срок действия cookie истек 1 января 2000 г., Вы записываете:

Обратите внимание. В силу того, как организована обработка cookies в протоколе HTTP, необходимо установить значения всех cookie до вывода какого-либо текста. Если сделать наоборот, PHP выдаст Вам предупреждение и значение cookie не будет послано. Вот так правильно:

Создать массив можно также путем вызова функции array():

$fruit = array(‘banana’,’papaya’); //Создается массив из 2-х элементов ‘banana‘ и ‘papaya’

Индексы массивов (как обычных, так и ассоциативных) задаются в квадратных скобках ([ и ]):

1.4 Управляющие структуры PHP

Вы можете использовать операторы цикла, такие как for и while. В результате выполнения оператора:

print «Сайт сейчас перегружен!»;

elseif ($user_count > 100) <

print «Сайт активно используется!»;


print «Сайт свободен — подключились только $user_count пользователей.»;

Вы можете использовать конструкции с switch, do. while.

switch($kv1) // Оцениваем значение переменной $kv1

1.5 Работа с файловой системой

Пример обработки файла CSV (с данными разделямыми точкой с запятой).

$fp = file(«baza/data. txt»); //Открываем файл data. txt

$pat =»;»; // Определяем разделитель данных в файле “;”

Обратите внимание. Для работы с MySQL из PHP нет необходимости в каких либо дополнительных модулях. MySQL «родная» СУБД для PHP.

Пример 2. Создание соединения и выбор базы данных для MS SQL Server.

Обратите внимание. Для работы с MS SQL Server из PHP (и другими СУБД кроме MySQL), необходимо подключить специальный модуль, соответствующий данной СУБД. Данная операция осуществляется в файле php. ini, посредством удаления знака «;» в соответсвующей строке файла, т. е.

Фрагмент файла php. ini:

[PHP_MSSQL] (extension=php_mssql. dll)

Обратите внимание, что если Вы используется в качестве сервера хорошо известную платформу MS SQL Server Express Edition, то строка соединения с базой данных «TEST» (в режиме аутоинтификации SQL Server, т. е. по логину «sa») будет иметь следующий вид:

Обратите внимание на имя сервера СУБД «.\SQLEXPRESS».

Пример 3. Создание новой таблицы в MS SQL с помощью PHP

Пример 4. Заполнение таблицы в MS SQL с помощью PHP данными из файла

Фрагмент файла data2.txt

Обратите внимание. Если файл с данными большой (например, имеет тысячи записей и более), то лучше использовать массовую загрузку данных в MS SQL Server командой BULK INSERT. Это будет намного быстрее.

Пример 5. Выполнение запроса к базе по заданному критерию

$E_1[$ ]; // Считываем значения переменных из Базы в массивы переменных

// Осуществляем различные манипуляции с массивами переменных $E_1[$idx] и др.

Отметим, что PHP поддерживает ряд функций спефифичных для MySQL, в частности, следующие:

mysql_affected_rows — Возвращает число затронутых прошлой операцией рядов.

mysql_change_user — Изменяет пользователя для указанного соединения.

mysql_client_encoding — Возвращает кодировку соединения

mysql_close — Закрывает соединение с сервером MySQL.

mysql_connect — Открывает соединение с сервером MySQL.

mysql_create_db — Создаёт базу данных MySQL.

mysql_data_seek — Перемещает внутренний указатель в результате запроса.

mysql_db_name — Возвращает название базы данных.

mysql_db_query — Переключается к указанной базе данных и посылает запрос.

mysql_drop_db — Уничтожает базу данных MySQL.

mysql_errno — Возвращает численный код ошибки выполнения последней операции с MySQL.

mysql_error — Возвращает строку ошибки последней операции с MySQL.

mysql_escape_string — Экранирует SQL спецсимволы для mysql_query.

mysql_fetch_array — Обрабатывает ряд результата запроса, возвращая ассоциативный массив, численный массив или оба.

mysql_fetch_assoc — Обрабатывает ряд результата запроса и возвращает ассоциативный массив.

mysql_fetch_field — Возвращает информацию о колонке из результата запроса в виде объекта.

mysql_fetch_lengths — Возвращает длину каждого поля в результате.

mysql_fetch_object — Обрабатывает ряд результата запроса и возвращает объект.

mysql_fetch_row — Обрабатывает ряд результата запроса и возвращает неассоциативный массив.

mysql_field_flags — Возвращает флаги указанного поля результата запроса.

mysql_field_len — Возвращает длину указанного поля.

mysql_field_name — Возвращает название указанной колонки результата запроса.

mysql_field_seek — Устанавливает внутренний указатель поля на переданное смещение.

mysql_field_table — Возвращает название таблицы, которой принадлежит указанное поле.

mysql_field_type — Возвращает тип указанного поля результата запроса.

mysql_free_result — Освобождает память от результата запроса

mysql_get_client_info — Возвращает данные о MySQL-клиенте

mysql_get_host_info — Возвращает информацию о соединении с MySQL

mysql_get_proto_info — Возвращает информацию о протоколе MySQL

mysql_get_server_info — Возвращает информацию о сервере MySQL

mysql_info — Возвращает информацию о последнем запросе

mysql_insert_id — Возвращает ID, сгенерированный при последнем INSERT-запросе.

mysql_list_dbs — Возвращает список баз данных, доступных на сервере.

mysql_list_fields — Возвращает список колонок таблицы.

mysql_list_processes — Возвращает список процессов MySQL.

mysql_list_tables — Возвращает список таблиц базы данных MySQL.

mysql_num_fields — Возвращает количество полей результата запроса.

mysql_num_rows — Возвращает количество рядов результата запроса.

mysql_pconnect — Устанавливает постоянное соединение с сервером MySQL.

mysql_ping — Проверяет соединение с сервером и пересоединяется при необходимости.

mysql_query — Посылает запрос MySQL.

mysql_real_escape_string — Экранирует специальные символы в строках для использования в выражениях SQL.

mysql_result — Возвращает данные результата запроса.

mysql_select_db — Выбирает базу данных MySQL.

mysql_stat — Возвращает текущий статус сервера.

mysql_tablename — Возвращает имя таблицы, содержащей указанное поле.

mysql_thread_id — Возвращает ID текущего потока.

mysql_unbuffered_query — Посылает MySQL SQL-запрос без авто-обработки результата и её буферизации.

Отметим, что для PHP существуют программы “билдеры” для ускорения процесса разработки WEB-страниц, взаимодействующих с СУБД, например, PHP Report Maker.

Раздел 2. Основы технологии и

2.1 Введение в

— технология создания WEB-приложений и WEB-сервисов от компании Microsoft. Она является составной частью платформы и развитием более старой технологии Microsoft ASP. На данный момент последней версией этой технологии является 4.0b.

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

Хотя берёт своё название от старой технологии Microsoft ASP, она значительно от неё отличается. Microsoft полностью перестроила , основываясь на Common Language Runtime (CLR), который является основой всех приложений . Разработчики могут писать код для , используя практически любые языки программирования, в том числе, и входящие в комплект .NET Framework (C#, Visual , и ). имеет преимущество в скорости по сравнению со скриптовыми технологиями, так как при первом обращении код компилируется и помещается в специальный кэш, и впоследствии только исполняется, не требуя затрат времени на парсинг, оптимизацию, и т. д.

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

1.x позволяет разделять код логики от кода представления, то есть помещать код программной логики страницы в файл. cs или. vb, отдельно от кода собственно страницы, размещаемом в. aspx файле. Эта технология называется Code-Behind. Таким образом, дизайн страницы может быть изменен не затрагивая кода страницы, что позволяет разделить ответственность за внешний вид и работу страницы между дизайнером и программистом. Для этого в. aspx файле можно задать параметры директивы Page.

Но для поддержки редактирования с помощью Microsoft Visual в странице необходимо указать класс, соответствующей данной странице и файл, в котором находится код этого класса. Для этого директива Page преобразуется с использованием ключевых слов Codebenind и Inherits.

В 2.0 используется иной механизм разделения кода. В директиве Page при этом необходимо использовать другие ключевые слова: CodeFile и Inherits.

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

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

Используемая в Visual Studio модель Code-Behind обладает несколькими весьма существенными недостатками. Прежде всего, используя Visual Studio разработчику необходимо компилировать проект перед публикацией, поскольку компилирует страницы, только если указан атрибут Src, не используемый Visual Studio. При этом, поскольку среда обнаруживает изменение даты создания сборки, после каждой замены старой сборки в каталоге bin происходит перезапуск домена приложения, что выливается во временную «заторможенность» в работе приложения.

Visual Studio использует новые ключевые слова, поддерживаемые средой выполнения 2.0, а среда выполнения, в свою очередь, использует новую технику компиляции страниц. Это позволяет решить проблему замены сборки на более новую.

Несмотря на это, Visual Studio по-прежнему позволяет отказаться от разделения кода и поместить код программной логики в самом файле страницы, и использовать теги . Более того, по умолчанию Visual Studio создает именно страницы без разделения кода.

В 2.0 среда выполнения также анализирует директивы Page, осуществляет поиск сборки соответствующей классу логики страницы, после чего создается класс страницы. В отличие от 1.x, родительским классом для класса страницы является System. Web. UI. Page, поскольку создаваемый динамический класс является собственно классом страницы (используются разделяемые классы для класса страницы и класса программной логики), а не потомком класса программной логики. Поэтому, если в 1.x класс Web-формы мог называться также как и сама Web-форма.

В 2.0 это недопустимо, поскольку элемент управления System. Web. UI. Form является элементом класса. Основным преимуществом является то, что в случае отсутствия сборки, необходимой для выполнения страницы, происходит компиляция только файла программной логики страницы, без перекомпиляции всей сборки. Поскольку существует динамическая компиляция, то необходимо обеспечить возможность создавать код, общий для всех страниц приложения. Для этой цели в 2.0 существуют специальные директории, являющиеся дочерними директориями корневой директории приложения, одна из которых App_Code, служит для хранения файлов, содержащих общий код для всех страниц. При выполнении динамической компиляции, код из директории App_Code компилируется и становится доступным для всех страниц Web-приложения. При этом Visual Studio поддерживает код, находящийся в директории App_Code, поэтому работает подсветка синтаксиса и IntelliSense.

Обратите внимание. Технология базируется на технологии ASP (хотя и меет существенные отличия от последней).

Далее опишем основные возможности на примере наиболее популярного языка программирования, Visual , поддерживаемого. NET.

Для организации вывода существует объект Response. Вывод осуществляется с помощью метода Write.

Так производится запись во внутренний буфер объекта Response. Когда скрипт заканчивает работу, весь буфер выдается клиенту. Надо заметить, что клиент получает «чистый» HTML, таким образом, программы на не зависят от клиентского ПО, что очень важно. Если внутри выводимой строки нужно использовать кавычку, кавычка удваивается. Другие методы и свойства Response позволяют управлять выводом. Так Response. Buffer регулирует, получает ли клиент данные по мере из записи в Response, или все сразу по завершении исполнения страницы. Метод Response. Redirect перенаправляет браузер на другую страницу. Чтобы им пользоваться, нельзя до него на странице использовать Response. Write.

Программа на не может явно спросить пользователя о чем-то. Она получает данные из других страниц, либо через URL. Передаваемые параметры помещаются во входной поток и доступны через объект Request. Чтобы передать переменную var в программу test. asp, надо написать:

test. asp? var=abc

Чтобы из программы получить значение этой переменной, надо написать:

Несколько переменных разделяется знаком &:

test. asp? var1=abc&var2=def

Кроме того, чтобы задавать параметры в URL, можно воспользоваться формами HTML. В вызывающей странице пишем так:

Исходная форма имеет вид:

При этом пользователь увидит форму из одного поля ввода (var1), в нем будет значение по умолчанию » default». Второе поле (var2) будет невидимо и будет передавать всегда фиксированное значение » значение 2″. Кнопка «Submit Form» завершает заполнение формы и передает все переменные на test. asp (action).

Если method=»get», переменные передаются через URL: test. asp? var1=default&var2=value2.

Если method=»post», передаются вместе с запросом так, что внешне передача переменных не заметна.

2.2 Установка программного обеспечения для

Отметим, что для поддержки , как правило, необходим Internet Information Server и установленный Microft Net Framework. Это программная технология от компании Microsoft, предназначенная для создания обычных программ и WEB-приложений.

Установка программного обеспечения начинается со скачивания дистрибутива. NET Framework (с сайта Microsoft). распространяется как составная часть. NET Framework. Перед установкой. NET Framework, необходимо установить Internet Information Server (IIS), который, как правило, поставляется вместе с дистрибутивом Windows и устанавливается через меню «Пуск/Панель управления/Установка и удаление программ/Установка компонентов Windows».

Рис. 6. Инсталляция WEB-сервера IIS

Одной из основных идей является совместимость различных служб, написанных на разных языках. Например, служба, написанная на C++ для , может обратиться к методу класса из библиотеки, написанной на Delphi; на C# можно написать класс, наследованный от класса, написанного на Visual , а исключение, созданное методом, написанным на C#, может быть перехвачено и обработано в Delphi. Каждая библиотека (сборка) в. NET имеет сведения о своей версии, что позволяет устранить возможные конфликты между разными версиями сборок.

После установки. NET FrameForks, в Администраторе IIS можно постмотреть версию и месторасположения конфигурационного файла (рис.7).

Рис. 7. Просмотр свойств ASP.NET после инсталляиции. Net Framework

Отметим, что файлы имеют, как правило, расширение «*.aspx».

Обратите внимание, что после установки Net Framework такие файлы обрабатываются в IIS с помощью ISAPI фильтра – aspnet_isapi. dll (рис. 8).

Рис. 8. Просмотр ссылки на обработчик сценариев ASP.NET в Администраторе IIS.

Также для каждого виртуального каталога IIS можно создать единственный файл global. asax, с помощью которого управлять поведением сайта в зависимости от событий, связанных с поведением пользователей (например, события начала и окончания пользовательской сессии).

2.3 Полезные конструкции на

Если на сервере установлены дополнительные компоненты, их можно использовать из Стандартные объекты (например, из библиотек ADO (Connection и Recordset) и Scripting (Dictionary, FileSystemObject)) доступны всегда. Установка новой компоненты обычно состоит в копировании dll-файла в каталог на сервере и ее регистрации с помощью программы regsvr32.exe.

Создать экземпляр объекта можно так:

Set var = Server. CreateObject(«Class. Object»)

Class. Object указываются в документации на компоненту.

В переменной var запоминается ссылка на созданный экземпляр объекта. Когда объект не нужен, ссылку нужно обнулить с помощью команды:

Set var = Nothing

Отметим что для передачи данных между страницами, можно воспользоваться механизмом сессий. , используя cookies, предоставляет программисту специальное средство — объект Session (сессия). Сессия стартует, когда новый пользователь обращается к любому aspx-файлу приложения. Сессия заканчивается при отсутствии активности пользователя в течение, как правило, 20 минут. Специальный объект Session хранит состояние сессии. Туда можно записывать переменные, которые доступны из любой страницы в этой сессии.

Записать данные в этот объект можно следующим образом:

Для считывания значения можно использовать такую запись:

Наряду с объектом Session существует объект Application. Если сессия создается для каждого нового пользователя, до Application существует в единственном экземпляре, и может использоваться всеми страницами приложения.

Чередование /HTML

Если нужно выдать большой кусок HTML, можно не пользоваться Response. Write. Если в asp-файле встречается кусок текста вне скобок , он трактуется просто как HTML, который надо вывести. Пример:

Выполняется первый блок HTML-кода

Выполняется другой блок HTML-кода

Обратите внимание. В в отличие от ASP, обязательно нужно объявлять тип используемых переменных. Обычно это деляается вначале скрипта.

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

Отметим, что можно выносить повторяющийся код в отдельный файл, и подключать к разным другим по мере необходимости с помощью команды include. Это весьма удобно, если есть потребность вынести повторяющийся код в отдельный файл и использовать многократно в разных страницах:

2.4 Управляющие структуры

Вы можете использовать операторы цикла, такие как for и while.

Отметим, что логические операторы также имеют довольно простую форму, например, следующую.

IF Not VarType(rs3.Fields(3).Value)=1 Then

В этом примере, функция VarType() проверят соответствие переменной определенному типу по значению, и в зависимости, от результата, либо, считывает значение из СУБД, либо записывает в переменную var_name пустое значение. Функция CStr выполняет приведение текущего типа переменной к текстовому.

2.5 Работа с файловой системой

Для при работе с файловой системой целесообразно использовать объектную модель FSO (File System Object).

Ниже представлен пример создания файла на жестком диске с помощью скрипта с последующей записей значений, извлекаемых из некоторой СУБД, в формате XML.

‘Здесь некторый блок кода, формирующий XML-поток

2.6 Базы данных и

Из можно легко и просто работать с любыми СУБД. Это делается через две промежуточные технологии: ODBC и ADO ().

ODBC позволяет организовать доступ к любым СУБД через унифицированный интерфейс с помощью языка SQL. Специфика конкретных СУБД учитывается при помощи специальных драйверов БД. Такие драйверы существуют для всевозможных СУБД (в частности SQL Server, Oracle, Access, FoxPro). Поддержка ODBC обеспечивается на уровне операционной системы Windows. Настройка – через Панель управления/ODBC.

Рис. 9. Настройка источников данных ODBC.

Базовым понятием является источник данных или data source. Источник данных – это совокупность сведений о базе данных, включая ее драйвер, имя компьютера и файла, параметры. Чтобы воспользоваться базой, необходимо создать источник данных для нее. Важно, чтобы источник данных был «системным», в отличии от «пользовательского». После этого надо лишь знать имя источника данных.

ADO – это совокупность объектов, доступных из (ASP), позволяющих обращаться к источнику данных ODBC (или OLE DB). Фактически нужны лишь 2 объекта – Connection, представляющий соединение с базой данных и Recordset, представляющий набор записей, полученный от источника. Сначала необходимо открыть соединение, потом к нему привязать Recordset, потом, пользуясь методами Recordset, обрабатывать данные.

Пример 1. Доступ к СУБД через имя источника («DataSourceName«), настроенного в Администраторе источников ODBC

Dim Conn, RS, strSQL, strOut

Set Conn = Server. CreateObject(«ADODB. Connection»)

Conn. Open «Data-Source-Name»

Set RS = Server. CreateObject(«ADODB. Recordset»)

strSQL = «SELECT * FROM AGENTS ORDER BY USER_ID»

RS. Open strSQL, Conn

Here is the data:»

strOut = strOut & » USER_ID Name «

Do While Not RS. EOF

strOut = strOut & » «

strOut = strOut & » » & RS. Fields(«USER_ID») & « «

strOut = strOut & » » & RS. Fields(«NAME») & « «

strOut = strOut & « «

strOut = strOut & « «

strOut = strOut & «That’s it!»

Set RS = Nothing

Set Conn = Nothing

Response. Write strOut

Пример 2. Доступ к СУБД через имя драйвера (на примере MS SQL Server).

dbs = CreateObject(«ADODB. Connection»)

dbs. ConnectionString = «driver=;server=.\SQLEXPRESS;u >

dbs. ConnectionTimeout = 5

Отметим, что в настоящее время для рекомендуется также использовать объектную модель , существенно отличающуюся от объектной модели ADO.

поддерживает модель поставщиков. Поставщики для конкретного источника данных можно определить как совокупность классов в одном пространстве имен созданных специально для данного источника данных. Эта особенность несколько размыта для источников данных OleDb, ODBC, так как они по своей сути созданы для работы с любой базой данных совместимых с OLE и ODBC.

В подключаемой части имеются следующие основные классы подсоединенных объектов:

    Connection. Этот класс, позволяющий устанавливать подключение к источнику данных. ( OleDbConnection, SqlConnection, OracleConnection) Transaction. Объект транзакций (OleDbTransaction, SqlTransaction, OracleTransaction. В имеется пространство имен System. Transaction) DataAdapter. Это своеобразный шлюз между автономными и подключенными аспектами . Он устанавливает подключение, и если подключение уже установлено, содержит достаточно информации, чтобы воспринимать данные автономных объектов и взаимодействовать с базой данных. (DataAdapter — SqlDataAdapter, OracleDataAdapter) Command. Это класс представляющий исполняемую команду в базовом источнике данных. Parameter. Объект параметр команды. DataReader. Это эквивалент конвейерного курсора с возможностью только чтения данных в прямом направлении.

Обратите внимание. Для использования в нужно вначале импортировать соответствующее пространство имен.

Пример 3. Подключение к СУБД Access, считывание данных при помощи и вывод на WEB-страницу

Dim cmd As New OleDb. OleDbCommand(«SELECT * FROM » & DBTableName, cn)
Dim da As New OleDb. OleDbDataAdapter(cmd)
Dim tbl As New DataTable
‘заполняем набор данных
da. Fill(tbl)
‘выводим данные
For Each Row As DataRow In tbl. Rows

Response. Write(Join$(Row. ItemArray())+»
«)

Next Row
‘освобождаем ресурсы
tbl. Dispose()
da. Dispose()
cmd. Dispose()
cn. Dispose()

Раздел 3. Разработка приложений для WEB с использованием MySQL

3.1 Введение в MySQL

MySQL Server относиться к классу реляционных СУБД, максимально адаптированных для WEB-разработки и отличается расширенной функциональностью (возможность хранения данных терабайтного объема, поддержка хранимых процедур и триггеров, кроссплатформенность и т. д.) и вместе с тем относится к технологиям класса open source (открытого кода), т. е. не требует лицензирования и является свободно распространяемой СУБД.

Кроссплатформенная СУБД MySQL. (официально произносится, «май-эс-кью-эль») — бесплатно распространяемая система управления базами данных (СУБД). MySQL является собственностью компании Sun Microsystems, осуществляющей разработку и поддержку приложения. Распространяется под GNU General Public License и под собственной коммерческой лицензией, на выбор. Помимо этого компания MySQL AB разрабатывает функциональность по заказу лицензионных пользователей, именно благодаря такому заказу почти в самых ранних версиях появился механизм репликации. MySQL портирована на большое количество платформ: AIX, BSDi, FreeBSD, HP-UX, GNU/Linux, Mac OS X, NetBSD, OpenBSD, OS/2 Warp, SGI IRIX, Solaris, SunOS, SCO OpenServer, SCO UnixWare, Tru64, Windows 95, Windows 98, Windows NT, Windows 2000, Windows XP, Windows Server 2003, Windows Vista и Windows 7. Существует также порт MySQL к OpenVMS. Важно отметить, что компания MySQL AB предоставляет для свободной загрузки не только исходные коды СУБД, но и откомпилированные и оптимизированные под конкретные операционные системы готовые исполняемые модули. MySQL имеет API для языков Delphi, C, C++, Эйфель, Java, Лисп, Perl, PHP, Python, Ruby, Smalltalk и Tcl, библиотеки для языков платформы. NET, а также обеспечивает поддержку для ODBC посредством ODBC-драйвера MyODBC. Отметим, что максимальный объем Хранилища MySQL, начиная с версии 3.23+ : до 8 миллионов терабайт. (2 ^ 63).

MySQL разработал Михаэль Видениус (Michael Widenius, *****@***se). MySQL является относительно небольшой и быстрой реляционной СУБД основанной на традициях Hughes Technologies Mini SQL (mSQL).

Последнюю версию MySQL можно скачать с www. tcx. se.

Важнейшие преимущества СУБД MySQL.

      Кроссплатформенность (возможность инсталляции на различные операционные системы, в том числе Windows и Unix). Многопоточность. Поддержка нескольких одновременных запросов. Оптимизация связей с присоединением многих данных за один проход. Записи фиксированной и переменной длины. ODBC драйвер в комплекте с исходником. Гибкая система привилегий и паролей. До 16 ключей в таблице. Каждый ключ может иметь до 15 полей. Поддержка ключевых полей и специальных полей в операторе CREATE. Поддержка чисел длинной от 1 до 4 байт (ints, float, double, fixed), строк переменной длины и меток времени. Интерфейс с языками PHP, .NET, C, perl и др. Основанная на потоках, быстрая система памяти. Утилита проверки и ремонта таблицы ( isamchk). Все данные хранятся в формате ISO8859_1. Все операции работы со строками не обращают внимания на регистр символов в обрабатываемых строках. Псевдонимы применимы как к таблицам, так и к отдельным колонкам в таблице. Все поля имеют значение по умолчанию. INSERT можно использовать на любом подмножестве полей. Легкость управления таблицей, включая добавление и удаление ключей и полей.

Интерфейсы с другими языка программирования

Наиболее простой способ работы с MySQL сводится к использованию программы MySQL. Это клиентская часть СУБД MySQL. Можно выполнять команды SQL непосредственно из командной строки системы unix или из интерактивного режима MySQL. Подробнее о клиентских программах.

СУБД MySQL имеет библиотеку C API. Ее можно использовать для запросов к базе данных, вставки данных, создания таблиц и т. п. C API поддерживает все функции MySQL.

Язык perl поддерживается сразу двумя способами:

      Портирован интерфейс с perl из mini-SQL, разработанный Андреасом Коенигом (Andreas Koenig a. *****@***de ). Есть модуль perl DBD

Также доступен 32-битный ODBC драйвер для MySQL. Он позволяет запрашивать и получать данные из других источников с поддержкой ODBC. С подробностями можно ознакомиться на домашней страничке MySQL (увы, только на английском языке).

Важнейшим преимуществом MySQL является возможность бесшовной (native) интеграции с языком программирования PHP.

3.2 Взаимодействие MySQL и PHP.

В этом примере показано как в PHP легко обрабатывать данные с HTML – форм.

Создадим простой HTML файл.

Запрос информации

Хотите больше знать о наших товарах?

Назовем этот файл request. html. В нем мы указали, что данные формы будут обрабатываться файлом email. php3. Приведем его содержание:

«;
PRINT «Привет, $name.»;
PRINT «

«;
PRINT «Спасибо за ваш интерес.

«;
PRINT «Вас интересуют $preference. Информацию о них мы пошлем вам на email: $email.»;
PRINT » «;
?>

Теперь, если пользователь вызовет request. html и наберет в форме имя “Вася”, email: *****@***com и скажет, что его интересуют “Яблоки”, а после этого нажмет «Отправить запрос!», то в ответ вызовется email. php3, который выведет на экран примерно следующее:

Спасибо за ваш интерес.

Вас интересуют Яблоки. Информацию о них мы пошлем вам на email: *****@***com

Теперь мы должны сдержать обещание и выслать email.

Для этого в PHP есть функция MAIL.

Синтаксис: void mail(string to, string subject, string message, string add_headers);

to – email адрес получателя.

subject – тема письма.

message – собственно текст сообщения.

add_headers – другие параметры заголовка письма (необязательный параметр).

Допишем в конец файла email. php3 следующий код:

Вот теперь пользователь будет получать письмо с более подробной информацией о наших товарах. Также письмо получит и администратор сайта.

Когда интересующихся нашими товарами станет очень много, мы захотим их как-то упорядочить и хранить информацию о них в базе данных. Об этом в следующем примере.

Работа с MySQL (сохранение данных в базе данных).

Для начала создаем базу данных и таблицу. Входим в MySQL, и выполняем команды:

>CREATE DATABASE products;

>CREATE TABLE clients (name VARCHAR(25), email VARCHAR(25), choise VARCHAR(8));

Для общения с MySQL из PHP понадобятся следующие функции.

int mysql_connect(string hostname, string username, string password);

Создать соединение с MySQL.

Hostname – имя хоста, на котором находится СУБД.

Username – имя пользователя.

Password – пароль пользователя.

Функция возвращает параметр типа int, который больше 0, если соединение прошло успешно, и равен 0 в противном случае.

int mysql_select_db(string database_name, int link_identifier);

Выбрать базу данных для работы.

Database_name – имя базы данных.

link_identifier – ID соединения, которое получено в функции mysql_connect. (параметр необязательный, если он не указывается, то используется ID от последнего вызова mysql_connect)

Функция возвращает значение true или false

int mysql_query(string query, int link_identifier);

Функция выполняет запрос к базе данных.

Query – строка, содержащая запрос

link_identifier – см. предыдущую функцию.

Функция возвращает ID результата или 0, если произошла ошибка.

Функция закрывает соединение с MySQL.

link_identifier – см. выше.

Функция возвращает значение true или false

Теперь наш файл email. php3 будет иметь след. вид:

«;
PRINT «Привет, $name.»;
PRINT «

«;
PRINT «Спасибо за ваш интерес.

«;
PRINT «Вас интересуют $preference. Информацию о них мы пошлем вам на email: $email.»;
PRINT » «;

/* Отправляем email */
mail($email, «Запрос на информацию», «$namen\n
Спасибо за ваш интерес!\n
Вас интересуют $preference\n
Мы их распространяем бесплатно. Обратитесь в ближайший филиал нашей компании и получите ящик этого продукта.\n
«);

mail(«*****@***com»,
«Был запрос на информацию.»,
«$name интересовали $preference\n
email-адрес: $email. \n»);

/* Вставить информацию о клиенте в таблицу */
$query = «INSERT INTO $userstable VALUES(‘$name’,’$email’, ‘$preference’)»;

PRINT «Информация о вас занесена в базу данных.»;

/* Закрыть соединение */
MYSQL_CLOSE();
?>

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

Работа с MySQL (получение данных из базы данных).

После занесения данных, нас иногда будет интересовать вопрос так кого же из наших клиентов интересует товар “Яблоки” (не путать с Apple Macintosh).

Напишем скрипт apple. php3

Любителей яблок нет «;
> ELSEIF ($number > 0) <
PRINT «

Количество любителей яблок: $number

Здесь мы использовали две новых функции:

int mysql_num_rows(int result);

Функция возвращает количество строк в результате запроса.

Параметр result – содержит ID результата запроса.

int mysql_result(int result, int i, column);

Функция возвращает значение поля в столбце column и в строке i.

Таблица 2. Функциональные возможности различных версий СУБД MySQL

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL