Write to a log file with PHP
After writing custom PHP “log” function several times I finally decided to create a simple Logging PHP class. First call of lwrite method will open log file implicitly and write line to the file. Every other lwrite will use already opened file pointer until closing file with lclose. It is always a good idea to close file when it’s done. This should prevent file from corruption and overhead in closing file is negligible.
Before you read further, I also wrote a post how to Log PHP errors to the separate file, if you are looking for such information.
// Logging class initialization $log = new Logging(); // set path and name of log file (optional) $log->lfile('/tmp/mylog.txt'); // write message to the log file $log->lwrite('Test message1'); $log->lwrite('Test message2'); $log->lwrite('Test message3'); // close log file $log->lclose();
Output in mylog.txt will look like:
[10/Jun/2012:10:36:19] (test) Test message1 [10/Jun/2012:10:36:19] (test) Test message2 [10/Jun/2012:10:36:19] (test) Test message3
Logging class source code:
/** * Logging class: * - contains lfile, lwrite and lclose public methods * - lfile sets path and name of log file * - lwrite writes message to the log file (and implicitly opens log file) * - lclose closes log file * - first call of lwrite method will open log file implicitly * - message is written with the following format: [d/M/Y:H:i:s] (script name) message */ class Logging < // declare log file and file pointer as private properties private $log_file, $fp; // set log file (path and name) public function lfile($path) < $this->log_file = $path; > // write message to the log file public function lwrite($message) < // if file pointer doesn't exist, then open log file if (!is_resource($this->fp)) < $this->lopen(); > // define script name $script_name = pathinfo($_SERVER['PHP_SELF'], PATHINFO_FILENAME); // define current time and suppress E_WARNING if using the system TZ settings // (don't forget to set the INI setting date.timezone) $time = @date('[d/M/Y:H:i:s]'); // write current time, script name and message to the log file fwrite($this->fp, "$time ($script_name) $message" . PHP_EOL); > // close log file (it's always a good idea to close a file when you're done with it) public function lclose() < fclose($this->fp); > // open log file (private method) private function lopen() < // in case of Windows set default log file if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') < $log_file_default = 'c:/php/logfile.txt'; >// set default log file for Linux and other systems else < $log_file_default = '/tmp/logfile.txt'; >// define log file from lfile method or use previously set default $lfile = $this->log_file ? $this->log_file : $log_file_default; // open log file for writing only and place file pointer at the end of the file // (if the file does not exist, try to create it) $this->fp = fopen($lfile, 'a') or exit("Can't open $lfile!"); > >
For PHP prior to version 5.2.0 you will have to replace or change line with built-in PHP function pathinfo() because PATHINFO_FILENAME constant was added in PHP 5.2.0
// for PHP 5.2.0+ $script_name = pathinfo($_SERVER['PHP_SELF'], PATHINFO_FILENAME); // for PHP before version 5.2.0 $script_name = basename($_SERVER['PHP_SELF']); $script_name = substr($script_name, 0, -4); // php extension and dot are not needed
If you want to send a message to the PHP’s system logger, please see the error_log PHP command.
Работа с файлами в php
Не пропусти свежие посты, подпишись:
Сразу хорошая новость, в последних версиях PHP научился автоматически преобразовывать символ / «слеш» в пути к файлу в нужную сторону в зависимости от вашей операционной системы (Windows или UNIX), более того, распознавая в пути к файлу строки http:// или ftp:// PHP понимает что на самом деле ему нужно установить сетевое соединение и работать с ним а не с локально расположенным файлом. При этом в рамках программы такой «сетевой» файл ничем не отличается от обычного и если у вас есть соответствующие права, то вы можете и читать и записывать http и ftp файлы.
Открытие файла
Т.к. PHP написан на языке C (читается как «Си»), в нём как и в Си, работа с файлами разделена на 3 этапа:
В начале файл открывается в нужном режиме чтения, при этом возвращается целое число, идентификатор открытого файла или дескриптор файла. Затем выполняются команды связанные с чтением или записью в файл, при этом эти команды ориентируются уже на полученный дескриптор файла а не на его имя. После выполнения нужных команд, файл лучше всего закрыть. Конечно PHP закроет все файлы автоматически после завершения сценария, однако если ваш файл долго обрабатывается, то может происходить утечка ресурсов.
Для открытия файла в PHP используется функция fopen(), общий вид функции:
fopen( string $filename , string $mode);
Функция принимает 2 базовых параметра это
- $filename — имя файла (путь к файлу)
- $mode — режим чтения файла
В зависимости от режима открытия файла вы можете выполнять те или иные операции над файлом, ниже приведена таблица с описанием режимов чтения:
Режим | Чтение | Запись | Файловый указатель | Очистка файла | Создать, если файла нет | Ошибка, если файл есть |
---|---|---|---|---|---|---|
r | Да | Нет | В начале | Нет | Нет | Нет |
r+ | Да | Да | В начале | Нет | Нет | Нет |
w | Нет | Да | В начале | Да | Да | Нет |
w+ | Да | Да | В начале | Да | Да | Нет |
a | Нет | Да | В конце | Нет | Да | Нет |
a+ | Да | Да | В конце | Нет | Да | Нет |
x | Нет | Да | В начале | Нет | Да | Да |
x+ | Да | Да | В начале | Нет | Да | Да |
c | Нет | Да | В начале | Нет | Да | Нет |
c+ | Да | Да | В начале | Нет | Да | Нет |
- b — файл открывается в режиме бинарного чтения/записи
- t — файл открывается в режиме трансляции символа перевода строки (символы \n для UNIX или \r\n для Windows) и файл воспринимается как текстовый
//Открытие файла на чтение $f = fopen('home/www/file.txt', 'rt'); //Открытие HTTP-соединения на чтение $f = fopen('https://it-svalka.ru/', 'rt'); //Открытие FTP соединения $f = fopen('ftp://user:password@example.com/log.txt', 'wt');
Запись и закрытие
Запись в файл осуществляется функцией fwrite() которая принимает 2 аргументам, указатель на файл и строку которую нужно записать в файл. Пример:
//Открытие тестового файла $file = fopen('test.txt', 'wt'); //Запись строки в файл fwrite($file, 'Текущая дата и время: ' . date('d.m.y H:i:s')); //Закрытие файла fclose($file);
В результате выполнения кода, будет создан файл (если его нет) test.txt и запишется строка, в моём случае:
Текущая дата и время: 10.09.20 14:35:46
Как видите после записи я вызываю функцию fclose() куда передаю дескриптор файла для его закрытия. Давайте рассмотрим несколько практических задач которые могут встретиться вам в реальных проектах.
Логирование данных
Одной из частых задач связанных с чтением/записью фалов, является логирование данных о работе веб-сайта. Логировать можно всё что угодно, ошибки, результаты запросов к БД, активность пользователей и т.п.
//Адрес файла с логами храним в константе define('LOG_FILE', 'log.txt'); /** * Функция записи лога * @param $textToLog */ function logFile($textToLog) < //Открытие файла лога $file = fopen(LOG_FILE, 'at'); $sepatrator = '-----------------------------------------------'; //Запись строки в файл fwrite($file, "\n" . $sepatrator . "\n". $textToLog . "\nдата и время записи: " . date('d.m.y H:i:s') . "\n"); //Закрытие файла fclose($file); >//Вызов функции logFile('Пользователь открыл страницу');
----------------------------------------------- Пользователь открыл страницу дата и время записи: 10.09.20 14:52:35 ----------------------------------------------- Пользователь открыл страницу дата и время записи: 10.09.20 14:52:37
Обратите внимание на двойные кавычки вместо одинарных. Это нужно для того, чтобы PHP корретно интерпретировал сочетание «\n» как символ переноса строки. Функцию logFile() можно улучшать до бесконечности, добавляя различные дополнительные данные из сессии пользователя, данных запроса, данных о сервере и т.п.
Парсинг
Ещё дна частая задача в веб-программировании, это парсинг файлов. Иногда вам нужно слить сайт конкурента чтобы проанализировать цены на похожие товары, загрузить данные с csv документа в базу данных, проанализировать xml карты сайта и т.д. Давайте рассмотрим загрузку данных их csv документа.
//Открываем csv файл в режиме чтения $csv = fopen('clients.csv', 'r'); //Читаем файл построчно при помощи fgetcsv() while ($row = fgetcsv($csv, 1000, ';'))< //Здесь можно выполнять запросы к БД для сохранения данных пользователей и т.п. echo '
'; print_r($row); echo ''; > //Закрываем файл fclose($csv);
Я создал csv сохранив его в кодировке UTF-8, разделитель поля — ; разделитель текста — «. Обратите внимание что в функции fgetcsv() третий параметр (разделитель) должен совпадать с тем, что вы указывали при сохранении csv.
В результате выполнения скрипта, получаю содержимое csv вот в таком виде:
Array ( [0] => ФИО [1] => Email [2] => Телефон ) Array ( [0] => Иванов Иван Иванович [1] => ivanov@mail.ru [2] => +79001234567 ) Array ( [0] => Петров Пётр Петрович [1] => petrov@gmail.com [2] => +79280001122 )
Более подробно вопросы парсинга данных (как excel документов так и html страниц я рассмотрю в отдельных прикладных статьях). Желаю удачи в изучении php!
Не пропусти свежие посты, подпишись:
Create Logfile and Write Error Log in PHP
in this tutorial, I’ll discuss How to create php Log File using PHP. This quick tutorial help to create logging functionality for your PHP application.
I am using core PHP to create a file and log them. You don’t need to use any third-party PHP library or any plugin.
There is a general requirement of any PHP application, how to log the info, Error, Exception etc information into your application.
Your application is running fine and accidentally it has been down due to any reason.
How to find the issue that happened? and what problem occurred in your code? Due to the log file you can get the root cause information of the fail system.
The application log file help to find out information about your PHP application.
Creating logging functionality in php application is very easy. You just need to create a single log.php file into your application. You need to import this file and use it anywhere in the application.
PHP Log into The File
Let’s add the below code into the log.php file.
//define function name function m_log($arMsg) < //define empty string $stEntry=""; //get the event occur date time,when it will happened $arLogData['event_datetime']='['.date('D Y-m-d h:i:s A').'] [client '.$_SERVER['REMOTE_ADDR'].']'; //if message is array type if(is_array($arMsg)) < //concatenate msg with datetime foreach($arMsg as $msg) $stEntry.=$arLogData['event_datetime']." ".$msg."rn"; >else < //concatenate msg with datetime $stEntry.=$arLogData['event_datetime']." ".$arMsg."rn"; >//create file with current date name $stCurLogFileName='log_'.date('Ymd').'.txt'; //open the file append mode,dats the log file will create day wise $fHandler=fopen(LOG_PATH.$stCurLogFileName,'a+'); //write the info into the file fwrite($fHandler,$stEntry); //close handler fclose($fHandler); >How To Use PHP Log Function in Your Application
Its same as other php function call, You just call and passed necessary params into this.
//how to call function: m_log("Sorry,returned the following ERROR: ".$fault->faultcode."-".$fault->faultstring);PHP 7 Exceptions Changes
The PHP does not handle fatal errors gracefully since they immediately terminate program execution. PHP 7 introduced a “Throwable” interface. They provide the ability to catch PHP internal exceptions, like TypeError, ParseError, etc.