Иногда на сервере происходят сошибки типа "mysql server has gone away". Ошибка весьма достадная, тем что возникает она не всегда а только иногда. При этом, путем эмпирических действий удалось выяснить, что такое сообщение вызывается если PHP скрипт какое то время чем то сильно был занят и при этом не обращается к базе данных. Когда после некоторго периода бездействия скрипт, наконец хочет что-либо записать в базу данных то обнаруживается, что ссылка на соединение с базой данных уже мертва и все последующие запросы вылетают с ошибкой "mysql server has gone away". Понятно, что соединение с базой данных рвется по некоему таймауту, но вот по какому и как его увеличить?
Оказалось, что дело в переменной wait_timeout которая живет в /etc/my.conf. В моем случае она оказалась установленной в 30 секунд, поэтому, если во время выполнения скрипта между запросами оказывается промежуток более тридцати секунд - соединение рвется и больше не восстанавливается.
Изменить это значение можно либо поправив my.conf, либо после установления соединения выполнив "SET wait_timeout=1000".
Оставить комментарий
Встал вопрос, в каком виде лучше хранить данные в конфигах. Кажется, что самым простым и надежным было бы использования нативного PHP кода, но почему то в разных популярных системах plain PHP постоянно чем нибудь заменяют.
Чтобы сравнить, что будет быстрее - выполнить PHP файл или распарсерить закодированные данные, написал небольшой скрипт который в цикле делает конфиги и читает их для разного количества переменных. Результаты работы вывели в табличку:
|
method/число записей |
0 |
10000 |
20000 |
30000 |
40000 |
50000 |
60000 |
70000 |
80000 |
90000 |
|
json |
0.0001 |
0.0189 |
0.0380 |
0.0552 |
0.0759 |
0.0911 |
0.1096 |
0.1339 |
0.1494 |
0.1660 |
|
php |
0.0001 |
0.0350 |
0.0738 |
0.1111 |
0.1498 |
0.1953 |
0.2275 |
0.2704 |
0.3090 |
0.3466 |
|
serialize |
0.0000 |
0.0109 |
0.0241 |
0.0357 |
0.0484 |
0.0645 |
0.0671 |
0.0895 |
0.1017 |
0.1183 |
как мы видим, plain PHP -- не самый быстрый способ сохранять данные, лучше использовать другие способы. Самым быстрым оказался serialize, чуть медленне - json.
Коментариев: 1
Недавно для одного из проектов нужно было реализовать интеграцию с Infusionsoft - это такая прикольная CRM SaaS. Изучая их API я нашёл его очень толковым, но когда я поглядел в их PHP SDK я очень расстроился - это нужно было постараться сделать такое уродливое SDK для такого прекрасного API
Во первых для его работы требуется сторонняя XMLRPC библиотека написанная Эдом Думбилом (Edd Dumbill) в далёком 2002 году, она не произвела на меня впечатления - PHP имеет собственное расширение для xmlrpc которое вполне мне годилось. Кроме того, в каждую функцию нужно было передавать ключ доступа, что очень не красиво. Сам iSDK это один класс с кучей методов, хотя API подразумевает использование нескольких классов. Большинство функций имеют уродливые непонятные имена - может ли неподготовленный человек догадаться, что делает функция addCon или campAssign? Хотя, в самом API все имена функций красивые и интуитивно понятные.
Поэтому я решил сделать своё собственное Infusionsoft SDK так как мне показалось правильным.
Но так как я очень ленивый, создавать SDK ручками я не стал а написал маленький скрипт который сделал почти всё за меня распарсерив их API документацию.
То что получилось, получилось вполне работоспособным, полученный код я выложил на hithub. Вдруг, пригодиться кому нибудь ещё.
Сразу скажу - поскольку из всего API мне нужно было лишь несколько функций тестировал я не все. Нужно будет ещё сделать примеры и документацию к получившимуся SDK но начало положено неплохое. Если есть желающие доработать полученную библиотеку - буду только рад.
Оставить комментарий
Заметил, что моя векторная библиотечка не хочет работать в восьмом эксплорере. При этом в Интернете вообще мало примеров работы VML которые бы оставались работоспособными в этом замечательном браузере. Даже на сайте Microsoft примеры VML которые прекрасно работали в шестой и седьмой версии напрочь отказываются работать в восьмерке.
При этом, вроде бы, иногда, что-то как-то работает в режиме совместимости, но не всегда, и только при определенных условиях типа наличия или отсутствия DOCTYPE и даже версии Service Pack.
Убив день на исследования я так ничего не выяснил. Кто то говорит что нужно переделать все размеры в заданные явно в пикселях, кто-то указывает на баг в количестве каскадных таблиц в IE. Каждый раз когда я, наконец, думал, что локализовал проблему она появлялась с другой стороны.
И вот когда я уже почти собрался переделать код на вывод VML в отдельном iframe который бы работал только в режиме совместимости, я нашел код который работает всегда и всезде во всех режимах - это оказался все тот же raphael. Дмитрий Барановский нашел способ обуздать IE8 - весьма неочевидным и почти магическим способом он заставил это всё работать как надо.
Обновлил свой пример для работы c VML.
Оставить комментарий
Набрёл на интересную бублиотечку для создания простых трехмерных визуализаций с использованием VML. Как следстивие использовазония VML работает это только в Internet Explorer. Интересно, можно ли малой кровью сделать для неё SVG реализацию чтобы она стала полностью кроссбраузерной?
Оставить комментарий
После того, как фрактал в примере получился ну архи ме-е-е-е-е-дленным, решил немного исправить ситуацию. Все дело в том, что данную программку я написал как демо для объекта z.Canvas из z.Tools а z.Canvas - это на самом деле хелпер, который рисует графические примитивы при при помощи SVG и VML в зависимости от того, что доступно в текущем браезере. Идея была сделать именно холст, на котором можно было бы рисовать и в Internet Explorer и во всех остальных браузерах, ведь IE, как известно, до девятой версии не поддерживает SVG. Как следствие, каждый примитив на этом "холсте" будет занимать память, и если нарисовать фрактал из прямоугольников на холсте 300 на 300 пикселей, то компьютеру придется выделить память для девяносто тысяч маленьких объектов, само по себе это не сильно много, но всё равно, значительно тормозит весь процесс.
Переделать это дело на "настоящий" HTML5 canvas было делом нескольких минут, вот она, версия на Canvas, работает значительно быстрее и уже не жрет большого количества памяти.
Уже выложив, придумал, как ещё немного ускорить процесс рисования - сейчас, каждая точка рисуется в отдельном потоке через setTimeOut а это тоже страшно медленно - если делать без setTimeout процесс "подвиснет" пока не завершится рассчет фрактала, но можно сделать, чтобы рисовалась не точка но целая линия - это ускорит весь процесс без "зависания" процесса рисования.
Оставить комментарий
Пользуясь небольшим перерывом в эти новогодние каникулы сделал небольшую программку, рисующую жопу множество Мандельброта. Работает, к сожалению, медленнее чем версия на С++, зато картинка получается отменной.
Коментариев: 3
Понадобилось посчитать дистанцию между двумя точками заданными в GPS координатах. В PHP реализация такой фунции выглядит следующим образом:
function calcMiles ($Lat1, $Lon1, $Lat2, $Lon2){
return 3958.75 * acos( sin($Lat1/57.2958) * sin($Lat2/57.2958) + cos($Lat1/57.2958) * cos($Lat2/57.2958) * cos($Lon2/57.2958 - $Lon1/57.2958));
}
Ответ получается в милях, для перевода в метры, полученное значение нужно ещё умножить на 1609.344.
Код взял с phpclasses.com. Кстати, глядя на код оригинального класса можно сделать вывод, что автор обладает хорошим чувством юмора - он реализовал вывод результата в десятках различных единиц, включая нанометры, парсеки и световые года.
Коментариев: 1
Выходные провёл с пользой - сделал ещё один простейший текстовый редактор, на этот раз под Андроид. Конечно, уже существует огромное множество готовых редакторов, но мне захотелось создать свой, ведь лучший способ научиться что-либо делать — делать самому. Собственно, идея сделать текстовый редактор появилась после того как я снёс с телефона Ted - работает весьма странно, иногда ни с того ни с сего портит кодировку файла а при сохранении постоянно спрашивает имя сохраняемого файла - это меня сильно достало, ведь сохраняюсь я постоянно, хотя, в целом ted — не плохой редактор.
Вообще, у меня полно задумок относительно того, что можно создать на этой платформе, вот, первый блин уже появился, надеюсь, что появятся и другие.
Большое спасибо Александру Понамарёву за классный диалог выбора файлов, без него у меня бы ушло гораздо больше времени.
Ссылка на apk файл.
Оставить комментарий
Я уже писал, что нужно сделать, чтобы заменить в коде Posix регулярные выражения, которые в PHP 5.3 стали deprecated, на Perl совместимые. Оказывается Rerl совместимые регулярные выражения поддерживают литералы используемые в Posix такие как [[:allnum:]], [[:space:]] и т.д. В одном месте чужёго кода заметил это, и вот дошли руки проверить на практике: конструкция вида preg_match('/[[:space:]]/','df d') работает идентично конструкции вида preg_match('/\s/','df d') т.е. совсем не нужно при замене ereg на preg_match заменять еще и литералы, достаточно добавить слева и справа слеши "/". Кстати кроме слешей можно использовать любой другой символ, например "#" это полезно когда в регулярном выражении уже есть слеши - чтобы их не экранировать и не ухудшать читаемость кода.
Оставить комментарий