На Хабре очередная классная статья. Про чистый код. Вроде бы "ясно как пень", но зачастую об этих мелочах все забывают. Статья содержит в названии "на PHP", но лично мне кажется, что для большинства современных языков программирования она будет очень и очень актуальна. Потому что там описываются не основы языка, а основы написания кода, которые в общем-то универсальны.
php
FluentPDO - библиотека для работы с PDO в PHP
Слйчайно наткнулся на FluentPDO - библиотеку для работы с PDO в PHP. Смысл в том, что библиотека является слоем абстракции между приложением, PDO-расширением PHP и SQL. Потестировав, понял, что удобно. А значит, есть смысл рассказать.
Для начала - ссылки.
- FluentPDO на github: https://github.com/envms/fluentpdo
- Подробная статья о том, как её использовать: https://www.sitepoint.com/getting-started-fluentpdo/
Смысл в том, что от программиста при использовании библиотеки требуется создать PDO-объект для работы с БД, передать его в fluentpdo, и дальше, используя встроенные методы - работать с SQL.
Например:
$pdo = new PDO("mysql:dbname=testdb", "testuser", "testpassword"); $fpdo = new FluentPDO($pdo);
Дальше "всё просто", например, простой select * from mytable where id=$userid будет выглядеть так:
$query = $fpdo->from('mytable')->where('id', $userid);
И чтобы обработать результат:
foreach($query as $row){ print $row['field1'] . ' -- ' . $row['field2'] . '<br>'; }
Если нужны конкретные столбцы, то:
$query = $fpdo->from('mytable') ->select(array('field1', 'field3'))->where('id', $userid);
Ну и чисто для иллюстрации - insert:
$values = array('field1' => 'testval1', 'field2' => 'testval2', 'field3' => 'testval3'); $query = $fpdo->insertInto('mytable')->values(values); $insert = $query->execute();
Также поддерживаются все основные операции, включая разнообразные update, join, delete и т.д.
Кстати, по приведенной выше ссылке примеров сильно больше. Скажу, что я попробовал на тесте FluentPDO - мне понравилось. Как-то упрощает жизнь, с точки зрения того, что не надо писать километровый код и запросы выглядят пологичнее. Ну и вся мощь PDO - типа единого синтаксиса работы с разными БД, безопасности (использование placeholder), получается как бы на нашей стороне :)
PHP: библиотека для парсинга wiki-текста
Для одного из своих проектов написал небольшую библиотечку для парсинга вики-текста, на php.
Возможности и особенности:
- позволяет парсить wiki-форматирование
- корректно относится к html - то есть принимает html-разметку наряду с wiki-разметкой
- за основу взят синтаксис dokuwiki
- синтаксис облегчен: задача стояла сделать инструмент под конкретные задачи, поэтому, например, библиотека не поддерживает таблицы
- в полном объеме поддерживаются картинки, включая выравнивание
- код уникальный. То есть библиотека не "тянута и переписана", а - полнотью своя. По этой же причине - работать может "не так" (я всё-таки не профессиональный программист и писал только под свои задачи)
- исходя из предыдущего пункта: бибиотека поставляется как есть, без гарантий и претензий. Пользуйтесь на здоровье, но я за результат её работы не отвечаю, хотя и постарался сделать, чтобы она работала корректно.
В архиве - пример и описание возможностей форматирования.
Php test online (запуск php кода онлайн)
Как обычно, случайно натолкнулся: http://writecodeonline.com/php/ - онлайн тестировщик php кода. Проще говоря, пишешь код и можешь его исполнить.
Для памяти. Как лечить pcfg_openfile: unable to check htaccess file, ensure it is readable, referer:
В общем, создавая новый проект, налетел на такую ошибку: pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://site
Причем, не подгружались картинки из /themes/%THEME%/images - то есть выглядело это так: `все работает`, но изображения на странице - отсутствуют.
Лечится достаточно просто.
1) Смотрим лог:
cat ~/WWW/%SITENAME%/error.log | tail -20
Видим в нем следующее безобразие:
[crit] [client 127.0.0.1] (13)Permission denied: /home/alexander/WWW/%SITENAME%/www/themes/ap/images/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://site/
2) Проверяем, что за права на папку
ls -li ~/WWW/%SITENAME%/www/themes/ap/
Получаем что-то типа:
6966642 drwx------ 2 alexander alexander 4096 мая 19 20:40 images
3408302 -rw-r--r-- 1 alexander alexander 15709 мая 19 20:36 index.php
Внимательно рассматривая сию картину, понимаем: читать папку images `никому низя`
3) Меням картин мира
chmod +rx ~/WWW/ap-pavel/www/themes/ap/images/
ls -li ~/WWW/%SITENAME%/www/themes/ap/
Получаем:
6966642 drwxr-xr-x 2 alexander alexander 4096 мая 19 20:40 images
3408302 -rw-r--r-- 1 alexander alexander 15709 мая 19 20:36 index.php
Большой ПС.
Я не разбирался конкретно с тем, нужно ли давать всем +rx, просто сделал - так как локальная машина, доступ к локальным сайтам закрыт на уровне IPTables, сайты повешены на нестандартные порты... и по большому счету - думать, действительно ли нужно запускать скрипты в папке всем, просто не хотелось. На реальном хостинге - скорее всего добавлял бы +rx для группы, и +r для всех.
Linux Mint 16 vs Linux Mint 15
Поставил Linux Mint 16 (Petra) на домашний неттоп.
И все бы хорошо, но есть несколько "но":
1) Файлы локальных сайтов у меня лежат в домашней директории. Apache 2.4.6 с какого-то перепугу не смог их прочесть (не было доступа для пользователя www-data в директорию пользователя alexander).
Вообще говоря, есть несколько способов решения этой проблемы. Первый, ввести www-data в группу alexander и запускать apache из-под этой группы. Вторй, запускать apache под пользователем alexander, входящего в группу alexander. По идее, так как сайты локальный, и iptables начисто блокирует возможность работы с этими сайтами по локальной сети, то для ленивых второй способ предпочтительнее (минус одно действие).
Итого в файле /etc/apache2/envvars из-под рута вносим правки:
export APACHE_RUN_USER=alexander export APACHE_RUN_GROUP=alexander
2) От ошибки
PHP Warning: getdate() function.getdate]: It is not safe to rely on the system’s timezone settings. You are required to use the date.timezone setting or the date_default_timezone_set() function спасает явно прописать в /etc/php5/apache2/php.ini (из-под рута), в секции [Date]
date.timezone = Europe/Moscow
И да, не забыть рестартовать апапч:
sudo /etc/init.d/apache2 restart
3) А вот ошибка Deprecated: mysql_pconnect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in %file_name% так просто не лечится. Дело в том, что начиная с php 5.5 поддержка базового расширения mysql из php "начинает убираться" - сначала предупреждающими сообщениями, а затем - и полностью.
В принципе, ничего страшного - переписать класс для работы с БД и все.
Для памяти:
/etc/init.d/apache2 -v - версия апача
Во всем остальном - особых отличий не заметил. Все настройки (пользователя и системы) штатно перенеслись (скрипт - архив - облако - скачивание - разархивация) и заработали.
Отдельный вопрос - синхронизация, но про нее как-нибудь позже.
Быстрое разворачивание базы данных mqsql на хостинге
Пришлось тут переносить сайт с локального на нормальный хостинг. Все бы хорошо - да нет на нем предустановленных оболочек типа phpMyAdmin, а снаружи порты mysql, естественно, закрыты.
В общем, засада. Не знаю, кто как - а я нашел отличное решение.
Знакомитесь: Sypex Dumper 2.
Скрипт устанавливается в отдельную папку на сервере, и работает автономно. При запуске вводите имя и пароль на сервер mysql - он не хранит их нигде (что хорошо с позиции безопасности)? получаете доступ к собственно скрипту.
Собственно, он "заточен" под создание и восстановление бекапов в виде .sql файлов. Причем, по заверениям разработчиков, с большими по размерами файлами он справляется не менее легко, чем с маленькими. Не знаю, не проверял - но вот небольшие (120 Кб) .sql файлы, сгенерированные phpMyAdmin, он "съедает" на ура. Что, в общем от него и требовалось ))
Так что если кому надо - весьма рекомендую.
NB - на сайте есть платные версии, и есть бесплатная. Мне более чем хватило возможностей бесплатной, хотя в платной, наверное, тоже есть своя "фишка", и не одна.