Добрый день!В проекте столкнулся со следующей задачей: есть новостная лента фотографий, постить в которую пользователи могут только по одной фотографии, а отображать их нужно вместе в виде галереи. Иными словами, все строки выборки нужно логически объединить в несколько «временных окон» по каждому автору и использовать это при отображении.Напрашивается группировать следующие один за одним посты, однако это не подходит: если два пользователя параллельно и неспешно аплоадят сотню фотографий — в ленту они добавляются поочерёдно, и при просмотре посты будут неприятно чередоваться.За решением на MySQL Читать полностью »
Метка «mysql» - 14
Группировка серийных постов, близких по времени
2012-08-22 в 15:39, admin, рубрики: mysql, метки: mysqlСкрипт мониторинга процессов MySQL на Perl
2012-08-22 в 13:06, admin, рубрики: mysql, perl, Программирование, метки: monitoring, mysql, perlВсем привет.
Более пяти лет я работаю системным администратором в хостинговой компании, обслуживаю более сотни серверов с freebsd и centos. За это время накопилось много самописных скриптов, облегчающих мне жизнь. Этими скриптами хочу поделиться с сообществом, да и выслушать здоровую критику никогда не помешает.
Предыстория.
Читать полностью »
DVelum – платформа разработки на PHP + ExtJS4
2012-08-19 в 20:10, admin, рубрики: dvelum, extjs, IDE, mysql, open source, php, Библиотека ExtJS/Sencha, метки: dvelum, extjs, IDE, mysql, open source, PHP Хочу познакомить Вас с проектом, который позволит по-новому взглянуть на процесс разработки приложений с web-интерфейсом.
Это не очередная cms или framework, это платформа разработки высокопроизводительных приложений, система управления данными.
При создании были использованы нестандартные интересные подходы. Ничего сверх революционного, реализованы очевидные вещи, которых сильно не хватает во фреймворках и cms.
Читать полностью »
Приведение к типам в Yii::app()->request
2012-08-17 в 7:49, admin, рубрики: mongodb, mysql, php, yii, метки: mongodb, mysql, PHP, yiiВсем привет!
Хочу поделиться с вами небольшим решением проблемы, с которой столкнулся при переносе части данных проекта в mongodb.
Изначально у нас использовалась только Mysql и все параметры приходящие от клиента вполне себе позволяли получать данные из базы без каких-либо проблем.
<?php
$id = Yii::app()->request->getParam('id', 0);
$data = Data::getForId($id);
?>
А суть в том, что для mysql нет разницы [select * from data where id = 1] или [select * from data where '1'].
Но mongodb типы данных различает, по этому нельзя найти запись используя условие id == '1' если id в mongodb является числом.
Flashcache, или I/O на стероидах
2012-08-15 в 13:51, admin, рубрики: FlashCache, linux, mysql, ssd, sucess story, история успеха, стероиды, хостинг, метки: FlashCache, linux, mysql, ssd, sucess story, история успеха, стероидыНаверное, все уже в курсе, что одно из главных узких мест серверов — дисковая подсистема. Особенно это заметно на web-серверах и больших СУБД. Производители жестких дисков находятся в постоянной гонке за производительность, но против физики не попрешь — головка жесткого диска не может болтаться со скоростью света :).
Приходят SSD, казалось бы, вот оно — счастье! Нет механики, не надо ждать, пока головка доедет до нужной точки (особенно если данные фрагментированы или ОС пытается считать много всего сразу). Ан нет — дорого, ненадежно, места мало — в общем, на сервер не поставишь.
Какое решение? Правильно, совместить! Задача — получить скорость и время доступа SSD и надежность и обьем HDD. Существуют аппаратные решения, но мы же бедные экономически подкованные — поэтому будем делать программно.
Читать полностью »
Отчёт о неудачной попытке получить заявленную эффективность от prepared statements
2012-08-15 в 8:05, admin, рубрики: mysql, mysqli, php, prepared statements, Веб-разработка, подготовленные выражения, метки: mysql, mysqli, prepared statements, подготовленные выраженияРассказывая в своей статье о типичных заблуждениях, связанных с защитой от SQL инъекций, среди прочих я отметил тот факт, что серверные подготовленные выражения не работают в PHP по заявленному эффективному сценарию — 1 раз prepare(), потом 1000 раз executе().
Ну, то есть, в теории-то они работают — в пределах одного запуска скрипта. Но много ли вы знаете скриптов (написанных профессиональными программистами), которые выполняют кучу одинаковых запросов? Вот я тоже не знаю. Повторяющихся запросов (каких-нибудь множественных апдейтов) — доли процента, а в массе своей запросы уникальные (в пределах одного скрипта).
Соответственно, для нашего уникального запроса сначала выполняется prepare(), потом — execute(), потом скрипт благополучно умирает, чтобы, запустившись для обработки следующего HTTP запроса, заново выполнять prepare()… Как-то не слишком похоже на оптимизацию. Скорее — наоборот.
Но неужели нет способа как-то закэшировать подготовленный запрос между запусками?
Читать полностью »
Несколько интересных приемов и особенностей работы с MySQL
2012-08-14 в 13:43, admin, рубрики: mysql, sql, Программирование, метки: mysql, sql, Программирование Я думаю, что в процессе изучения той или иной СУБД каждый из вас не раз изобретал велосипеды для решения своих задач, не зная о существовании той или иной функции или приема, которые бы могли в разы ускорить выполнение запросов и уменьшить объем кода. В данной статье я хочу поделиться с вами своим опытом работы с очень «добрым» и «отзывчивым» MySQL, часто позволяющему программисту делать вещи, которые другие СУБД переварить бы не смогли. Материал будет полезен скорее тем, кто только решил углубиться в чудесный мир запросов, но возможно и опытные программисты найдут тут что-то интересное.
Читать полностью »
Защита от SQL-инъекций в PHP и MySQL
2012-08-06 в 5:22, admin, рубрики: mysql, mysqli, PDO, php, prepared statements, информационная безопасность, метки: mysql, mysqli, PDO, PHP, prepared statements, sql-injectionК своему удивлению, я не нашёл на Хабре исчерпывающей статьи на тему защиты от инъекций. Поэтому решил написать свою.
Статья получилась довольно длинной — в ней собраны результаты исследований за несколько лет — но самую важную информацию я постараюсь компактно изложить в самом начале, а более подробные рассуждения и иллюстрации, а так же различные курьёзы и любопытные факты привести в конце. Также я постараюсь окончательно развеять множественные заблуждения и суеверия, связанные с темой защиты от инъекций.
Я не буду пытаться изображать полиглота и писать рекомендации для всех БД и языков разом. Достаточное количество опыта у меня есть только в веб-разработке, на связке PHP/MySQL. Поэтому все практические примеры и рекомендации будут даваться для этих технологий. Тем не менее, изложенные ниже теоретические принципы применимы, разумеется, для любых других языков и СУБД.
Сразу отвечу на стандартное замечание про ORM, Active record и прочие query builders: во-первых, все эти прекрасные инструменты рождаются не по мановению волшебной палочки из пены морской, а пишутся программистами, используя всё тот же грешный SQL. Во-вторых, будем реалистами: перечисленные технологии — хорошо, но на практике сырой SQL постоянно встречается нам в работе — будь то legacy code или развесистый JOIN, который транслировать в ORM — себе дороже. Так что не будем прятать голову в песок и делать вид, что проблемы нет.
Хоть я и постарался подробно осветить все нюансы, но, вполне возможно, некоторые из моих выводов могут показаться неочевидными. Я вполне допускаю, что мой контекст и контексты читателей могут различаться. И вещи, которые кажутся мне сами собой разумеющимися, не являются таковыми для некоторых читателей. В этом случае буду рад вопросам и уточнениям, которые помогут мне исправить статью, сделав её более понятной и информативной.
Ещё только начав интересоваться темой защиты от инъекций, я всегда хотел сформулировать набор правил, который был бы одновременно исчерпывающим и компактным. Со временем мне это удалось:
Правила, соблюдение которых гарантирует нас от инъекций
- данные подставляем в запрос только через плейсхолдеры
- идентификаторы и ключевые слова подставляем только из белого списка, прописанного в нашем коде.
Всего два пункта.
Разумеется, практическая реализация этих правил нуждается в более подробном освещении.
Но у этого списка есть большое достоинство — он точный и исчерпывающий. В отличие от укоренившихся в массовом сознании правил «прогонять пользовательский ввод через mysql_real_escape_string» или «всегда использовать подготовленные выражения», мой набор правил не является катастрофическим заблуждением (как первое) или неполным (как второе).
Но вперёд, читатель — перейдём уже к подробному разбору.
Читать полностью »
Доступ к телам хранимых процедур MySQL
2012-08-03 в 9:26, admin, рубрики: mysql, разработка, метки: mysqlПару раз сталкивался с ошибкой при вызове хранимых процедур:
User does not have access to metadata required to determine stored procedure parameter types. If rights can not be granted, configure connection with «noAccessToProcedureBodies=true» to have driver generate parameters that represent INOUT strings irregardless of actual parameter types.
Решение, предлагаемое в тексте исключения — использовать параметр noAccessToProcedureBodies в строке подключения (отключение доступа), но меня интересовал вопрос, как дать доступ к телам процедур.Читать полностью »
Еще 12 «рецептов приготовления» MySQL в Битрикс24
2012-08-01 в 13:28, admin, рубрики: amazon, mysql, Percona, SaaS, битрикс, Битрикс24, Блог компании 1С-Битрикс, Корпоративный портал, облако, системное администрирование, Социальный интранет, метки: amazon, mysql, Percona, SaaS, битрикс, Битрикс24, Корпоративный портал, облако, Социальный интранетВ нашей прошлой статье — «11 «рецептов приготовления» MySQL в Битрикс24» — мы, в основном, рассматривали архитектурные решения: стоит ли использовать облачные сервисы (типа Amazon RDS), какой форк MySQL выбрать и т.п.
Судя по отзывам, тема грамотной эксплуатации MySQL в больших «хайлоад» проектах — очень большая и важная. Поэтому мы решили рассказать еще о некоторых нюансах настройки и администрирования БД, с которыми сталкивались при разработке «Битрикс24» и которые используем ежедневно.
Еще раз напомню, что эта статья (как и предыдущая) не является универсальным «рецептом» идеальной настройки MySQL на все случаи жизни. :) Такого не бывает. :) Но искренне верю, что она будет полезной для вас для решения отдельных конкретных задач.
А в конце статьи — сюрприз для самых терпеливых читателей. :)
Читать полностью »