Php руководство по рнр 3 0 функции работы с изображениями


Содержание

Создание изображений средствами PHP

Эта статья рассчитано на программистов со средним уровнем знания PHP.
Введение

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

* Создание кнопок с надписями, текст которых хранится в базе данных
* Графическое отображение статистических данных
* Создание различных графиков и диаграмм

В этой статье рассматривается использование библиотеки GD для обработки изображений. GD является внешней библиотекой, доступной в виде модуля PHP

Цель этой статьи

В статье освещаются следующие вопросы:

* Что такое заголовки (headers)
* Использование функций библиотеки GD для динамического создания изображений средствами PHP
* Использование HTTP заголовков для указания браузеру, что вывод PHP-скрипта представляет собой изображение

Создание заголовка

По умолчанию, PHP выводит один заголовок: Content-type: text/html, означающий, что результатом работы скрипта является HTML код

Как видите, PHP выводит Content-type: text/html и пустую строку, прежде чем выводить результат работы скрипта . Все до пустой строки является заголовком HTTP. Заголовок содержит информацию для браузера и не отображается на экране.

Используемый по умолчанию заголовок Content-type: text/html показывает, что выводится HTML код, который браузер должен обработать. Если изменить его скажем на Content-type: text/plain, то браузер будет воспринимать документ просто как текст и выводить его «как есть» Для вывода заголовков в PHP используется функция header().

Конечно, послать заголовок недостаточно, нужно еще и позаботиться о том, чтобы вывести данные в нужном формате. Не следует думать, что, просто послав заголовок Content-type: application/zip и выведя «Всем привет», вы сможете открыть результат работы такого скрипта с помощью WinZip’а.

Примечание Web-сервер перед отправкой данных клиенту может добавлять и другие заголовки помимо Content-type, их рассмотрение выходит за рамки данной статьи.

Что нам потребуется

Создание изображений в PHP требует наличия библиотеки GD написанной Thomas Boutell . (http://www.boutell.com/gd) Поддержка этой библиотеки включается при компиляции PHP с опцией —with-gd. Для работы с TrueType шрифтами также может понадобиться библиотека FreeType (http://www.freetype.org). Установка обеих библиотек подробно описана в соответствующей документации.

Создаем изображения

Генерация изображения состоит из трех основных этапов:

* Создание изображения
* Отрисовка изображения
* Вывод полученной картинки в браузер

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

Перед тем, как что-либо рисовать, необходимо зарегистрировать цвета, которые вы собираетесь использовать. Для этого предназначена функция ImageColorAllocate(). Этой функции передаются идентификатор изображения и три числа, задающие цвет (RGB — red, green, blue). Функция возвращает идентификатор цвета, который используется в последующих операциях отрисовки изображения.
Пример:

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

И, наконец, вывод изображения осуществляется вызовом функции ImagePNG() или ImageGIF(). Последняя не поддерживается в текущей версии GD из-за проблем с лицензированием (разработчики GD обещают возобновить поддержку формата GIF после 7 июля 2004 года, когда истечет срок действия патентов Unisys на алгоритм сжатия LZW, используемый в GIF. Уже после написания этой статьи в библиотеку была включена поддержка форматов JPEG и WBMP. -прим. переводчика). ImagePNG() преобразует внутреннее представление изображения в PNG файл и посылает его клиенту. Аналогично работает и ImageGIF(), но используя формат GIF. Перед использованием функций ImagePNG() или ImageGIF() необходимо послать соответствующий заголовок Content-type
Формат Заголовок
PNG «Content-type: image/png»
GIF «Content-type: image/gif»

Примечание Заголовки относятся ко всему документу. То есть если вы послали заголовок, показывающий, что вы выводите изображение, вы не можете выводить текст. А после того, как вы вывели первый байт данных, заголовок уже нельзя изменить! Это значит, что сначала нужно вызвать header() и только затем начинать вывод данных, иначе вы получите сообщение об ошибке. Если вы не посылаете заголовок Content-type, PHP автоматически посылает Content-type: text/html как только вы начинаете вывод данных.

Как это выглядит на практике

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

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

У каждой кривой собственный цикл:

* Физическая: 23 дня
* Эмоциональная: 28 дней
* Интеллектуальная: 33 дня

Кривые представляют собой синусоиды, поэтому для вычисления значений биоритмов мы можем воспользоваться встроенной функцией sin()

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

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

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

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

Примечание В этом примере функция gregorianToJD() реализована на PHP (см. полный код скрипта ниже). Вообще-то, эта функция реализована в календарном модуле PHP, но на момент написания этой статьи эта функция работала некорректно в последней версии PHP. Поэтому была использована «самодельная» функция. Если в вашем PHP включена поддержка функций работы с календарем, вам нужно удалить определение этой функции из кода в примере.

Подготовка изображения

Порядок действий Подготовка к рисованию состоит из вызова нескольких функций GD. Следующий участок кода:

* Создает изображение нужных размеров.
* Регистрирует используемые цвета.
* Очищает изображения, заливая его цветом фона

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

Примечание Для простоты изложения, примеры в этой статье не содержат проверок ошибок. «Настоящий» скрипт обязательно должен включать проверки на ошибки

Рисуем рамку и выводим текст

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

* Рисуем рамку, внутри которой будет размещен график, и оси
* Выводим текст примечаний

Рисунок 1. График биоритмов

Рисуем кривые

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

* Функция drawRhythm вызывается три раза с различными параметрами
* Функция drawRhythm содержит цикл, который вычисляет значение биоритма для каждого дня, и рисует линии.

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

Вывод изображения клиенту

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

* Посылаем заголовок, показывающий что мы выводим изображение в формате GIF или PNG.
* Определяем чересстрочный формат вывода изображения.
* Делаем цвет фона прозрачным.
* Используя функцию imageGIF или imagePNG выводим изображение.

Совет После вызова imageGIF или imagePNG, изменения в изображение вносить уже нельзя, так как оно уже было отправлено клиенту.

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

Функция ImageColorTransparent() задает цвет прозрачных участков изображения (опять же, если используемый формат позволяет это). В нашем примере мы используем цвет, сохраненный в переменной $colorBackgr, делая участки изображения, нарисованные этим цветом, прозрачными.
Как использовать полученное изображение

Итак, мы написали программу, создающую изображение. Как ее использовать? На самом деле все очень просто: Вы можете использовать скрипт в HTML коде как обычный файл изображения. Поскольку скрипт в нашем примере является интерактивным, то для его использования нам нужно ввести http://my.server.net/script.php в адресную строку браузера. Для скрипта, не требующего пользовательского ввода, например получающего информацию из базы данных, просто вставьте в HTML код страницы тэг такого содержания:

Полный код скрипта

Заключение

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

Php руководство по рнр 3 0 функции работы с изображениями

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

Также не забудьте, что при изменении переменных значений в eval() эти переменные будут изменены и в основных данных.

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

Описание

Эта функция выводит сообщение и прекращает выполнение текущего скрипта. Не возвращает значение.

Описание

iptcparse

Описание
Описание

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

Описание

Идея на эту функцию принималась из Perl и всей работы кодов форматирования также как там. Строка формата состоит из кодов формата, сопровождаемые факультативным параметром ретранслятора. Параметр ретранслятора может быть или целочисленное значение или * для повторение до конца входных данных. Для a, A, h, H количество повторов определяет, сколько принимается символов одного параметра данных, для @ это безусловная позиция, где поместить следующие данные, для всего остального количество повторов определяет сколько данных будет использовано и упаковано в возникающую в результате двоичную строку. В настоящее время выполнено:

    a строка NUL-заполнений

A строка SPACE-заполнений

h Hex строка, младший полубайт вначале

H Hex строка, старший полубайт вначале

C unsigned char

s signed short (всегда 16 бит, machine byte order)

S unsigned short (всегда 16 бит, machine byte order)

n unsigned short (всегда 16 бит, big endian byte order)

v unsigned short (всегда 16 бит, little endian byte order)

i signed integer (machine dependant размер и byte order)

I unsigned integer (machine dependant размер и byte order)

l signed long (всегда 32 бит, machine byte order)

L unsigned long (всегда 32 бит, machine byte order)

N unsigned long (всегда 32 бит, big endian byte order)

V unsigned long (всегда 32 бит, little endian byte order)

f float (machine dependent размер и representation)

d double (machine dependent размер и representation)

X Копирует один байт

@ NUL-Заполнение до конкретной позиции

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

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

PHP работа с изображениями

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

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

Научившись применять основные из функций php библиотеки GD (Graphics Draw) я нашел ей применение в решении одной задачи, суть которой сводится к выравниванию масштаба всех изображений в наборе.

Дано: набор изображений для товаров интернет магазина.

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

Задача: нормализовать все картинки и получить из выше приведенного набора следующий результат.

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

Решение задачи ( PHP работа с изображениями )

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

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

  1. Вычислить размеры холста изображения;
  2. Вычислить ширину и высоту товара на изображении;
  3. Вычислить пропорции для сжатия холста вместе с изображением товара;
  4. Если товар на холсте меньше эталонного, то не сжимать его;
  5. Создать итоговый холст с нужными размерами и поместить в его центр получившуюся при сжатии картинку.

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

Как вычислить размеры внутреннего рисунка на холсте

Самой сложной из подзадач является, поиск габаритов изображения:

На приведенном рисунке

  • P0 – точка начала области изображения товара
  • H1- высота товара
  • W1- ширина товара
  • H2- расстояние от верхней границы холста до точки P0
  • W2- расстояние от левой границы холста до точки P0
  • H3- высота всего изображения картинки товара
  • W3- ширина всего изображения картинки товара

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

Найти H3 и W3 можно php функцией getimagesize() , но как бы нам вычислить H1 и W1? Что если мы вернемся к статье по распознаванию капчи? Возьмем из этой статьи алгоритм преобразования изображения в бинарную матрицу.

Бинарная матрица – это представления изображения в виде единиц и нулей, все пикселы изображения отличающиеся от фонового цвета получат значение = 0 , а пикселы составляющие само изображение будут равны 1, в итоге мы получим такую матрицу:

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

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

В готовом виде PHP скрипт будет выглядеть так:

/**
* Класс нормальзующий картинку по заданному разрешению
*/
class imageWorker <

public $baseWidth = 150 ; // длина эталонного изображения (именно товара внутри картинки)
public $baseHeight = 119 ; // высота эталонного изображения (именно товара внутри картинки)
public $outImageWidth = 600 ; // длина изображения после обработки
public $outImageHeight = 400 ; // высота изображения после обработки
public $im = null ; // дескриптор картитнки
public $binaryMartix = null ; // матричное представление картитнки
public $saveBinaryMartixTofile = false ; // сохранять матричное представление картитнки в файл
public $dir = ‘image/source/’ ; // расположения набора картинок
public $saveMartix = false ; // сохранять матричное представление картитнок
public $extensions = array ( «» , «gif» , «jpeg» , «png» ) ; // допустимые картинки
public $curImageWidth = 1 ; // ширина обрабатываемого изображения
public $curImageHeight = 1 ; // высота обрабатываемого изображения
public $imgFunctionProcess = «imagecreatefromjpeg» ; // функция для работы с изображением
public $curExt = «» ; // расширение картинки
public $curImageName = «» ; // расширение картинки
public $dirUpload = ‘image/result/’ ; // папка для выгрузки (должна быть создана)

function __construct ( $path , $w , $h ) <
$this -> outImageWidth = $w ;
$this -> outImageHeight = $h ;
$this -> curImageName = $path ;

list ( $this -> curImageWidth , $this -> curImageHeight , $type ) = getimagesize ( $this -> dir . $path ) ; // Получаем размеры и тип изображения (число)
$ext = $this -> extensions [ $type ] ;
if ( $ext ) <
$this -> imgFunctionProcess = ‘imagecreatefrom’ . $ext ; // Получаем название функции, соответствующую типу, для создания изображения
$func = $this -> imgFunctionProcess ;
$this -> curExt = $ext ;
$this -> im = $func ( $this -> dir . $path ) ; // Создаём дескриптор для работы с исходным изображением
if ( ! $this -> im ) <
return false ;
>
> else <
echo ‘Ошибка: Неизвестный формат изображения!’ ;
return false ;
>

$this -> binaryMartix = $this -> imageToMatrix ( $this -> im , false ) ;

if ( $this -> saveBinaryMartixTofile ) <
$this -> printMatrix ( $this -> binaryMartix ) ;
>

$res = $this -> explodeMatrix ( $this -> binaryMartix ) ;
$width = $res [ ‘resultInterval’ ] ;
$cropX = $res [ ‘startInterval’ ] ;

$this -> binaryMartix = $this -> imageToMatrix ( $this -> im , true ) ;
$res = $this -> explodeMatrix ( $this -> binaryMartix ) ;
$height = $res [ ‘resultInterval’ ] ;
$cropY = $res [ ‘startInterval’ ] ;

$result = «Размеры изображения (» . $path . «)
w > . $this -> curImageWidth . «px;
height=» . $this -> curImageHeight . «px;» ;
$result .= «
Размеры изделия внутри изображения
w > . $width . «px;
height=» . $height . «px;» ;
$result .= «
Коэффициенты сжатия
w > . $this -> baseWidth / $width . «px;
height=» . $this -> baseHeight / $height . «px;» ;
$result .= «
Отрезать картинку с точки
cropX=» . $cropX . »
cropY=» . $cropY . » » ;

//$this->crop(«2.png», $cropY, $cropX, $width, $height); // Вызываем функцию
//$this->reSizeImage($name, $ext, $tmp, 0.3);
echo $result ;
if ( $this -> baseHeight $height ) <
$this -> resizeImage ( $this -> baseHeight / $height ) ;
> else <
$this -> resizeImage ( 1 ) ;
> ;

imagedestroy ( $this -> im ) ;
>

function explodeMatrix ( $binaryMartix ) <
$temp = array ( ) ;

// сложение столбцов для выявления интервалов
for ( $i = 0 ; $i count ( $binaryMartix ) ; $i ++ ) <
$sum = 0 ;
for ( $j = 0 ; $j count ( $binaryMartix [ 0 ] ) ; $j ++ ) <
$sum += $binaryMartix [ $i ] [ $j ] ;
>
$temp [ ] = $sum ? 1 : 0 ;
>

// вычисление интервалов по полученной строке
$start = false ;
$countPart = 0 ;
$arrayInterval = array ( ) ;
foreach ( $temp as $k => $v ) <

//отсеиваем помехи (мелкие интервалы), Большая картинка, всяко больше 20px.

$resultInterval = 1 ;
$startInterval = 1 ; // начало интервала
foreach ( $arrayInterval as $key => $interval ) <
if ( ( $interval [ ‘end’ ] — $interval [ ‘start’ ] ) > 20 ) <
$resultInterval = $interval [ ‘end’ ] — $interval [ ‘start’ ] ;
$startInterval = $interval [ ‘start’ ] ;
>
>
return
array (
‘resultInterval’ => $resultInterval ,
‘startInterval’ => $startInterval
) ;
>

/**
* Конвертация рисунка в бинарную матрицу
* Все пиксели отличные от фона получают значение 1
* @param imagecreatefrompng $im — картинка в формате PNG
* @param bool $rotate — горизонтальная или вертикальная матрица
*/
function imageToMatrix ( $im , $rotate = false ) <
$height = imagesy ( $im ) ;
$width = imagesx ( $im ) ;

if ( $rotate ) <
$height = imagesx ( $im ) ;
$width = imagesy ( $im ) ;
>

$background = 0 ;
for ( $i = 0 ; $i $height ; $i ++ )
for ( $j = 0 ; $j $width ; $j ++ ) <

if ( $rotate ) <
$rgb = imagecolorat ( $im , $i , $j ) ;
> else <
$rgb = imagecolorat ( $im , $j , $i ) ;
>

//получаем индексы цвета RGB
list ( $r , $g , $b ) = array_values ( imageColorsForIndex ( $im , $rgb ) ) ;

//вычисляем индекс красного, для фона изображения
if ( $i == 0 && $j == 0 ) <
$background = $r ;
>
//echo «red=».$background;
$sensitivity = 15 ;
// если цвет пикселя не равен фоновому заполняем матрицу единицей
$binary [ $i ] [ $j ] = ( $r > $background — $sensitivity ) ? 0 : 1 ;
>
return $binary ;
>

/**
* Выводит матрицу на экран
* @param type $binaryMartix
*/
function printMatrix ( $binaryMartix ) <
$return = » ;
for ( $i = 0 ; $i count ( $binaryMartix ) ; $i ++ ) <
$return .= » \n » ;
for ( $j = 0 ; $j count ( $binaryMartix [ 0 ] ) ; $j ++ ) <
$return .= $binaryMartix [ $i ] [ $j ] . » » ;
>
>
file_put_contents ( $this -> dirUpload . $this -> curImageName . «.txt» , $return ) ;
>

/**
* Функция для ресайза картинки
* @paramint $koef коэффициент сжатия изображения
* @return void
*/
public function resizeImage ( $koef ) <
// получение новых размеров
$newWidth = $koef * $this -> curImageWidth ;
$newHeight = $koef * $this -> curImageHeight ;
// ресэмплирование
$image_p = imagecreatetruecolor ( $this -> outImageWidth , $this -> outImageHeight ) ;
//делаем фон изображения белым, иначе в png при прозрачных рисунках фон черный
$color = imagecolorallocate ( $image_p , 255 , 255 , 255 ) ;
imagefill ( $image_p , 0 , 0 , $color ) ;
imagecopyresampled (
$image_p , $this -> im , ( $this -> outImageWidth — $newWidth ) / 2 , ( $this -> outImageHeight — $newHeight ) / 2 , 0 , 0 , $newWidth , $newHeight , $this -> curImageWidth , $this -> curImageHeight
) ;
$func = «image» . $this -> curExt ;
$func ( $image_p , $this -> dirUpload . $this -> curImageName ) ;
imagedestroy ( $image_p ) ;
>

> // конец тела класса

/**
* Массив имен файлов
*/
$imagesName = array (
‘kameya_medium_1005858593.jpg’ ,
‘kameya_medium_1005862834.jpg’ ,
‘km0210-3_small.jpg’ ,
‘sd0202066_small.jpg’ ,
) ;

/**
* Перебор массива имен файлов и нормализация изображений
*/
foreach ( $imagesName as $image ) <
if ( file_exists ( ‘image/source/’ . $image ) ) <
// каждую картинку нормальзуем и приведем к разрешению 200×200 пикселей
$encrypt = new imageWorker ( $image , 200 , 200 ) ;
> else <
continue ;
>
>

Данный скрипт PHP работает с изображениями из папки image/source/ и по результату своего выполнения складывает нормализованные картинки в папку image/result/ .

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

Функции графических изображений

PHP не ограничен только созданием HTML вывода. PHP может также использоваться для создания и управления различными форматами изображений, включая GIF, PNG, JPG, WBMP, и XPM. Для большего удобства, PHP может вывести потоки изображения непосредственно в браузер. Для того, чтобы использовать замечательную возможность создания изображения с помощью PHP, вам необходимо иметь библиотеку функций изображений GD. GD и PHP может также требовать других библиотек, в зависимости от того, с какими форматами изображений вы хотите работать.

Вы можете использовать функции изображений в PHP, чтобы получить возможность работать с JPEG, GIF, PNG, SWF, TIFF и изображениями JPEG2000.

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

Формат изображений, которыми вы можете управлять, зависит от версии GD, который вы устанавливаете. Версии GD старше, чем gd-1.6 поддерживают формат GIF, и не поддерживают PNG, а версии больше чем gd-1.6 и меньше чем gd-2.0.28 поддерживают PNG, но не поддерживают GIF. Поддержка формата GIF вновь стала возможной в gd-2.0.28.

Замечание: Для PHP, начиная с PHP 4.3, есть связанная версия GD lib. Эта связанная версия имеет некоторые дополнительные особенности подобно alpha blending, и должна использоваться в предпочтении к внешней библиотеке, так как ее код оптимизирован для PHP и более устойчив.

Вы можете захотеть расширить GD, чтобы иметь возможность работать с большим числом форматов изображений.

Таблица 1. Поддерживаемые форматы изображений

Формат Библиотеки для скачивания Примечания
gif Поддерживаются только GD версий старше gd-1.6 и новее, чем gd-2.0.28. Только для чтения поддержка GIF доступна с PHP 4.3.0 связанной библиотекой GD. Поддержка записи доступна с PHP 4.3.9 aи с PHP 5.0.1.
jpeg-6b ftp://ftp.uu.net/graphics/jpeg/
png http://www.libpng.org/pub/png/libpng.html Поддерживается только библиотеками GD версий выше, чем gd-1.6.
xpm ftp://metalab.unc.edu/pub/Linux/libs/X/!INDEX.html Вероятно, что у вас есть эта библиотека, если ваша система имеет установленную X-среду.

Вы можете желать расширить GD, чтобы иметь дело с различными шрифтами. Следующие библиотеки шрифта поддерживаются:

Таблица 2. Поддерживаемые библиотеки шрифтов

Библиотека шрифтов Ресурсы для скачивания Примечания
FreeType 1.x http://www.freetype.org/
FreeType 2 http://www.freetype.org/
T1lib ftp://sunsite.unc.edu/pub/Linux/libs/graphics/ ) Поддержка шрифтов Type 1.

Для включения поддержки GD необходим PHP, сконфигурированный с опцией —with-gd[=DIR] , где DIR — это базовая директория GD. Для использоваеия рекомендованной связанной версии GD библиотеки (которая сначала поставлялась с PHP 4.3.0), используйте опцию конфигурации —with-gd для компиляции. GD требует libpng и libjpeg при компиляции.

В Windows включите GD2 (php_gd2.dll) как расширение в php.ini . GD1 (php_gd.dll) была удалена из PHP 4.3.2. Также обратите внимание, что функции, использующие отображение truecolor (24 бита), например imagecreatetruecolor() , требуют библиотеки GD2.

Замечание: Для включения поддержки exif в Windows, php_mbstring.dll должен быть загружен перед php_exif.dll в php.ini.

Таблица 3. Поддерживаемые форматы изображений

Формат изображения Включение в конфигурации
jpeg-6b Для включения поддержки jpeg-6b используйте —with-jpeg-dir=DIR .
png Для включения поддержки png используйте —with-png-dir=DIR . Внимание, libpng требует zlib library , которая включается опцией —with-zlib-dir[=DIR] при компиляции.
xpm Для включения поддержки xpm используйте —with-xpm-dir=DIR . Если выбор конфигурации не способен найти требуемые библиотеки, Вы можете прибавить путь к вашим библиотекам X11.

Замечание: Когда вы компилируете PHP с libpng, вы должны использовать одинаковые версии, связанные с библиотекой GD.

Расширьте возможности GD иметь дело с различными шрифтами, определяя —with-XXXX опции при компиляции PHP.

Таблица 4. Поддерживаемые библиотеки шрифтов

Библиотека шрифтов Включение в конфигурации
FreeType 1.x Для включения поддержки FreeType 1.x используйте —with-ttf[=DIR] .
FreeType 2 Для включения поддержки FreeType 2 add —with-freetype-dir=DIR .
T1lib Для включения поддержки T1lib (Type 1 fonts) add —with-t1lib[=DIR] .
Родные строковые функции TrueType Для включения поддержки для родных строковых функций TrueType добавьте —enable-gd-native-ttf .

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

Данное расширение не определяет никакие типы ресурсов.


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

Блог Александра Денисюка

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

§1. Общие принципы

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

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

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

§2. Правила безопасности

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

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

§3. Конфигурация php.ini

PHP позволяет внести определённые конфигурационные значения в процесс загрузки любых файлов. Для этого необходимо в файле php.ini найти блоки «Resource Limits», «Data Handling» и «File Uploads», а затем отредактировать, по необходимости, следующие значения:

Исходя из указанных значений, пользователь не сможет за один раз загрузить больше десяти файлов, причём каждый файл не должен превышать 5 Мбайт. Параметры из блока «Resource Limits» больше нужны для загрузки удалённого файла, т. к. с помощью cURL мы будем скачивать содержимое в переменную и проверять её по нужным нам критериям, а для этого необходимо дополнительное время и память.

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

§4. Загрузка картинок из формы

Сейчас мы не будем рассматривать загрузку нескольких файлов на сервер, а разберём лишь саму механику загрузки на примере одного файла. Итак, для загрузки картинки с компьютера пользователя необходимо с помощью HTML-формы отправить файл PHP-скрипту методом POST и указать способ кодирования данных enctype=»multipart/form-data» (в данном случае данные не кодируются и это значение применяется только для отправки бинарных файлов). С формой ниже мы будем работать дальше:

Для поля выбора файла мы используем имя name=»upload» в нашей HTML-форме, хотя оно может быть любым. После отправки файла PHP-скрипту file-handler.php его можно перехватить с помощью суперглобальной переменной $_FILES[‘upload’] с таким же именем, которая в массиве содержит информацию о файле:

Не всем данным из $_FILES можно доверять: MIME-тип и размер файла можно подделать, т. к. они формируются из HTTP-ответа, а расширению в имени файла не стоит доверять в силу того, что за ним может скрываться совершенно другой файл. Тем не менее, дальше нам нужно проверить корректно ли загрузился наш файл и загрузился ли он вообще. Для этого необходимо проверить ошибки в $_FILES[‘upload’][‘error’] и удостовериться, что файл загружен методом POST с помощью функции is_uploaded_file(). Если что-то идёт не по плану, значит выводим ошибку на экран.

Для того, чтобы злоумышленник не загрузил вредоносный код встроенный в изображение, нельзя доверять функции getimagesize(), которая также возвращает MIME-тип. Функция ожидает, что первый аргумент является ссылкой на корректный файл изображения. Определить настоящий MIME-тип картинки можно через расширение FileInfo. Код ниже проверит наличие ключевого слова image в типе нашего загружаемого файла и если его не окажется, выдаст ошибку:

На данном этапе мы уже можем загружать абсолютно любые картинки на наш сервер, прошедшие проверку на MIME-тип, но для загрузки изображений по определённым характеристикам нам необходимо валидировать их с помощью функции getimagesize(), которой скормим сам бинарный файл $_FILES[‘upload’][‘tmp_name’]. В результате мы получим массив максимум из 7 элементов:

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

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

На этом загрузка изображения завершена. Для более удобной загрузки файлов можете использовать класс UploadedFile из пакета Symfony HttpFoundation, который является обёрткой для $_FILES и также сохраняет файл через move_uploaded_file().

§5. Загрузка изображения по ссылке

Для загрузки изображения по ссылке нам понадобиться библиотека cURL, которая работает с удалёнными ресурсами. С помощью неё мы скачаем контент в переменную. С одной стороны может показаться, что для этих целей подойдёт file_get_contents(), но на самом деле мы не сможем контролировать объём скачиваемых данных и нормально обрабатывать все возникшие ошибки. Для того, чтобы cURL корректно скачал данные нам нужно: разрешить следовать перенаправлениям, включить проверку сертификата, указать максимальное время работы cURL (формируется за счёт объёма скачиваемых данных и средней скорости работы с ресурсом). Как правильно скачать файл в переменную показано ниже с необходимыми параметрами:

Если всё прошло успешно и cURL уложился в 60 секунд, тогда содержимое по ссылке будет скачано в переменную $raw. Кроме того, функция curl_getinfo() вернёт информацию о проделанном запросе, откуда мы можем получить дополнительную информацию для анализа работы с удалёнными ресурсами:

Дальше нам нужно проверить нет ли ошибок в curl_errno() и удостовериться, что ресурс отдаёт равный 200, иначе мы скажем, что по такому-то URL ничего не найдено. После всех проверок переменную $raw передаём в getimagesizefromstring() и работаем уже по отработанной схеме как в случае с загрузкой картинок из формы.

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

§6. Настройка выбора нескольких файлов

В этом параграфе разберём способы загрузки нескольких изображений за один раз с локальной машины пользователя и по удалённым ссылкам. Для отправки ссылок мы задействуем $_POST и передадим ей все данные с помощью тега textarea. Для загрузки файлов из формы мы продолжим дальше работать с $_FILES. Наша новая HTML-форма будет немного отличаться от старой.

В конец имени поля выбора файла name=»upload[]» добавились фигурные скобки и аттрибут multiple, который разрешает браузеру выбрать несколько файлов. Все файлы снова загрузятся во временную папку, если не будет никаких ошибок в php.ini . Перехватить их можно в $_FILES, но на этот раз суперглобальная переменная будет иметь неудобную структуру для обработки данных в массиве. Решается эта задача небольшими манипуляциями с массивом:

Для загрузки нескольких картинок по URL передадим наши ссылки через textarea с именем name=»upload», где их можно указать через пробел или с новой строки. Функция preg_split разберёт все данные из $_POST[‘upload’] и сформирует массив, по которому нужно пройтись циклом и каждый валидный URL отправить в обработчик.

Вы можете улучшить форму для загрузки изображений, например, воспользоваться библиотекой FineUploader или jQuery FileUpload, чтобы настроить выбор картинок с определённым расширением.

Основы работы с библиотекой GD

Дата публикации: 2013-11-18

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

Введение

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

Поэтому, так как, библиотека является расширением, значит необходимо убедиться, что она подключена в Вашем интерпретаторе языка PHP. Для этого необходимо открыть главный конфигурационный файл PHP – php.ini. Если Вы используете Denver, значит Вам необходимо, перейти в виртуальный диск, созданный им (в моем случае это диск Z). И затем по адресу: Z:\usr\local\ php5. В корне папки php5 Вы найдете необходимый файл. Далее открываем данный файл в текстовом редакторе, находим строчку: extension=php_gd2.dll

Как создать сайт самому?

Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

Если напротив данной строки, нет символа “;” (точка с запятой), значит расширение подключено, если же символ есть – его необходимо удалить и перезапустить Denver. В этом случае Вы подключите библиотеку. Теперь можно приступать к работе с данной библиотекой.

Самые основы. Как работает PHP.

Отличие веб-приложения от обычной программы
Начиная писать программы для веба, многие начинающие программисты сталкиваются с такой ошибкой. Они рассматривают систему браузер-сервер, как обычное приложение. Интерактивное. Нажал кнопку — система среагировала. Провел мышкой — среагировала. Вся информация, которая доступна клиенту — доступна и программе, программа все время находится в памяти.
Так вот, в веб-программировании это не так!.
В момент, когда пользователь видит перед собой страницу и начинает совершать какие-то действия с ней, PHP уже завершил работу! И пользователь взаимодействует не с PHP скриптом, а со своей страницей HTML, которую он получил в браузер. Результатом работы скрипта на PHP в большинстве случаев является обычный текст. Текст HTML страницы. Которая отдается браузеру и показывается им, как обычный HTML. Вы сами можете в этом убедиться, написав в скрипте
echo «Привет, Вася!» ; ?> ;
А потом просмотрев в браузере исходный текст полученной страницы. Никаких тегов PHP там нет! Только
Привет, Вася!
Потому, что PHP исполняется на сервере!

Сервер и браузер общаются, посылая друг другу запросы по особому протоколу — HTTP. Соединение может инициировать только браузер. Он посылает серверу запрос — показать такой-то файл. Сервер клиенту файл посылает.
Только так и происходит. Клиент запросил — сервер отдал. И забыл сразу о клиенте. Отсюда становится понятным ответ на вопрос, можно ли точно узнать, сколько юзеров сечас на сайте. Нельзя. потому, что «на сайте» нету ни одного. Они соединяются, запрашивают страницу, и отсоединяются. Не имеют постоянного cоединения с сервером, как, например, игроки в Кваку. Узнать можно только примерно, записывая время каждого соединения и выбирая записи за определенный промежуток времени.

Так же, отсюда становится ясно, что сервер может узнать о клиенте очень мало. Только то, что клиент пришлет в HTTP-запросе. Разрешения экрана там нет ;-)
Все, что сервер может знать о клиенте, можно посмотреть командой phpinfo()

Пример общения браузера с сервером:
Пользователь нажимает на ссылку, браузер посылает запрос серверу и ждет ответа:
Браузер -> PHP
PHP выполняет скрипт, отдает результат в браузер и завершает работу:
PHP -> браузер
Браузер отображает страницу, «просматривая» её на предмет ссылок, которые надо запросить у сервера (теги ,
Мы просто пишем
= «Вася» ;
?>

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

Как передать переменную из яваскрипта в PHP?
Точно так же, как и любые другие данные — послав запрос на сервер.
Но надо четко понимать, что во время выполнения php скрипта получить что-либо из яваскрипта, разумеется, невозможно. Передать можно будет только при следующем запросе. И обрабатывать его будет уже другой PHP скрипт.
Если надо по событию onClick обратиться к базе данных, то следует помнить, что она находится на сервере. То есть, надо запрашивать сервер, который запустит PHP скрипт, который обратится к базе, получит от неё ответ и передаст его в браузер.

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

Способы общения браузера с сервером.
Способов, предоставляемых протоколом HTTP, немного. Это важная информация. Никаких других способов нет. На практике используются два:
GET — это когда данные передаются в адресной строке, например, когда пользователь жмет ссылку.
POST — когда он нажимает кнопку в форме.
Сформировали страницу со ссылкой или с формой методом GET — запрос придет GET-ом. Сформировали с формой, в которой указан метод POST — придет POST-ом.
Определить, какой способ следует применять, очень просто. Если форма служит для запроса некой информации, например — при поиске, то ее следует отправлять методом GET. Чтобы можно было обновлять страницу, можно было поставить закладку и или послать ссылку другу.
Если же в результате отправки формы данные записываются или изменяются на сервере, то следует их отправлять методом POST, причем обязательно после обработки формы надо перенаправить браузер методом GET. Так же, POST может понадобиться, если на сервер надо передать большой объём данных (у GET он сильно ограничен), а так же, если не следует «светить» передаваемые данные в адресной строке (при вводе логина и пароля, например). Но в любом случае, после обработки POST надо всегда перенаправлять браузер на какую-нибудь страницу, пусть ту же самую, но уже без данных формы, чтобы при обновлении страницы они не записывались повторно. Например:
header ( «Location: http://» . $_SERVER [ ‘HTTP_HOST’ ]. $_SERVER [ ‘REQUEST_URI’ ]);
exit;

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

Полезная информация может содержаться в различных НТТР заголовках.
Cookie — если сервер поставил куку, и она не устарела, то браузер отсылает ее вместе с каждым запросом.
HTTP authentication — если сервер запрашивал HTTP авторизацию, то браузер при каждом обращении шлет введенные логин и пароль.

РНР может посылать HTTP заголовки двумя командами — header() и setcookie() .

Просмотр обмена HTTP заголовками
Я очень рекомендую попрактиковаться с HTTP заголовками, посмотреть, как ими обмениваются сервер и клиент.
Для этого есть множество разных способов. Если у вас стоит популярный download manager FlashGet, то можно использовать его. Так же заголовки показывает популярная программа Proxomitron, можно скачать какие-нибудь специальные утилиты.
Для IE можно предложить плагин http://blunck.se/iehttpheaders/iehttpheaders.html
Для браузера Mozilla есть удобный плагин http://livehttpheaders.mozdev.org/
Так же, существует много других утилит, легко находимых в сети по запросу HTTP sniffer.
Обязательно воспользуйтесь любым способом посмотреть HTTP заголовки, которыми обменивается браузер с сервером. Это очень хорошая практика, а так же проверка — что шлет твой скрипт. Удобно при отладке установки кук или проблемах с сессиями.
Примерное представление о пришедших заголовках можно также получить, воспользовавшись функцией getallheaders() . Но следует учитывать, что работает она только если PHP собран, как модуль.

ОЧЕНЬ ВАЖНОЕ ЗАМЕЧАНИЕ
Из того факта, что PHP исполняется на сервере, и посылает результат своей работы браузеру, следует один простой, но очень важный вывод. Что PHP в принципе НЕ МОЖЕТ отобразить в браузере ничего такого, что невозможно было бы сделать средствами html.
ПРЕЖДЕ, чем что-то писать на PHP — попробуйте это сделать чистым HTML.
«Нажатие на Энтер» не переводит строку? А в html вы не пробовали таким образом строки переводить? Не получилось? Какая досада. Прочитайте, как в html сделать перевод строки и приходите снова.

PHP в результате своей работы формирует не картинку с текстами, как вы ее видите на экране монитора! PHP формирует HTML код! И этот код ЗНАЧИТЕЛЬНО отличается от того изображения, которое вы видите на экране. Если у вас что-то не получается, то надо всегда смотреть именно ИСХОДНЫЙ код страницы, а не то, как вам ее рисует браузер. В браузере Internet Explorer исходный код можно посмотреть, выбрав в меню Вид — Просмотр HTML-кода.
Если у вас не работает яваскрипт, сформированный PHP скриптом, или html показывает не то, что вы хотите, то исправить эту проблему очень просто.
1. Сначала пишете нужный яваскрипт или html руками. Если у вас с этим проблемы — обратитесь в соотвествующий форум — по яваскрипту или html. PHP тут не при чём.
2. Сравниваете с тем, что получено из PHP
3. Вносите исправления в PHP скрипт, чтобы текст, отдаваемый им, не отличался от написанного руками.

Браузер не умеет показывать файлы, в которые напихан одновременно и html картинки. Браузер умеет показывать только известные ему типы данных. В частности, это ИЛИ html ИЛИ картинка. Но не вместе. Если картинка — то ОДНА. Несколько картинок подряд браузер показывать не умеет. Браузер умеет показывать HTML, в котором прописаны ССЫЛКИ на несколько картинок.
Пожалуйста, прежде, чем изучать PHP — изучите хотя бы основы HTML! Прежде, чем что-то требовать от PHP — попробуйте сделать это на html.

Php руководство по рнр 3 0 функции работы с изображениями

Форум Приднестровской поддержки CMS XOOPS.

По ссылке вы можете скачать последнюю версию CMS XOOPS. А так же прочитать инструкции по установке XOOPS и модулей

По данным ссылкам можно скачать модули нашей разработки.

Модуль инструкций. Ознакомьтесь с установкой XOOPS. C начальными познаниями по HTML,CSS, JS, PHP и др.

Добро пожаловать на сайт поддержки XOOPS.

Приднестровская поддержка XOOPS

Создание файла, запись в файл, вывод содержимого файла в список

Рассмотрим основные функции для работы с файлами.

□ fopen ( , [, [, ]]) открывает файл и возвращает дескриптор (идентифика­тор). Параметр может принимать следующие значения:

  • • r — только чтение. После открытия файла указатель устанавливается на начало файла. Если файл не существует, функция fopen() вернет false;
  • • r+ — чтение и запись. После открытия файла указатель устанавлива­ется на начало файла. Если файл не существует, функция fopen() вернет false;
  • • w — запись. Если файл не существует, то он будет создан. Если файл существует, то он будет перезаписан. После открытия файла указа­тель устанавливается на начало файла;
  • • w+ — чтение и запись. Если файл не существует, то он будет создан. Если файл существует, то он будет перезаписан. После открытия файла указатель устанавливается на начало файла;
  • • a — запись. После открытия файла указатель устанавливается на ко­нец файла. Если файл не существует, функция fopen() вернет false;
  • • a+ — чтение и запись. После открытия файла указатель устанавлива­ется на конец файла. Если файл не существует, то он будет создан. Содержимое файла не удаляется.
  • Кроме того, после режима может следовать модификатор:
  • b — файл будет открыт в бинарном режиме (по умолчанию);
  • t — файл будет открыт в текстовом режиме.

□ flock( , [, ]) позволяет блокировать файл или снять блокировку. Параметр может при­нимать следующие значения:

  • LOCK_SH или 1 — разделяемый доступ для чтения. Если другой про­цесс хочет записать что-либо в файл, то ему придется подождать сня­тия блокировки;
  • LOCK_EX или 2 — монопольный режим для записи. Файл не доступен для совместного использования;
  • LOCK_UN или 3 — снимает блокировку.

□ fread( , ) позволяет прочитать из файла строку указанной длины. Если функции не удалось прочесть заданное число байтов, то она возвратит то, что удалось прочитать.

□ fgets( [, ]) позволяет считывать из фай­ла по одной строке за раз. Считывание будет выполняться до тех пор, по­ка не встретится символ новой строки (\n), символ конца файла или из файла не будет прочитано указанное количество байт.

□ file( [, [, ]]) читает весь файл в массив, каждый элемент которого будет равен одной строке, про­читанной из файла. В параметре могут быть указаны следующие значения:

  • • FILE_USE_INCLUDE_PATH — поиск файла будет осуществлен в катало­гах, перечисленных в директиве include_path;
  • • FILE_IGNORE_NEW_LINES — не добавлять символ новой строки в конец элемента массива;

• FILE_SKIP_EMPTY_LINES — игнорировать пустые строки.

открывает файл и выводит все его содержимое в окно Web-браузера. Ес­ли во втором параметре указано значение true, то поиск файла будет осуществлен в каталогах, перечисленных в директиве include_path.

□ file_get_contents( [, [, [, [, ]]]]) возвращает содер­жимое файла в виде строки. В отличие от функции readfile() не выво­дит содержимое файла в окно Web-браузера. Если в параметре указано значение FILE_USE_INCLUDE_PATH, то поиск файла будет осуще­ствлен в каталогах, перечисленных в директиве include_path.

□ fwrite( , ) записывает данные в файл.

□ fflush( ) записывает изменения из буфера ввода/вывода на диск. Используется при обработке файлов большого объема, так как обычно запись на диск производится только при закрытии файла.

□ fclose( ) закрывает файл.

□ file_put_contents() записывает данные в файл. Если файл не существу­ет, то он будет создан. Если файл существует, то по умолчанию он будет перезаписан. Для записи в конец файла следует указать флаг FILE_APPEND. Вызов функции эквивалентен последовательности вызовов функций fopen(), fwrite() и fclose(). Формат функции:

В параметре могут быть указаны следующие значения (или их комбинация):

  • FILE_USE_INCLUDE_PATH — поиск файла будет осуществлен в катало­гах, перечисленных в директиве include_path;
  • FILE_APPEND — если файл существует, то данные будут добавлены в конец содержимого файла;
  • LOCK_EX — монопольный режим для записи. Файл не доступен для совместного использования.

Для примера создадим файл file.txt и запишем в него пять E-mail адресов по одному на строчке (листинг 41).

Листинг 41. Создание файла и запись в него

Если в процессе создания файла возникнет ошибка, то она будет подавлена оператором @, а в окне Web-браузера будет выведено сообщение «Ошибка». При этом дальнейшая обработка файла будет остановлена.

Теперь добавим новую запись в конец файла (листинг 42).

Листинг 42. Добавление новой записи в конец файла

А теперь выведем содержимое файла в список (листинг 43).

Листинг 43. Вывод содержимого файла в список

Перестаньте изобретать изобретенное: 8 полезных PHP библиотек, которые заменят ваши велосипеды

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

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

Imanee

Пожалуйста, хватит писать свои функции для работы с графикой!

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

ZIP Service, Москва, можно удалённо, от 100 000 ₽

Чтобы окончательно убедить вас не писать что-то своё, приведем несколько примеров.

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

То же самое касается и установки на изображение своего копирайта:

Официальный GitHub репозиторий: Imanee

Сайт с документацией и котиком: Imanee.io

PHP Benchmark

Перестаньте писать свои решения с запоминанием таймстампов в переменные и сравнением, ваши проблемы решает PHP Benchmark — бесплатная библиотека с открытыми исходниками.

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

Подключив PHP Benchmark и прописав в нужных местах следующую строчку:

можно получить детальный отчет по работе приложения.

Вот пример для популярной платформы WordPress:

Подробную документацию, как и исходники, вы можете найти на гитхабе: PHP-Benchmark

RegExp Builder

Являясь бесплатным портом известной JavaScript библиотеки, PHP RegExp Builder позволяет полностью забыть о регулярках, их синтаксисе и искусстве написания. С использованием этого инструмента валидацию, поиск и замену сложных по структуре данных — основные области применения регулярных выражений — стало делать ещё проще.

Выражения, созданные в Builder’е, легко читать и изменять — всё состоит из так называемых «цепочек».

Пример создания регулярного выражения с RegExp Builder:

Скачать библиотеку можно на GitHub: RegExp Builder

Там же доступна и документация: RegExp Builder Wiki

PHP FaceDetection

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

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

Mobile Detect

Mobile Detect — легковесный класс с открытым исходным кодом, предназначенный для определения модели мобильного устройства клиента. Для «детекта» он использует User-Agent в сочетании с HTTP заголовками и свою обширную базу данных — это делает количество ложных срабатываний минимальным.

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

Документация и ссылка на скачивание: mobiledetect.net

ABLincoln

ABLinkoln — написанная на PHP реализация фреймворка PlanOut от Facebook, предназначенного для A/B тестов — тестов, использующихся для оценки эффективности веб-страницы и повышения конверсии, или, другими словами, сплит-тестирования.

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

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

Документация, исходники и примеры кода — на GitHub.

phpQuery

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

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

Это, по сути, PHP вариант jQuery, обладающий почти всем, что есть в оригинале. Помимо удобства использования, phpQuery еще и гораздо быстрее своих конкурентов, а значит, лучше всего подойдет для работы с большим объемом данных.

Вот небольшой пример использования phpQuery для обработки элементов списка (li):

Библиотека и документация к ней доступны на официальной странице в Google Code.

mPDF — одна из лучших библиотек для генерации документов в формате PDF. В отличие от своих конкурентов, mPDF в полной мере поддерживает русский язык, вставку картинок, форматирование и, самое главное, HTML и CSS.

Основанный на открытом движке инструмент очень прост в использовании: на вход вы подаете почти обычную веб-страницу — на выходе получаете полноценный PDF.

Более подробную документацию, пример кода и ссылку на скачивание вы найдете на официальном сайте: mpdf1.com

Программирование на языке PHP для чайников. Часть 1

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

Используется он для создания веб-проектов. Может использоваться прямо в HTML коде. И хотя результат работы скрипта часто выводится непосредственно в браузере клиента, для работы PHP не достаточно только одного браузера. То-есть вам не получится запустить index.php файл прямо в браузере, как вы уже наверняка делали с файлом index.html. Для работы PHP сценариев и веб-страниц созданных с применением PHP потребуется веб-сервер.

Если у вас еще нет хостинг площадки для вашего сайта, тогда рекомендую поэкспериментировать с PHP сценариями на локальном сервере, предназначенном для тестирования проектов. Для организации локального сервера в операционной системе Windows (WAMP, Windows-Apache-MySQL-PHP) могут быть полезны пакеты: Денвер, XAMPP, AppServ, OpenServer и т.д. После установки этих пакетов, вы получите уже настроенный и готовый к использованию сервер, а управляться он будет через удобное меню самой программы. Также, существуют и отдельные реализации APACHE, MySQL и PHP для операционной системы Windows, но настраивать их придется уже самостоятельно через конфигурационные файлы и не будет никакого меню с галочками. Для запуска, перезапуска и остановки такого сервера можно будет использовать пакетные файлы *.bat или *.cmd (батник) с командами запуска, перезапуска или остановки служб APACHE и MySQL. Третий и самый непростой для новичка вариант — это виртуальная машина с установленной и настроенной операционной системой Linux (LAMP, Linux-Apache-MySQL-PHP). Готовые образы таких «виртуалок» часто встречаются в Интернете, так что вам могут понадобиться только знания настройки программ типа VirtualBox или VMware.

Подготовка к программированию на языке PHP для чайников

  1. PHP код следует помещать в файле index.php, сам файл должен быть размещен в корневом каталоге сайта, расположенного на веб-сервере.
  1. Весь код на языке PHP должен быть заключен между дескрипторами или сокращенный вариант , но веб-сервер может быть не сконфигурирован для использования сокращенного варианта такой записи, поэтому предпочтителен первый вариант.
  2. Вставлен PHP код может быть в любое место HTML кода.
  3. Комментирование в PHP коде осуществляется следующим образом:
  1. Для того, чтобы посмотреть ваш код, откройте веб-браузер и в адресной строке введите: http://localhost/www/MyEX/index.php

Вывод данных на экран с помощью языка PHP для чайников

  1. Вывод данных в окно (клиентскую область веб-браузера) с помощью PHP можно выполнить посредством оператора echo. Этот оператор позволяет вывести данные различных типов: числа, символьные строки и т.д.
  2. Синтаксис оператора вывода:
  1. Строковые данные заключаются в двойные или одинарные кавычки. В двойных кавычках код интерпретируется PHP. Все, что заключено в одинарные кавычки выводится без какой бы ни было интерпретации. Пример:

Пример $x кода

Пример $x кода

  1. Для вывода более подробной информации о переменной, которая может понадобиться при отладке программы, служит функция var_dump(). Ее синтаксис:
  1. В списке переменных указывается одно или несколько имен переменных. Эта функция ничего не возвращает. Пример:
  1. Менее информативной, чем var_dump(), функцией вывода сведений о переменных является:
  1. Для переменных типа «массив» эта функция выводит список вида индекс => элемент.

Переменные языка РНР для чайников

  1. Переменные – контейнеры для хранения данных. Данные, сохраняемые в переменной, называют значением этой переменной.
  2. Переменная имеет имя – последовательность букв, цифр и символа подчеркивания без пробелов и знаков препинания, начинающаяся обязательно с символа доллара ($), за которым должна следовать буква или символ подчеркивания.
  3. Правильные имена переменных: $_tel, $tmp, $my_, $address_234_45.
  4. Неправильные имена переменных: $234tel, my address, $tel:234.
  5. РНР является регистро-ависимым языком относительно имен переменных и констант. Однако ключевые слова могут использоваться в любом регистре.

Типы данных языка РНР и преобразование данных для чайников

Тип данных Пример Описание значений
Строковый или символьный (string) «Привет всем»
«123456»
«25 рублей»
Последовательность символов, заключенная в кавычки
Целочисленный, числовой (integer) -234
25
Число или последовательность цифр, перед которыми может быть указан знак числа
Числовой с плавающей точкой (float) 5.47
21.4
35E-3
Число с дробной частью (35Е2 означает 3500)
Логический (булевый, boolean) true
false
Этот тип имеет два значения: true (истина, да), false (ложь, нет)
NULL null Этот тип данных имеет одно значение — null
Массив (Array) Этот тип данных имеет одно множество значений, которые могут быть различных типов
Объект (Object) Программный объект, определяемый своими свойствами
  1. Для того, чтобы узнать какой тип переменной, нужно воспользоваться функцией:
  1. Для явного задания типа можно воспользоваться одним из двух способов:

Константы языка PHP для чайников

  1. Константой называется именованная величина, которая не изменяется в процессе выполнения программы (скрипта).
  2. В отличие от переменных, вы не можете изменять значения констант, которые были им присвоены при их объявлении. Константы удобно использовать для хранения значений, которые не должны изменяться во время работы программы. Константы могут содержать только скалярные данные (логического, целого, плавающего и строкового типов).
  3. В РНР константы определяются функцией define(). Вот ее синтаксис:

$name — имя константы.
$value — значение константы.
$case_sen — необязательный параметр логического типа, указывающий, следует ли учитывать регистр букв (true) или нет (false).

  1. Для проверки существования константы можно использовать функцию defined(). Данная функция возвращает true, если константа объявлена. Пример:

Различия между константами и переменными в языке PHP для чайников

  1. У констант нет приставки в виде знака доллара ($).
  2. Константы можно определить только с помощью функции define(), а не присваиванием значения.
  3. Константы могут быть определены и доступны в любом месте без учета области видимости.
  4. Константы не могут быть определены или аннулированы после первоначального объявления.
  5. Константы могут иметь только скалярные значения.

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

Илон Маск рекомендует:  Двух и трехмерное вращение
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL