Открытие и закрытие файлов
Для открытия файлов в PHP определена функция fopen(). Она имеет следующее определение: resource fopen(string $filename, string $mode)
. Первый параметр $filename
представляет путь к файлу, а второй - режим открытия. В зависимости от цели открытия и типа файла данный параметр может принимать следующие значения:
-
'r'
: файл открывается только для чтения. Если файла не существует, возвращаетfalse
-
'r+'
: файл открывается только для чтения с возможностью записи. Если файла не существует, возвращаетfalse
-
'w'
: файл открывается для записи. Если такой файл уже существует, то он перезаписывается, если нет - то он создается -
'w+'
: файл открывается для записи с возможностью чтения. Если такой файл уже существует, то он перезаписывается, если нет - то он создается -
'a'
: файл открывается для записи. Если такой файл уже существует, то данные записываются в конец файла, а старые данные остаются. Если файл не существует, то он создается -
'a+'
: файл открывается для чтения и записи. Если файл уже существует, то данные дозаписываются в конец файла. Если файла нет, то он создается
Результатом функции fopen будет дескриптор файла. Этот дескриптор используется для операций с файлом и для его закрытия.
После окончания работы файл надо закрыть с помощью функции fclose(), которая принимает в качестве параметра дескриптор файла. Например, откроем и закроем файл:
$fd
=
fopen
(
"form.php"
,
'r'
)
or
die
(
"не удалось открыть файл"
);
fclose(
$fd
);
Конструкция or die("текст ошибки")
позволяет прекратить работу скрипта и вывесте некоторое сообщение об ошибке, если функция fopen
не смогла открыть файл.
Чтение файла
Для чтения файла можно использовать несколько функций. Для построчного чтения используется функция fgets(), которая получает дескриптор файла и возвращает одну считанную строку. Пройдем построчно по всему файлу:
$fd
=
fopen
(
"form.php"
,
'r'
)
or
die
(
"не удалось открыть файл"
);
while
(!
feof
(
$fd
))
$str
= htmlentities(
fgets
(
$fd
));
echo
$str
;
fclose(
$fd
);
При каждом вызове fgets()
PHP будет помещать указатель в конец считанной строки. Чтобы проследить окончание файла, используется функция feof(), которая возвращает true
при завершении файла. И пока не будет достигнут конец файла, мы можем применять функцию fgets().
Чтение файла полностью
Если нам надо прочитать файл полностью, то мы можем облегчить себе жизнь, применив функцию file_get_contents():
1 2 3 4 | <?php $str = htmlentities( file_get_contents ( "form.php" )); echo $str ; ?> |
<?php
$file = 'people.txt';
// Открываем файл для получения существующего содержимого
$current = file_get_contents($file);
// Добавляем нового человека в файл
$current .= "John Smith\n";
// Пишем содержимое обратно в файл
file_put_contents($file, $current);
?>
При этом нам не надо открывать явно файл, получать дескриптор, а затем закрывать файл.
Поблочное считывание
Также можно провести поблочное считывание, то есть считывать определенное количество байт из файла с помощью функции fread():
1 2 3 4 5 6 7 8 9 | <?php $fd = fopen ( "form.php" , 'r' ) or die ( "не удалось открыть файл" ); while (! feof ( $fd )) ( $str = htmlentities( fread ( $fd , 600)); echo $str ; ) fclose( $fd ); ?> |
Функция fread()
принимает два параметра: дескриптор считываемого файла и количество считываемых байтов. При считывании блока указатель в файле становится в конец этого блока. И также с помощью функции feof()
можно отследить завершение файла.
Запись файла
Для записи файла применяется функция fwrite(), которая записывает в файл строку:
1 2 3 4 5 6 | <?php $fd = fopen ( "hello.txt" , 'w' ) or die ( "не удалось создать файл" ); $str = "Привет мир" ; fwrite( $fd , $str ); fclose( $fd ); ?> |
Аналогично работает другая функция fputs():
1 2 3 4 5 6 | <?php $fd = fopen ( "hello.txt" , 'w' ) or die ( "не удалось создать файл" ); $str = "Привет мир" ; fputs ( $fd , $str ); fclose( $fd ); ?> |
Работа с указателем файла
При открытии файла для чтения или записи в режиме 'w', указатель в файле помещается в начало. При считывании данных PHP перемещает указатель в файле в конец блока считанных данных. Однако мы также вручную можем управлять указателем в файле и устанавливать его в произвольное место. Для этого надо использовать функцию fseek, которая имеет следующее формальное определение:
int fseek (resource $handle , int $offset [, int $whence = SEEK_SET ] )
Параметр $handle представляет дескриптор файла. Параметр $offset
- смещение в байтах относительно начала файла, с которого начнется считывание/запись. Третий необязательный параметр задает способ установки смещения. Он может принимать три значения:
-
SEEK_SET: значение по умолчанию, устанавливает смещение в offset байт относительно начала файла
-
SEEK_CUR: устанавливает смещение в offset байт относительно начала текущей позиции в файле
-
SEEK_END: устанавливает смещение в offset байт от конца файла
В случае удачной установки указателя функция fseek()
возвращает 0, а при неудачной установке возвращает -1.
Пример использования функции:
1 2 3 4 5 6 7 8 | $fd = fopen ( "hello.txt" , 'w+' ) or die ( "не удалось открыть файл" ); $str = "Привет мир!" ; // строка для записи fwrite( $fd , $str ); // запишем строку в начало fseek ( $fd , 0); // поместим указатель файла в начало fwrite( $fd , "Хрю" ); // запишем в начало строку fseek ( $fd , 0, SEEK_END); // поместим указатель в конец fwrite( $fd , $str ); // запишем в конце еще одну строку fclose( $fd ); |
Поиск части строки в файле
$file = 'https';
$count = file_get_contents($file);
$begin = 'Начало перед строкой поиска';
$end = 'Конец после строкой поиска';
preg_match_all('#'.$begin.'(.+?)'.$end.'#is', $count, $arr);
$sura = implode(”, $arr[1]);
Отправка почты функция mail()
Пример #1 Отправка письма.
Использование функции mail() для отправки простого письма:
<?php
// Сообщение
$message = "Line 1\r\nLine 2\r\nLine 3";
// На случай если какая-то строка письма длиннее 70 символов мы используем wordwrap()
$message = wordwrap($message, 70, "\r\n");
// Отправляем
mail('caffeinated@example.com', 'My Subject', $message);
?>
Пример #2 Отправка письма с дополнительными заголовками.
Добавление простых заголовков, сообщающих почтовому агенту адреса From и Reply-To:
<?php
$to = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
'Reply-To: webmaster@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
?>
Пример #3 Отправка письма с дополнительными заголовками, переданными массивом
В этом примере посылается то же письмо, что и в примере выше, но дополнительные заголовки задаются массивом (доступно с PHP 7.2.0).
<?php
$to = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = array(
'From' => 'webmaster@example.com',
'Reply-To' => 'webmaster@example.com',
'X-Mailer' => 'PHP/' . phpversion()
);
mail($to, $subject, $message, $headers);
?>
Пример #4 Отправка письма с дополнительными аргументами командной строки.
Параметр additional_params
может быть использован для передачи дополнительных параметров программе, используемой для отправки писем с помощью директивы sendmail_path
.
<?php
mail('nobody@example.com', 'the subject', 'the message', null,
'-fwebmaster@example.com');
?>
Пример #5 Отправка HTML-сообщения
С помощью функции mail() также можно отправить и HTML-письмо.
<?php
// несколько получателей
$to = 'johny@example.com, sally@example.com'; // обратите внимание на запятую
// тема письма
$subject = 'Birthday Reminders for August';
// текст письма
$message = '
<html>
<head>
<title>Birthday Reminders for August</title>
</head>
<body>
<p>Here are the birthdays upcoming in August!</p>
<table>
<tr>
<th>Person</th><th>Day</th><th>Month</th><th>Year</th>
</tr>
<tr>
<td>Johny</td><td>10th</td><td>August</td><td>1970</td>
</tr>
<tr>
<td>Sally</td><td>17th</td><td>August</td><td>1973</td>
</tr>
</table>
</body>
</html>
';
// Для отправки HTML-письма должен быть установлен заголовок Content-type
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
// Дополнительные заголовки
$headers[] = 'To: Mary <mary@example.com>, Kelly <kelly@example.com>';
$headers[] = 'From: Birthday Reminder <birthday@example.com>';
$headers[] = 'Cc: birthdayarchive@example.com';
$headers[] = 'Bcc: birthdaycheck@example.com';
// Отправляем
mail($to, $subject, $message, implode("\r\n", $headers));
?>
imap_mail
(PHP 4, PHP 5, PHP 7, PHP 8)
imap_mail — Отправить email
Описание
string
$to
,string
$subject
,string
$message
,?string
$additional_headers
= null
,?string
$cc
= null
,?string
$bcc
= null
,?string
$return_path
= null
): bool
Эта функция позволяет отправлять сообщения с корректной обработкой получателей
php скрипт анализа посетителей сайта ip, время, url
Скрипт аналитики сайта
<?php
$file = $_SERVER['DOCUMENT_ROOT'].'/url.txt';
$current = file_get_contents($file);$ps = $_SERVER["REMOTE_ADDR"];
$current .= $ps.' date: '.date("d-m-Y H:i:s").' url: '.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'].'
';file_put_contents($file, $current);
?>
Создайте в корне сайта пустой текстовый файл url.txt, а текущий код поместите в любое место вашего сайта. Теперь при любых обращениях, открытиях страниц или странных ссылок, все будет писаться в файл good.txt - ip пользователя, дата и время, url запрос. Каждое обращение с новой строки.
Не забывайте периодически очищать файл good.txt. Например, раз в месяц, так как количество информации в нем может быть достаточно приличным.
Откуда вообще появляются эти странные url запросы?
Дело в том, что сеть постоянно мониторят роботы злоумышленников на предмет наличия определенных движков (Joomla, WordPress). В некоторых из них могут стоять старые компоненты, плагины, делая запрос к которым их можно взломать. Поэтому роботы сканируют сайты на предмет наличия этих уязвимостей и при необходимости атакуют сайт.
РИСОВАНИЕ ПРЯМОУГОЛЬНИКА, КРУГА И ДРУГИХ ФИГУР В PHP.
Наступил момент, когда нам требуется рисовать более сложные фигуры с помощью gd библиотеки в php. Прямоугольники часто используются для создания таблиц и графиков, а круги для диаграмм. Научимся их создавать.
Давайте сначала рассмотрим php код, а затем разберем его синтаксис:
<?php header("Content-type: image/png; charset=utf-8");
//создаем поле, где рисовать
$img = imagecreate (800, 600);
$white = imagecolorallocate($img, 255, 255, 255);
$green = imagecolorallocate($img, 30, 180, 155);
$gray = imagecolorallocate($img, 130, 120, 135);
$pink = imagecolorallocate($img, 255, 128, 255);
// Рисование прямоугольника
imagerectangle($img,20,60,200,180,$green);
imagefilledrectangle($img,220,60,400,180,$green);
imagefilledrectangle($img, 420, 60, 600, 180, $gray); imagerectangle($img,420, 60, 600, 180,$green);
// Рисование эллипса и круга
imageellipse($img,60,360,40,80,$green);
imageellipse($img,160,360,60,60,$green);
imagefilledellipse($img,320,360,150,150,$pink);
imagepng($img);
imagedestroy($img);
?>
Чтобы нарисовать прямоугольник используется функция imagerectangle(), например: imagerectangle($img,20,60,200,180,$green); Здесь:
- $img - рабочая область изображения
- 20 и 60 - x1, y1 - верхний левый угол
- 200 и 180 - x2, y2 - нижний правый угол
- $green - цвет линии
Чтобы нарисовать прямоугольник с заливкой используется функция imagefilledrectangle(). Ее отличие от предыдущей в том, что параметр цвета отвечает за заливку. Но если вам нужно сделать прямоугольник с рамкой и цветной заливкой, то можно использовать комбинацию обоих прямоугольников методом наложения, как в коде. У этих прямоугольников одинаковые координаты, поэтому они накладываются друг на друга.
Чтобы рисовать окружности и эллипсы используются функции imageellipse() и imagefilledellipse(). Синтаксис переменных такой же, как и для прямоугольников - один без заливки, другой с заливкой.
Также вам может понадобится создание сложных фигур - полигонов. Ими могут быть треугольники, трапеции, звезды. Выполняется за счет функции imagepolygon() в массив которой передаются координаты каждой точки x и y. Пример:
imagepolygon($img, Array( 100,100, 200,200, 300,190, 410,160), 4, $pink);
Здесь вы видите массив точек X1, Y1, X2, Y2, X3, X4, Y4, а число 4 означает их количество.
Счетчик посещений через картинку PNG
Для работы этого счетчика необходимо создать графическое изображение, которое послужит базой для счетчика. Это изображение надо сохранить под именем counter.png
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?php $dat_file="counter.dat"; // Файл счетчика // Открывем файл счетчика и считываем текущий счет // в переменную $count $f=fopen($dat_file,"r"); $count=fgets($f,100); fclose($f); $count=ereg_replace(" ","",$count); // Удаляем символ конца строки $count++; // Увеличиваем счетчик // Записываем данные обратно в файл $f=fopen($dat_file,"w"); fputs($f,"$count "); fclose($f); // Создаем новое изображение из файла $im = ImageCreateFromPNG('counter.png'); // Назначаем черный цвет $black = ImagecolorAllocate($im,0,0,0); // Выводим счет на изображение Imagestring($im,1,5,20,$count,$black); // Выводим изображение в стандартный поток вывода Header("Content-type: image/png"); ImagePng($im); ?> |
Необходимо будет создать файл для ведения счета(dat_file) и записать в него начальное значение счетчика.
Для вывода счетчика в html используйте <IMG SRC="counter.php" WIDTH="88" HEIGHT="31" BORDER=0>