Запись с тегами: php

Как разбить поле «ФИО» на имя, фамилию и отчество в PHP

Бывают случаи, когда ФИО пользователей на сайте задавалось с помощью единственного поля «ФИО», а после какого-то времени, в ходе рефакторинга базы, решили сделать 3 поля — Фамилия, Имя, Отчество. Как же быть со старыми данными? Ведь пользователи вводят туда всё что угодно. Попадаются такие ФИО как «Иванов К.М.», «пЕтрова ивгения», «Константин пАВЛОВ директор». Как же выделить из этих «ФИО» осмысленную информацию, настоящие имя, фамилию и отчество, чтобы заполнить соответствующие поля?

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

Библиотека анализа и нечёткого поиска в строке фамилии, имени, отчества.

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

Взять библиотеку можно здесь: https://github.com/MihanEntalpo/FIO-Analyzer

Установка с помощью composer:

В вашем файле composer.json нужно прописать:

{
    "require": {
        "mihanentalpo/fio-analyzer": "*"
    }
}

Установить:

composer.phar install

Читать далее


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), так и специализированными мощными инструментами, позволяющими запускать тысячи процессов, распараллеливать по ним задачи, балансировать с их помощью нагрузку на сервера и так далее.

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

Читать далее


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

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

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

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

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

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

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

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

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

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

Читать далее


Быстрое сравнение изображений на PHP через hash изображения

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

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

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

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


Преобразование значений полей PHP-форм во вложенные объекты JavaScript

Как известно, чтобы передать в PHP-скрипт данные из HTML-формы в виде массива, нужно использовать ключи вида «field[key]», например:
[html] <form id=myform>
Пользователь 15:<br>
<input type=hidden name="User[15][id]" value="15"><br>
Имя:<input type=text name="User[15][name]" value="Вася"><br>
Телефон:<input type=text name="User[15][phone]" value="+79991234567"><br>
Пользователь 16:<br>
<input type=hidden name="User[16][id]" value="16"><br>
Имя:<input type=text name="User[16][name]" value="Петя"><br>
Телефон<input type=text name="User[16][phone]" value="+79824445551"><br>
</form>
[/html] Многие PHP-фреймворки при создании HTML-форм, дают имена их элементам подобным образом. Это и понятно, формировать их так — очень просто, при передаче такой формы в PHP-код она превратится в удобный массив вида:

array(
    "User" => array(
        15 => array(
            "name" => "Вася",
            "phone" => "+79991234567"
        ),
        16 => array(
            "name" => "Петя",
            "phone" => "+79824445551"
        ),        
    )
);

Но если вы передаёте его не путём обычной отправки формы, а с помощью Ajax, тут вас и подстерегает проблема.

Читать далее


Генератор текстов / множитель статей на PHP

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

В интернете есть масса сервисов, позволяющих, введя синонимы для различных слов и выражений, сгенерировать случайный вариант текста. Примеры таких сервисов: http://www.linksfarm.ru/pages/226, http://www.seogenerator.ru/tools/.

Краткая суть в том, что указывая {разные|различные} {варианты|способы написания} в [вот|таком] виде, {можно|есть возможность} {получить|создать|сгенерировать} {различные|разнообразные} {варианты|версии} написания {одного и того же |}текста.

Да, в Интернете есть сервисы, позволяющие генерировать такие случайные тексты из таких вот шаблонов, но что если нужен свой собственный?
Читать далее


Удобный инструмент замера скорости выполнения участков PHP-кода

Посмотрите, понравится ли вам возможность замерить время выполнения различных частей кода вот таким простым способом:

<?php
class SomeClass
{
    function getData()
    {
 
        Profiler::init();
        Profiler::measure("Подключение к базе данных");
 
        $this->connect();
 
        Profiler::measure("Запрос количества элементов");
 
        $fullCount = $this->getCount($this->currentDbCriteria);
 
        Profiler::measure("Запрос первой страницы элементов");
 
        $firstPage = $this->getData($this->currentDbCriteria, 0);
 
        Profiler::measure();
        Profiler::print_measures();
    }
}

И вывод функции print_measures, выглядящий так:
print_measures

Читать далее


Модификация классов Webasyst и в частности Shop-Script 6 без потери изменений при обновлениях

Кратко:

Как вносить изменения в код фреймворка Webasyst, приложений и плагинов, написанных на нём, так, чтобы не отказываться от обновлений, не отслеживать вручную изменившиеся файлы, при этом, чтобы изменения хранились отдельно от самого кода и хорошо поддавались контролю версий git или других VCS? В этой статье будет предложен почти идеальный способ.

Длинно и подробно:

Утверждение первое: Фреймворк Webasyst, на котором основан Shop-Script 6 (раньше был 5), обладает встроенным механизмом обновлений.
Этот механизм позволяет достаточно удобно применять обновления, выпускаемые компанией Webasyst.
Утверждение второе: При этом, расширяемость приложений, таких как Shop-Script базируется исключительно на использовании плагинов, которые должны использовать «хуки» для улучшения или изменения функциональности. Если вам не достаточно «хуков», те, что есть не дают возможностей влиять на нужные вам элементы функциональности, либо вам нужно изменить работу некоей функции самого фреймворка Webasyst, то плагины вам не подойдут.
Утверждение третье: Для изменения функциональности «на уровне ядра» вы можете изменить непосредственно сами классы Webasyst, ShopScript6 и других приложений, и именно это и советуют разработчики Webasyst на своём форуме поддержки в особо сложных случаях. Однако, благодаря встроенному механизму обновлений, ваши изменения могут легко быть затёрты при следующем обновлении.

Что можно сделать?
Способ «в лоб»:
Можно, при изменении каждого системного файла, копировать то, что получилось куда-нибудь в специальное место, откуда копировать обратно при каждом изменении. Но это утомительно, неудобно, и «некрасиво» с точки зрения архитектуры веб-приложения.
Идеальный способ:
Идеально было бы хранить изменения где-то в отдельных файлах, да так, чтобы они применялись к исходным файлам webasyst при запуске приложения, либо при деплое на удалённый сервер.

У меня есть «почти идеальное решение»!

Читать далее


Консольные команды в плагине webasyst и Shop-Script 5/6 в частности

В документации по фреймворку webasyst описано, как создавать консольные команды, то есть команды которые можно вызывать из консоли, без участия веб-сервера.
Статья справки размещена здесь: www.webasyst.ru/developers/docs/features/cli/
Минус описанного в ней метода в том, что скрипт придётся помещать в папку wa-apps/[APP_ID]/lib/cli, то есть фактически в папку с приложением класть свой код, что приведёт в конечном итоге к бардаку и хаосу.

Также, в справочной системе есть статья о плагинах, где написано, что плагины тоже могут иметь консольные команды.
вот эта статья: www.webasyst.ru/help/98/shop-script-5-plugin-development/

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

Читать далее


Страницы:12