За чистый и ясный код!

Статьи на тему программирования под веб, используя PHP, MySQL, Jquery и многое другое
Просмотр категории - PHP

Как изменить цвет консоли в ZF2

Март23
Собрался в поход в горы, в лес, на байдарках? Для надежной связи советую использовать пыле / влагозащищенный телефон Runbo X5

Вывод данных, поиск решения

В последнее время я работаю на большом проекте и переписываю часть его ядра. Т.е. никакого UI я не вижу, все что я пишу запускается из командной строки. Соответственно вся техническая информация которая выводится в командную строку отображается в таком сероватом цвете, в цвете по-умолчанию. Информации много, я уже разделил её на блоки, обрамив каждый скобками, квадратными, фигурными, обычными…, но всё это не то. Нужно чтобы инфа выводилось в цвете, чтобы глаз сразу видел, что если красный цвет я вывожу, то где-то, скажем поломка, если желтый, то внимание ну и тд.
Занялся я этим вопросом, начал изучать как устроен терминал, какие последовательности команд надо ему подать, чтобы выводимая инфа была в определенном месте, в определенном цвете. Пишу я свою часть на ZF2 и я случайно там обнаружил, что есть классы которые реализованы для отображения данных в цвете, как для ОС семейства Линукс, так и Виндовс. Все решается очень просто!

Небольшой пример кода, который выводи инфу в цвете:

// Подключаем необходимые библиотеки
use Zend\Console\Console as Console;
use Zend\Console\ColorInterface as Color;

//где-то, где вам надо просто используем классы, вывод строки с данными
Console::getInstance()->write("  " . str_pad($i,6) . '- (') .Console::getInstance()->write(str_pad($percent,5), Color::LIGHT_CYAN) . Console::getInstance()->write('% (') . Console::getInstance()->write($countVendorHotelsOst, Color::LIGHT_MAGENTA) . Console::getInstance()->write(') w-') . Console::getInstance()->write(str_pad($weight,3), $weight < 100 ? Color::LIGHT_YELLOW : Color::YELLOW) . Console::getInstance()->write(') - ' . str_pad($vendorHotel->hotelCode . ' ', 40,'-') . '-> ' . $idHotel);

// новая строка
Console::getInstance()->writeLine();

В итоге получаю такую картинку

Вывод цветных данных скрипта в командную строку

А вот как было без использования специальных классов:

Вывод данных скрипта в командную строку

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

Что еще позволяют сделать эти классы

Позволяет работать с адаптерами терминалов
— Posix
— Virtual
— Windows
— Windows Ansicon

Работает с кодировками
— UTF-8
— UTF-8 Heavy
— ASCII
ASCII Extended (расширенная)
DECSG

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

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

С такими возможностями есть шансы, что скоро кто-то напишет велосипед, аля FAR или MC на PHP.

ЗЫ Я нашел еще кучу классов, для работы с цветом, ссылки ниже.

ANSI Escape sequences
Как подключить вывод цвета в терминале Windows
PHP CLI Colors

Статья просмотренна 367187 раз, зашло посетителей 24420

Рекурсивный обход директории с помощью итераторов

Ноябрь15
Обращаю Ваше внимание на загородную недвижимость в области, найдите себе достойное жильё!

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

Для таких целей используется рекурсия.

Я попытался разобраться в этом вопросе, и всё что узнал делюсь.
Сначала я просто попытался пройтись по одной директории не исполmзуя рекурсию разными методами для определения удобства использования и скорости работы.

Проход директории с помощью родных методов

К родным (native) методам я отнес функции opendir(), closedir(), readdir() и rewinddir(). Больше казать об этих ф-циях нечего, чистая классика. Открыли каталог (если он существует), получили дескриптор (указатель) на него и начинаем с ним работать, по окончанию желательно закрыть каталог.

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

$dir = 'c:\\windows\\system32';

$odir = opendir($dir);

while (($file = readdir($odir)) !== FALSE)
{
	if ($file != '.' && $file != '..')
	{
		echo $file.'<br>';
	}
}

closedir($odir);

Проход директории с помощью предопределенного класса dir()

Предопределенных классов довольно много, они или являются родными, как класс dir(), Exception, Reflection, или такие которые подключаются с помощью соот. библиотек — mysqli, curl, GD и тд

$cat = dir($dir);

while (($file = $cat->read()) !== FALSE)
{
	if ($file != '.' && $file != '..')
	{
		echo $file.'<br>';
	}
}

$cat->close();

Методы класса dir()

Название метода Описание метода
path путь к директории
handle ресурс, дескриптор
close() закрыть директорию
rewind() сброс дескриптора в начало директории
read() Чтение одного элемента директории и передвигаем указатель на одну позицию вниз.

Проход директории с помощью Итератора (DirectoryIterator)

Что есть итератор хорошо описано в Википедии не буду копи-пастить…

Класс DirectoryIterator реализует интерфейс итератора (могут проходить коллекцию в цикле foreach).

$idir = new DirectoryIterator($dir);

foreach($idir as $file)
{
	if ($file != '.' && $file != '..')
	{
		echo $file->__toString().'<br>';
	}
}

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

Методы класса DirectoryIterator()

Название метода Описание метода
getFilename() возврат имени файла или поддиректории
getBasename() похож на getFilename(), но может удалять суфикс,если таковой передать в виде параметра *
isDot() Определяет является ли текущий элемент «.» или «..»
rewind() сброс указателя на первый элемент
valid() проверка является ли текущий элемент правильным файлом.
Честно не понял.
key() возврат ключа текущего элемента
current() возврат текущего элемента
next() на 1 шаг вперед передвигает указатель
__toString() оопшный метод, приводит свойство к строке
getPath() возврат просто имени директории/файла и все
getPathname() возврат пути к файлу/директории+само название
getPerms() возврат прав доступа только для UNIX
getInode() х.з. что это, судя по названи наверное какое-то имя узла,
думаю только для UNIX
getSize() размер файла в байтах, для директории всегда ноль
getOwner() возврат имя владельца, только для UNIX
getGroup() возврат ИД группы, только для UNIX
getATime() последний доступ к файлу/директории в сек (начало с 1970)
getMTime() последний модификации  файла/директории в сек (начало с 1970)
getCTime() последний изменения к файла/директории в сек (начало с 1970)
getType() возрат dir или file для сотв элемента.
isWritable() думаю понятно из названия, возврат истина/ложь
isReadable() думаю понятно из названия, возврат истина/ложь
isExecutable() думаю понятно из названия, возврат истина/ложь
isFile() думаю понятно из названия, возврат истина/ложь
isDir() думаю понятно из названия, возврат истина/ложь
isLink() думаю понятно из названия, возврат истина/лож,только для  UNIX
getLinkTarget() для данных методов не нашел описание даже на оф.сайте.
getRealPath() для данных методов не нашел описание даже на оф.сайте.
getFileInfo() для данных методов не нашел описание даже на оф.сайте.
getPathInfo() для данных методов не нашел описание даже на оф.сайте.
openFile() для данных методов не нашел описание даже на оф.сайте.
setFileClass() для данных методов не нашел описание даже на оф.сайте.
setInfoClass() для данных методов не нашел описание даже на оф.сайте.

* — за подробностями обращайтесь к официальной документации.

Рекурсивный обход директории с помощью родных методов

Рассмотрев как можно пройтись по директории теперь рассмотри как можно пройтись абсолютно по всему каталогу.

function recursive($dir)
{
	static $deep = 0;

	$odir = opendir($dir);

	while (($file = readdir($odir)) !== FALSE)
	{
		if ($file == '.' || $file == '..')
		{
			continue;
		}
		else
		{
			echo str_repeat('---', $deep).$dir.DIRECTORY_SEPARATOR.$file.'<br>';
		}

		if (is_dir($dir.DIRECTORY_SEPARATOR.$file))
		{
			$deep ++;
			recursive($dir.DIRECTORY_SEPARATOR.$file);
			$deep --;
		}
	}
		closedir($odir);
}

recursive($dir);

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

Рекурсивный обход директории с помощью итератора (RecursiveDirectoryIterator)

Решение для обхода каталога на ООП нашлось и его скрипт ниже.

$rdir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir), TRUE);

foreach ($rdir as $file)
{
	echo str_repeat('---', $rdir->getDepth()).$file.'<br>';
}

Красиво, всего одна строка, два класса и полный набор данных.

Из существующий методов , которые я уже не привожу, т.к. многие уже описал в других классах (key, current, rewind, valid etc), хотелось бы подчеркнуть метод setMaxDepth(integer); — он позволяет задать глубину прохода.

Другие методы которые есть у данного класса даже не описаны на оф. сайте.

Тесты

Как я их проводил. В цикле (1000) я засекал время перед открытие директории и после её закрытия. Затем я высчитывал среднее арифметическое. Т.к. результаты сильно зависят от железа (винчестера и др параметров), то приводить просто время в секундах не кошерно, поэтому я перевел их проценты. За 100% я принял время работы родных функций.

Проход 1000 раз директории $dir = ‘c:\\windows\\system32’;
native — 100%
dir() — 107%
DirectoryIteratior — 115%

Рекурсия директории $dir = ‘c:\\windows\\system32’;
native — 100%
RecursiveDirectoryIterator — 115%

Как видно нативные почти всегда рулят, но и не так далеко отстают ООПшные фичи.
Кто что будет юзать — уж дело личное.

UPD
Прошу прощения у общественности, я не верно провел тест с рекурсивным обходом.
Вот более детальные данные.
native — 100%
RecursiveDirectoryIterator — 185%

Как видно нативные фичи всегда рулят!

Статья просмотренна 67556 раз, зашло посетителей 16153

Возврат отформатированной строки функцией sprintf

Май13
Качественная стяжка пола разными способами и материалами.

SprintfВек живи — век учись (народная мудрость)
При внимательном чтении документации PHP, функции sprintf наткнулся на то, что доступ к одинаковым параметрам можно получить через указания номера параметра этой ф-ции.

Рассмотрим несколько примеров.

Во всех примерах я хочу вывести строку  Мой персональный блог <a href=»http://blog.nagaychenko.com»>http://blog.nagaychenko.com</a>

Пример 1:

$string = 'Мой персональный блог <a href="%s">%s</a>';
echo sprintf($string, 'http://'.$_SERVER['HTTP_HOST'].'/blog');

Получаем ответ

Warning: sprintf(): Too few arguments in D:\www\test\index.php on line 3

Как видно я хочу заменить ключи %s на ‘http://’.$_SERVER[‘HTTP_HOST’].’/blog’ в двух местах, но в ф-ции значение для второго ключа не передано, следовательно произошла ошибка.

Пример 2:

$string = 'Мой персональный блог <a href="%s">%s</a>';
echo sprintf($string, 'http://'.$_SERVER['HTTP_HOST'].'/blog', 'http://'.$_SERVER['HTTP_HOST'].'/blog');

Получаем ответ

Мой персональный блог <a href="http://blog.nagaychenko.com">http://blog.nagaychenko.com</a>

В этом примере все прошло корректно, но мне дважды пришлось писать одно и тоже значение ‘http://’.$_SERVER[‘HTTP_HOST’].’/blog’, а если таких значений куда больше чем 2? Получается не очень красиво и можно сильно попасть при смене строки с ключами. Особенно попадаем если ключи поменялись местами. Чтобы такого не было, можно использовать третий пример.

Пример 3:

$string = 'Мой персональный блог <a href="%1$s">%1$s</a>';
echo sprintf($string, 'http://'.$_SERVER['HTTP_HOST'].'/blog');

Получаем ответ

Мой персональный блог <a href="http://blog.nagaychenko.com">http://blog.nagaychenko.com</a>

Обратите внимание на %1$s и %1$s — это теже ключи, что и %s, но в них теперь указывает порядковый номер параметра переданный в ф-цию.
Еще одно замечание, если юзаете двойные кавычки, то перед знаком доллара необходимо ставить экранирующий слешь «%1\$s».

Как видно 2-й и 3-й вариант более правильный, но лучше использовать вариант номер 3!


Ниже приведено описание ф-ции из мануала:

Описание

string sprintf ( string $format [, mixed $args ] )

Возвращает строку, созданную с использованием строки формата format .

Строка формата состоит из директив: обычных символов (за исключением %), которые копируются в результирующую строку, и описатели преобразований, каждый из которых заменяется на один из параметров. Это относится также к fprintf(), sprintf() и printf().

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

Необязательный описатель заполнения, который определяет, какой символ будет использоваться для дополнения результата до необходимой длины. Это может быть пробел или 0. По умолчанию используется пробел. Альтернативный символ может быть указан с помощью ‘. См. примеры ниже.
Необязательный описатель выравнивания, определяющий выравнивание влево или вправо. По умолчанию выравнивается вправо, — используется для выравнивания влево.

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

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

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

% — символ процента. Аргумент не используется.
b — аргумент трактуется как целое и выводится в виде двоичного числа.
c — аргумент трактуется как целое и выводится в виде символа с соответствующим кодом ASCII.
d — аргумент трактуется как целое и выводится в виде десятичного числа со знаком.
e — аргумент трактуется как float и выводится в научной нотации (например 1.2e+2).
u — аргумент трактуется как целое и выводится в виде десятичного числа без знака.
f — аргумент трактуется как float и выводится в виде десятичного числа с плавающей точкой.
o — аргумент трактуется как целое и выводится в виде восьмеричного числа.
s — аргумент трактуется как строка.
x — аргумент трактуется как целое и выводится в виде шестнадцатиричного числа (в нижнем регистре букв).
X — аргумент трактуется как целое и выводится в виде шестнадцатиричного числа (в верхнем регистре букв).

Статья просмотренна 31022 раз, зашло посетителей 8902

Сайт упал из-за ECHO

Март4
Дидактические материалы по геометрии Гусев 8 класс.

Привет, уважаемые читатели!

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

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

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

<?php echo $this->form;?>

я не смог из-за сложной верстки (декорировать на зенде — дольше, чем на голом ХТМЛе создать), я просто разобрал созданную в контроллере форму по элементам:

$itemsList = $this->form->getElements ();

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

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

<?php echo isset($itemsList["submit"]) ? $itemsList["submit"] : ''?>
<?php echo isset($itemsList["reset"])  ? $itemsList["reset"] : ''?>

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

При такой конструкции сайт ВАЛИТСЯ!!! Никаких сообщений нет, трейса нет, в логе-апача ничего нет — полный ГОЛЯК! Нашел я эту проблему методом «научного тыка».

Ну как ни у кого нет мысли почему эти строки валили сайт, еще скажу, если выводить какую-то одну из строк — все ОК?!

В общем дело в том, что именно оператор ECHO виновен, он не смог преобразовать объект в строку и выдать её, при этом никакого предупреждения не выдав!!!!!!!!

Если переписать эти строки вот так:

<?php print isset($itemsList["submit"]) ? $itemsList["submit"] : ''?>
<?php print isset($itemsList["reset"])  ? $itemsList["reset"] : ''?>

, т.е. заменить echo на print все нормально срабатывало.

Как бы я не крутил конструкция с эхо, скобочки разные, короткое сокращение эхо, и тд ничего не происходило. Помогло только явное приведение к строке с помощью конструкции (string), или конкатенация с пустой строкой, или приведение к типу с помощью ООП метода __toString();

<?php echo isset($itemsList["submit"]) ? (string)$itemsList["submit"] : ''?>
<?php echo isset($itemsList["reset"])  ? (string)$itemsList["reset"] : ''?>
<?php echo isset($itemsList["submit"]) ? $itemsList["submit"].' ' : ''?>
<?php echo isset($itemsList["reset"])  ? $itemsList["reset"].' ' : ''?>
<?php echo isset($itemsList["submit"]) ? $itemsList["submit"]->__toString() : ''?>
<?php echo isset($itemsList["reset"])  ? $itemsList["reset"]->__toString() : ''?>

Но самое, что для меня не понятное, почему если, я расписал условие в полном объеме:

if(isset($itemsList["submit"]))
{
	echo  $itemsList ["submit"];
}

if(isset($itemsList["reset"]))
{
	echo  $itemsList ["reset"];
}

все выполняется, заметьте, преобразованием типа я не занимался!!!

Вот часть кодов, может кто хочет протестировать:
Класс формы

public function __construct($options = null)
{
.....
	$this->_options = $options;
.....
}

public function init()
{
.....
	$this->addElement(
		'submit', 
		'submit', 
		array(
			'label' => 'submit', 
			'class' => 'but', 
			'decorators' => array('ViewHelper'), 
			'title'=>'submit'
		)
	);

	$this->addElement(
			'submit',
			'reset',
			array(
					'label'=>'reset',
					'class' => 'but',
					'decorators' => array('ViewHelper'),
					'title'=>'reset'
			)
	);
.....
}

protected $_options = array();

Контроллер

$form = new Module_Forms_MyForm(array('some options'));
.....
$this->view->form = $form;

Вьюха

$itemsList = $this->form->getElements ();

<form ....>
.....
<?php echo isset($itemsList["submit"]) ? $itemsList["submit"] : ''?>
<?php echo isset($itemsList["reset"])  ? $itemsList["reset"] : ''?>
.....
</form>

Плиз, оставь свои мнения, почему в тернарном операторе эхо не сработало, а в общем условии — все ок!! Очень интересно знать, отвечу на любые вопросы.

UPD: Забыл сказать, все это без каких либо изменений работет по виндой, но подлинухом не работает!

Статья просмотренна 48021 раз, зашло посетителей 11474

Отправка почты через sendmail в ОС Windows

Февраль23

Всем привет!

Наверняка многие использовали и используют функцию mail() для отправки сообщение e-mail. Но в ОС Windows невозможно отправить почту используя только скрипты php и эту ф-цию. Нужны программные средства:

1 Установить полноценный почтовый сервер, например Kerio Connect (не реклама)
2 Использовать скрипты (классы) для работы с почтой: Zend_mail, PHPmailer и т.д.
3 Установить готовые веб-серверы типа Денвер, XAMPP
4 Воспользоваться эмуляцией демона sendmail для OS Windows

Пока не поздно подумаем о лете и ЖАРЕ, присмотримся к кондиционерам, vrf системы — наше спасение.

Лично я не любитель использовать собранные проекты, такие как Денвер, XAMPP и им подобным. Люблю использовать то, что будет жить на сервере, т.е. по-отдельности устанавливаю сервисы. Устанавливать какой-то мыльный сервере, тоже не охота — его нужно ломать (большинство платные), настраивать и тд. Что же делать?

На помощь пришел 4-й пункт! Качаем, распаковываем, и начинаем настройку.

Настройка sendmail.ini

И так в созданном каталоге будет файл sendmail.ini, его и надо править — это главный файл конфигурации:

; configuration for fake sendmail

; if this file doesn't exist, sendmail.exe will look for the settings in
; the registry, under HKLM\Software\Sendmail

[sendmail]

; you must change mail.mydomain.com to your smtp server,
; or to IIS's "pickup" directory.  (generally C:\Inetpub\mailroot\Pickup)
; emails delivered via IIS's pickup directory cause sendmail to
; run quicker, but you won't get error messages back to the calling
; application.

smtp_server=smtp.mail.ru

; smtp port (normally 25)

smtp_port=2525

; SMTPS (SSL) support
;   auto = use SSL for port 465, otherwise try to use TLS
;   ssl  = alway use SSL
;   tls  = always use TLS
;   none = never try to use SSL

smtp_ssl=auto

; the default domain for this server will be read from the registry
; this will be appended to email addresses when one isn't provided
; if you want to override the value in the registry, uncomment and modify

default_domain=mail.ru

; log smtp errors to error.log (defaults to same directory as sendmail.exe)
; uncomment to enable logging

error_logfile=error.log

; create debug log as debug.log (defaults to same directory as sendmail.exe)
; uncomment to enable debugging

debug_logfile=debug.log

; if your smtp server requires authentication, modify the following two lines

auth_username=your_login@mail.ru
auth_password=your_password

; if your smtp server uses pop3 before smtp authentication, modify the 
; following three lines.  do not enable unless it is required.

pop3_server=
pop3_username=
pop3_password=

; force the sender to always be the following email address
; this will only affect the "MAIL FROM" command, it won't modify 
; the "From: " header of the message content

force_sender=your_login@mail.ru

; force the sender to always be the following email address
; this will only affect the "RCTP TO" command, it won't modify 
; the "To: " header of the message content

force_recipient=

; sendmail will use your hostname and your default_domain in the ehlo/helo
; smtp greeting.  you can manually set the ehlo/helo name if required

hostname=mail.ru

где
smtp_server — сервер отправки почты;
smtp_port — порт сервера;
smtp_ssl — использование сертификата, если не знаете пусть будет auto;
default_domain — основной домен для сервера отправки сообщения;
error_logfile — лог-файл ошибок, название любое, даже можно написать путь, где будет храниться файл;
debug_logfile — лог-файл отладочной информации (деббагер) в нем видно все «разговоры» с сервером;
auth_username и auth_password — данные авторизации на сервере;
force_sender — от кого будет послано сообщение;
force_recipient — кому будет послано, но оставляем пустым, т.к. эту инфу указываем в скрипте;
hostname — ставим такое же, как и default_domain.

Хочу напомнить, что не все серверы, из-за спама, разрешают их юзать, например при написании статьи я попытался подключиться к smtp.yandex.ru:25 ничего не вышло, кол-во писем в ящике показывает, но не отправляет.
Иная ситуация с smtp.mail.ru:2525, причем порт не по-умолчанию, стандартные тоже не работал, но в помощи, на сайте, написано, что есть два других порта, я воспользовался и получилось.

Настройка php.ini

Находим секцию [mail function]

[mail function]
; For Win32 only.
; SMTP = localhost
; smtp_port = 25

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
 sendmail_path = d:/sendmail/sendmail.exe

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
; mail.force_extra_parameters =

комментируем все строки, кроме пути к sendmail, в этом пути прописываем полный путь к бинарнику.

Пишем простейший скрипт

<?php
mail('to_your_friend@server.com', 'My Subject', 'My message');

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

Разбор логов

10.02.23 20:09:32 ** --- MESSAGE BEGIN ---
10.02.23 20:09:32 ** To: to_your_friend@server.com
10.02.23 20:09:32 ** Subject: My Subject
10.02.23 20:09:32 ** 
10.02.23 20:09:32 ** My message
10.02.23 20:09:32 ** --- MESSAGE END ---
10.02.23 20:09:32 ** Connecting to smtp.mail.ru:2525
10.02.23 20:09:33 ** Connected.
10.02.23 20:09:33 << 220 mail.ru ESMTP Tue, 23 Feb 2010 20:09:33 +0300<EOL>
10.02.23 20:09:33 >> EHLO mail.ru<EOL>
10.02.23 20:09:33 << 250-mx34.mail.ru Hello mail.ru [xxx.xxx.xxx.xxx]<EOL>250-SIZE 31457280<EOL>250-8BITMIME<EOL>250-AUTH PLAIN LOGIN<EOL>250 PIPELINING<EOL>
10.02.23 20:09:33 ** Authenticating as your_login@mail.ru
10.02.23 20:09:33 >> AUTH LOGIN<EOL>
10.02.23 20:09:33 << 334 VXNlcm5hbWU6<EOL>
10.02.23 20:09:33 >> bmFnYXljaGVua29AbWFpbC5ydQ==<EOL>
10.02.23 20:09:33 << 334 UGFzc3dvcmQ6<EOL>
10.02.23 20:09:33 >> c2V4c2hvcA==<EOL>
10.02.23 20:09:33 << 235 Authentication succeeded<EOL>
10.02.23 20:09:33 >> MAIL FROM: <your_login@mail.ru><EOL>
10.02.23 20:09:33 << 250 OK<EOL>
10.02.23 20:09:33 >> RCPT TO: <to_your_friend@server.com><EOL>
10.02.23 20:09:33 << 250 Accepted<EOL>
10.02.23 20:09:33 >> DATA<EOL>
10.02.23 20:09:33 << 354 Enter message, ending with "." on a line by itself<EOL>
10.02.23 20:09:33 >> Date: Tue, 23 Feb 2010 19:09:33 +0200<EOL>
10.02.23 20:09:33 >> To: to_your_friend@server.com<EOL>
10.02.23 20:09:33 >> Subject: My Subject<EOL>
10.02.23 20:09:33 >> <EOL>
10.02.23 20:09:33 >> My message<EOL>
10.02.23 20:09:33 >> .<EOL>
10.02.23 20:09:34 << 250 OK id=1NkBNF-000BaE-00<EOL>
10.02.23 20:09:34 >> QUIT<EOL>
10.02.23 20:09:34 << 221 mx34.mail.ru closing connection<EOL>
10.02.23 20:09:34 ** Disconnected.
10.02.23 20:09:34 ** Disconnected.
10.02.23 20:09:34 ** Disconnected.

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

Ну и в ответ, на своем почтовом ящике, куда я послал почту я её и получил.

Сам сервис для отправка почты через sendmail в ОС Windows можете взять тут

Удачи, пиши отзывы, кликайте на рекламу )))

Статья просмотренна 60591 раз, зашло посетителей 21782

Запуск скриптов PHP из под Cron в ОС Windows

Февраль17
Купили новые двери? Надо вырезать замки, обращайтесь.

Наверняка ни один большой сайт, проект, не обходится без участия запуска скриптов автоматом используя демон Linux cron.

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

Для работ необходимо скачать программку

Распаковать, в полученной папке вы увидите 3 файла:

crontab  - сюда записываются задания в формате крона
crontab.exe - это исполняемый файл
cron.log - отчет о работе крона

Далее запускаем файл crontab.exe, если надо чтобы крон стартовал сразу при запуске Windows, то помещаем его в папку автозапуска (пуск->программы->автозапуск), файл не работает как сервис, поэтому выход только такой.

Далее заходим в файл crontab и записываем команду

* * * * * d:/php5/php d:/www/test/phpinfo.php

это команда будет дергать файл d:/www/test/phpinfo.php каждую минуту.

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

В файле cron.log — будет записываться лог выполняемый кроном, вот содержимое:

17.02.2010 23:06 Cron started.
17.02.2010 23:07 d:/php5/php d:/SVN/www/test/phpinfo.php
17.02.2010 23:08 d:/php5/php d:/SVN/www/test/phpinfo.php

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

Всем удачи!

Статья просмотренна 44875 раз, зашло посетителей 15450

Настройка memcached под Windows7

Февраль12
Нужно быстро и качественно сделать сайт визитку? Обращайтесь.

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

Начал я читать как это все устанавливать и настраивать. Использую я для локальной разработки ОС Windows 7. Вроде бы скачал сам сервис (демон), установил просто в папку для этого сервиса (f:/memcached). Вроде скачал само расширение для PHP, написал соответствующие строки в
php.ini:

extension=php_memcache.dll

настрока совместимости ОС Windows

Затем началось самое интересное.
Апач перезапустил, ошибок никаких не выдал, значит расширение моему php 5.2.10 пришлось по вкусу, а вот сервис memcached поднять не могу!!!

Пишу в командной строке директиву — memcached.exe -d install и выдается ошибка… я уже пол часа над ней бился, пока не пошел за комп жены и там под Windows XP попробовал установить сервис. Сервис завелся за считанные секунды, и тут меня осенило!!!!

Надо в свойствах файла memcached.exe установить на вкладке совместимость режим совместимости с Windows XP.  Я так и попробовал — заработало!!!

О том что как им пользоваться можно почитать тут
Что такое memcached тут

Статья просмотренна 33958 раз, зашло посетителей 9467

Список локалей

Ноябрь28
Компьютеры для юридических лиц, фирм и компаний от adelsy.ru, заходи выбирай как игровой компьютер, так и для бизнеса.

Всем привет.

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

Команда для просмотра локалей на Вашем сервере, кто не знает:

maxnag@nagaychenko:~> cd /usr/lib/locale/
maxnag@nagaychenko:/usr/lib/locale> ls

А вот и список:

aa_DJ            es_BO.utf8           mn_MN
aa_DJ.utf8       es_CL                mn_MN.utf8
aa_ER            es_CL.utf8           mr_IN
aa_ER@saaho      es_CO                mr_IN.utf8
aa_ER.utf8       es_CO.utf8           ms_MY
aa_ET            es_CR                ms_MY.utf8
aa_ET.utf8       es_CR.utf8           mt_MT
af_ZA            es_DO                mt_MT.utf8
af_ZA.utf8       es_DO.utf8           nb_NO
am_ET            es_EC                nb_NO.utf8
am_ET.utf8       es_EC.utf8           nds_DE
an_ES            es_ES                nds_NL
an_ES.utf8       es_ES@euro           ne_NP
ar_AE            es_ES.utf8           ne_NP.utf8
ar_AE.utf8       es_GT                nl_BE
ar_BH            es_GT.utf8           nl_BE@euro
ar_BH.utf8       es_HN                nl_BE.utf8
ar_DZ            es_HN.utf8           nl_NL
ar_DZ.utf8       es_MX                nl_NL@euro
ar_EG            es_MX.utf8           nl_NL.utf8
ar_EG.utf8       es_NI                nn_NO
ar_IN            es_NI.utf8           nn_NO.utf8
ar_IN.utf8       es_PA                no_NO
ar_IQ            es_PA.utf8           no_NO.utf8
ar_IQ.utf8       es_PE                nr_ZA
ar_JO            es_PE.utf8           nso_ZA
ar_JO.utf8       es_PR                oc_FR
ar_KW            es_PR.utf8           oc_FR.utf8
ar_KW.utf8       es_PY                om_ET
ar_LB            es_PY.utf8           om_ET.utf8
ar_LB.utf8       es_SV                om_KE
ar_LY            es_SV.utf8           om_KE.utf8
ar_LY.utf8       es_US                or_IN
ar_MA            es_US.utf8           pa_IN
ar_MA.utf8       es_UY                pa_IN.utf8
ar_OM            es_UY.utf8           pap_AN
ar_OM.utf8       es_VE                pa_PK
ar_QA            es_VE.utf8           pl_PL
ar_QA.utf8       et_EE                pl_PL.utf8
ar_SA            et_EE.iso885915      pt_BR
ar_SA.utf8       et_EE.utf8           pt_BR.utf8
ar_SD            eu_ES                pt_PT
ar_SD.utf8       eu_ES@euro           pt_PT@euro
ar_SY            eu_ES.utf8           pt_PT.utf8
ar_SY.utf8       fa_IR                ro_RO
ar_TN            fa_IR.utf8           ro_RO.utf8
ar_TN.utf8       fi_FI                ru_RU
ar_YE            fi_FI@euro           ru_RU.koi8r
ar_YE.utf8       fi_FI.utf8           ru_RU.utf8
as_IN.utf8       fil_PH               ru_UA
ast_ES           fo_FO                ru_UA.utf8
ast_ES.utf8      fo_FO.utf8           rw_RW
az_AZ.utf8       fr_BE                sa_IN
be_BY            fr_BE@euro           sc_IT
be_BY@latin      fr_BE.utf8           se_NO
be_BY.utf8       fr_CA                se_NO.utf8
ber_DZ           fr_CA.utf8           shs_CA
ber_MA           fr_CH                sh_YU
bg_BG            fr_CH.utf8           sh_YU.utf8
bg_BG.utf8       fr_FR                sid_ET
bn_BD            fr_FR@euro           sid_ET.utf8
bn_BD.utf8       fr_FR.utf8           si_LK
bn_IN            fr_LU                sk_SK
bn_IN.utf8       fr_LU@euro           sk_SK.utf8
bo_CN            fr_LU.utf8           sl_SI
bo_IN            fur_IT               sl_SI.utf8
br_FR            fy_DE                so_DJ
br_FR@euro       fy_NL                so_DJ.utf8
br_FR.utf8       ga_IE                so_ET
bs_BA            ga_IE@euro           so_ET.utf8
bs_BA.utf8       ga_IE.utf8           so_KE
byn_ER           gd_GB                so_KE.utf8
byn_ER.utf8      gd_GB.utf8           so_SO
ca_AD            gez_ER               so_SO.utf8
ca_AD.utf8       gez_ER@abegede       sq_AL
ca_ES            gez_ET               sq_AL.utf8
ca_ES@euro       gez_ET@abegede       sr_ME
ca_ES.utf8       gl_ES                sr_RS
ca_FR            gl_ES@euro           sr_RS@latin
ca_FR.utf8       gl_ES.utf8           ss_ZA
ca_IT            gu_IN                st_ZA
ca_IT.utf8       gv_GB                st_ZA.utf8
crh_UA           gv_GB.utf8           sv_FI
csb_PL           ha_NG                sv_FI@euro
cs_CZ            he_IL                sv_FI.utf8
cs_CZ.utf8       he_IL.utf8           sv_SE
cy_GB            hi_IN                sv_SE.iso885915
cy_GB.utf8       hi_IN.utf8           sv_SE.utf8
da_DK            hr_HR                ta_IN
da_DK.utf8       hr_HR.utf8           ta_IN.utf8
de_AT            hsb_DE               te_IN
de_AT@euro       hsb_DE.utf8          te_IN.utf8
de_AT.utf8       hu_HU                tg_TJ
de_BE            hu_HU.utf8           tg_TJ.utf8
de_BE@euro       hy_AM                th_TH
de_BE.utf8       hy_AM.armscii8       th_TH.utf8
de_CH            id_ID                ti_ER
de_CH.utf8       id_ID.utf8           ti_ER.utf8
de_DE            ig_NG                ti_ET
de_DE@euro       ik_CA                ti_ET.utf8
de_DE.utf8       is_IS                tig_ER
de_LU            is_IS.utf8           tig_ER.utf8
de_LU@euro       it_CH                tk_TM
de_LU.utf8       it_CH.utf8           tl_PH
dz_BT            it_IT                tl_PH.utf8
el_CY            it_IT@euro           tn_ZA
el_CY.utf8       it_IT.utf8           tr_CY
el_GR            iu_CA                tr_CY.utf8
el_GR.utf8       iw_IL                tr_TR
en_AU            iw_IL.utf8           tr_TR.utf8
en_AU.utf8       ja_JP.eucjp          ts_ZA
en_BE            ja_JP.shiftjisx0213  tt_RU@iqtelif.UTF-8
en_BE@euro       ja_JP.sjis           tt_RU.utf8
en_BE.utf8       ja_JP.utf8           ug_CN
en_BW            ka_GE                uk_UA
en_BW.utf8       ka_GE.utf8           uk_UA.utf8
en_CA            kk_KZ                ur_PK
en_CA.utf8       kk_KZ.utf8           ur_PK.utf8
en_DK            kl_GL                uz_UZ
en_DK.utf8       kl_GL.utf8           uz_UZ@cyrillic
en_GB            km_KH                ve_ZA
en_GB.iso885915  kn_IN                vi_VN
en_GB.utf8       ko_KR.euckr          vi_VN.tcvn
en_HK            ko_KR.utf8           wa_BE
en_HK.utf8       ku_TR                wa_BE@euro
en_IE            ku_TR.utf8           wa_BE.utf8
en_IE@euro       kw_GB                wo_SN
en_IE.utf8       kw_GB.utf8           xh_ZA
en_IN            ky_KG                xh_ZA.utf8
en_IN.utf8       lg_UG                yi_US
en_NG            lg_UG.utf8           yi_US.utf8
en_NZ            li_BE                yo_NG
en_NZ.utf8       li_NL                zh_CN
en_PH            lo_LA                zh_CN.gb18030
en_PH.utf8       lt_LT                zh_CN.gbk
en_SG            lt_LT.utf8           zh_CN.utf8
en_SG.utf8       lv_LV                zh_HK
en_US            lv_LV.utf8           zh_HK.utf8
en_US.iso885915  mai_IN               zh_SG
en_US.utf8       mg_MG                zh_SG.gbk
en_ZA            mg_MG.utf8           zh_SG.utf8
en_ZA.utf8       mi_NZ                zh_TW
en_ZW            mi_NZ.utf8           zh_TW.euctw
en_ZW.utf8       mk_MK                zh_TW.utf8
es_AR            mk_MK.utf8           zu_ZA
es_AR.utf8       ml_IN                zu_ZA.utf8
es_BO            ml_IN.utf8

Всем удачи, Максим.

Статья просмотренна 27813 раз, зашло посетителей 8581

Парсинг CSV файлов на PHP

Ноябрь28

В данной статье речь пойдет о распознавании  формата CSV.

Что такое формат данных CSV, пояснять не буду, прочитайте об этом на http://ru.wikipedia.org/wiki/CSV.

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

Небольшой фрагмент этого файла

Имя;Фамилия;Мыло;Разное
Максим;Нагайченко;max_nag[at]meta.ua;программист
"?Мария";"üöäßµ";intik_79[at]mail.ru;
;;some@email.com

Как видно здесь встречаются кириллица, латиница, умляуты (расширенная латиница).

Для парсинг я воспользовался стандартной ф-цией PHP — fgetcsv.

При разборе на виндовс машине вообще никаких проблем не возникло, все было разобрано, разложено — в общем все как надо, осталось только занести в БД.

При разборе этого файла на линукс машине возникли проблемы — кириллица вообще не хотела распознаваться, если она не была обрамлена — кавычкой («). Решение нашлось за 30 минут и выпитой чашкой чая.

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

setlocale(LC_ALL, 'ru_RU.UTF-8');

Если у вас в проекте используется несколько языков интерфейса, то при переключении, не забудьте переключить локаль. Особенно это важно, если для перевода интерфейса используется ф-ция gettext().

Всем удачи, Максим.

Статья просмотренна 47698 раз, зашло посетителей 17319

Переменные переменных в PHP

Ноябрь26

В этой статье речь пойдет о так называемых — «переменные переменных«.

Что же это??? Наверняка каждый программист php сталкивался с переменными, которые имеют нестандартное название, точнее нестандартное создание переменных ($$ и тд), вот примеры

$$someVariable

${'rrr'}

$f()

Все это так называемые — «переменные переменных«. Это значение переменной, которое может стать самой переменной.

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

<?php
function myFunc()
{
echo 'Hello&lt;br&gt;';
}

$myVariable = 'myFunc';

$myVariable();
/*----------------------------------------*/
$someVar = 'hello';

$$someVar = 'Auf Wiedersehen&lt;br&gt;';

echo $hello;
/*----------------------------------------*/
$втораяПеременная = '123';

$$втораяПеременная = 'apple';

echo ${'123'};
?>

На экране будет выведено:

Hello
Auf Wiedersehen
apple

Я объясню на одном примере :

function myFunc()
{
echo 'Hello<br>';
}

$myVariable = 'myFunc';
$myVariable();

Тут видно, что создана ф-ция с названием myFunc которая выведет слово Hello<br>.  Мы конечно можем просто вызвать ф-цию через обращение к ней myFunc(); , но можно воспользоваться и другой конструкцией. Создать переменную (любую) потом присвоить ей значение — это само название ф-ции. И применив к переменной скобки () мы вызовем на исполнение данную ф-цию.

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

В последнем примере, как Вы думаете, почему я применил такой подход ${‘123’}; зачем эти фигурные скобки???? Ответ — т.к переменная не может начинаться с цифры, а $втораяПеременная = ‘123’; , точнее значение переменной, которое потом преобразуется в переменную, именно цифра, то для экранирования, обхода этого ограничения, используется ${‘someVar’} конструкция.

И еще, название переменных может быть не только на латинице, как пишется в некоторых книгах [a-zA-Z_0-9], но даже и иероглифы $? = ‘123’; (только если кодировка файла UTF-8, естественно).

Полезная ссылка:

http://www.php.net/manual/en/language.variables.php

Всем удачи, Максим.

Статья просмотренна 28278 раз, зашло посетителей 7621

  

Облако тегов

cli csv dump events form Kohana locale models MySQL mysqldump orm PHP tools trigger validate газ газовый счетчик итоги кеширование переменные

Облако тегов плагина WP Cumulus для WordPress требует для просмотра Flash Player 9 или выше.

Я на твиттере!

  • у твиттера тоже бывают перерывы...

Календарь

Июль 2017
Пн Вт Ср Чт Пт Сб Вс
« Июл    
 12
3456789
10111213141516
17181920212223
24252627282930
31  

Сейчас на сайте