PHP, Nginx, отключение буферизации

В некоторых случаях требуется чтобы скрипт на PHP выводил свои данные в браузер без буфферизации, непосредственно после команд echo или print_r.
Например, при написании долгоиграющего скрипта, который должен быть запущен при помощью pdem, чтобы выводить из скрипта прогресс выполнения и прочие данные в сервер pdem, понадобится отключить буферизацию.
Как выяснилось, в интернете есть целая куча разных рекомендаций и решений вопроса отключения буферизации, который пришлось объединить в одно целое, чтобы добиться цели. В моём случае, буфферизация Nginx и Yii вставляли палки в колёса.
Здесь я представляю данное решение.
Читать далее


Простой запуск и контроль фоновых процессов в PHP и Python

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

  • Процесс граббинга сторонних Интернет-ресурсов
  • Импорт некоего большого файла
  • Архивация файлов в файловой системе (например, если вы пишете веб-панель управления файлами)
  • Синхронизация с удалённой базой данных (например, 1С)
  • Обработка большого количества файлов (пересжатие картинок)
  • Конвертация базы данных в новый формат

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

1) Как запустить долгоживущий процесс независимо от главного, чтобы по завершении главного процесса (того кто запускает), дочерний продолжил работу?
2) Как получать от запущенного долгоживущего процесса информацию о его прогрессе (если таковая имеет смысл), а также прочие данные о состоянии, из других процессов?
3) Как передавать эту информацию изнутри долгоживущего процесса?
4) Как быть точно уверенным, что процесс всё ещё работает, или наоборот, что он уже завершился?
5) Как при этом не терять информацию о процессах которые уже завершены?
6) Как добиться того, чтобы долгоиграющие процессы запускались от имени не того пользователя, кто их запускает, а от другого?

У данных проблем есть решения как средствами Unix (файлы pid, команды ps, screen, nohup, sudo в связке с bash, sed, awk), так и специализированными мощными инструментами, позволяющими запускать тысячи процессов, распараллеливать по ним задачи, балансировать с их помощью нагрузку на сервера и так далее.

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

Читать далее


Заметки о ньюансах разработки с использованием Qt и PyQt

Эта запись — блокнот для записи небольших заметок о некоторых неочевидных особенностях, всплывающих при разработке приложений с использованием Qt, а также PyQt.
Эти особенности приходится гуглить, а потом о них быстро забываешь, поэтому будет полезно хранить для себя и человечества эту информацию.

Читать далее


Debian 8 Jessie на ноутбуке Acer ES1-711G

За несколько лет использования в работе и дома ноутбуков Lenovo я уже успел забыть, какие проблемы бывают при попытке установить на ноутбук Linux, так как с ноутбуками Lenovo у меня была единственная проблема — установить правильный WiFi-драйвер.

Но пришло время, когда мне достался ноутбук Acer ES1-711G, и пришлось вспомнить навыки гугления, чтения логов, курения мануалов, и экспериментов с системой. С ходу установить Debian не удалось. А когда удалось — возник ещё целый ряд проблем.

В интернете есть буквально пара-тройка записей посвящённых этому ноутбуку и проблемам, возникающим с ним, но целостной картины нигде нет. Поэтому здесь я соберу полную инструкцию. Может кому-то ещё это поможет.

Читать далее


Установка нового Flash Plugin в Firefox/IceWeasel (Debian Wheezy, Jessie, Ubuntu Wily Werewolf)

Как заставить работать Firefox в Linux с новейшей версией Flash Player (выше 11.2)

Как известно, новые версии Adobe Flash Player существует в нескольких версиях:

  • ActiveX — для Internet Explorer’a (только в Windows)
  • NPAPI — существовал долгое время для всех остальных браузеров, в последнее время остановился в развитии (в Linux, для Windows всё ещё выходит)
  • PPAPI — существует с относительно недавнего времени для браузеров на движке Chromium

Компания Adobe с 2012 года отказалась поддерживать плагин Flash Player для NPAPI, и поэтому у многих пользователей FireFox в Linux версия плагина не поднимается выше 11.2

При этом сейчас (сентябрь 2016 года) уже есть Flash Plugin версии 23 и даже старше.

Решение придумал Ринат Ибрагимов, программер из Казани. Он написал обёртку (враппер) между NPAPI (системой плагинов Firefox) и PPAPI (системой плагинов Chromium). Эта обёртка выглядит для FireFox как обычный NPAPI-плагин, в то время, как для самого плагина, она выглядит как браузер с поддержкой PPAPI (как например Google Chrome).
То есть, схема работы такая:

Новый Adobe Flash PPAPI < => Враппер FreshPlayer Рината < => Firefox

Вот аккаунт героя на гитхабе: https://github.com/i-rinat
А вот и репозиторий с враппером: https://github.com/i-rinat/freshplayerplugin
Хотя в самом репозитории есть инструкция по установке, запишу здесь чёткую последовательность действий, чтобы не забыть, да и другим помочь.

Читать далее


FastFuzzySearch — Быстрый нечёткий поиск среди массива слов на PHP

Бывает, что нужно найти в списке слов наиболее похожие на заданное слово.
Например, если у вас есть список городов, и нужно найти среди них наиболее похожий на то, что ввёл пользователь, даже если при вводе пользователь допустил ошибки.

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

Для таких случаев я написал на php инструмент для нечеткого поиска среди массива строк.

В каких случаях может пригодится данный инструмент:

1. Поиск среди списка стран мира

2. Поиск среди названий страниц вашего сайта в админ-панели

3. Поиск среди уникальных имён ваших пользователей

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

Я, например, написал этот инструмент для того, чтобы разделять поле ФИО, в которое люди вписывают имя, фамилию и отчество в произвольном формате, на отдельные поля Имя, Фамилия и Отчество, с соответствующими значениями.

Читать далее


Хэш изображения для быстрого приблизительного сравнения на PHP

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

  • У вас на сайте есть большая база изображений, и вы хотите найти в ней дубликаты (очень похожие друг на друга) с целью удаления.
  • На вашем сайте есть база изображений, и вы, при загрузке нового изображения, хотите проверить, нет ли уже такого
  • Вы хотите реализовать поиск по изображениям, то есть, если вы хотите выбрать из базы изображение, название которого не помните, но у вас есть его файл, вы можете загрузить этот файл и найти по нему уже существующий, и выбрать найденное

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

Долгие поиски в Интернете, не дали мне подходящего алгоритма, поэтому я создал свой.
Читать далее


Заметки о ньюансах разработки в UnrealEngine4

Эта запись — блокнот для записи небольших заметок о некоторых неочевидных особенностях, всплывающих при разработке игр на Unreal Engine 4.
Все эти особенности приходится гуглить, а потом о них быстро забываешь, поэтому будет полезно хранить для себя и человечества эту информацию.

Речь будет идти в основном о «программировании мышкой» посредством BluePrint’ов.

Читать далее


Автоматический переводчик gettext po-файлов

Наиболее распространённый способ переводов программного обеспечения и веб-сайтов на разные языки — с помощью библиотеки gettext.
Для тех, кто не в курсе, поясню как она работает:

  1. В коде программы/сайта, везде где вам нужно выводить некий текст, меняющийся в зависимости от языка, вы пишете не просто строковые константы, типа «Да» и «Нет», а используете некую специальную функцию вроде _(«Да»), _(«Нет»), или t(«Да»), t(«Нет»), или даже [`Да`], [`Нет`].
  2. Вы запускаете специальный скрипт, который сканирует весь ваш исходный код, находит такие вот специфические вызовы функции, и составляет из них *.po — файл.
  3. Вы с помощью некоего редактора, например poedit добавляете в файл *.po переводы всех строк которые там есть на некий язык, и сохраняете файл как, например, en_US.po, после чего генерируете соответствующий *.mo-файл, в данном случае en_US.mo.
  4. Вы указываете вашей программе/сайту путь к файлу перевода (например, берёте из сессии или из данных браузера язык, который выбран у пользователя, и исходя из этого, выбираете ru_RU.mo или en_US.mo
  5. Программа/сайт автоматически заменяет ваши t(«Да») и t(«Нет») на слова написанные на том языке, который был выбран.

Как же перевести po-файл автоматически, если качество перевода для вас не важно, но нужно чтобы сайт/приложение начало выглядеть как многоязычное для вашего заказчика?

Читать далее


Электронные весы Arduino + HX711 + Python

Мало купить Arduino и написать для него десяток программ, которые мигают светодиодами, реагируют на нажатие кнопок, и измеряют температуру воздуха терморезистором.
Рано или поздно нужно сделать своё первое законченное устройство, от которого будет польза.
Для меня таким устройством стал аппаратно-программный комплекс для снятия данных с датчика силы.

Читать далее


Страницы:12345