Ответы пользователя по тегу PHP
  • Какие есть хорошие материалы для для изучения современного PHP на серьёзном уровне?

    @Vampiro
    Есть вот такие сайты : www.phptherightway.com
    Но по мне так куда полезнее поизучать фреймворки (именно исходники) yii2, Silex, Symfony2. Этот код пишется сообществом, и им же правится. Естественно, там все модные течения и фишки :)
    Ответ написан
    Комментировать
  • Как можно реализовать таймеры для браузерной игры?

    @Vampiro
    я бы делал так.
    1. берем текущее состояние и время когда последний раз отдавали значение ($a, $t)
    2. считаем дельту по времени $dt = time()-$t;
    3 рассчитываем новое значение $new = $a+ ($dt*1.2); где 1.2 - это коэффициент увеличения в секунду, скажем.
    4. сохраняем время и новое значение

    при обновлении статов пересчитываю все параметры от этого стата зависящие.
    Ответ написан
    Комментировать
  • Класс или функция PHP?

    @Vampiro
    Будьте откровенны с собой.
    строка
    $info = profile_info($user_id) не совсем явно рассказывает вам, что в этом месте вы полезете в базу данных за информацией о пользователе. И скорее всего вам придется писать комментарий.
    для строки
    $info = (new User())->loadFromDatabase($userId)->getInfo();
    коммента не нужно.

    Для проектов со временем жизни больше трех дней я рекомендую делать классы по мере возможностей.

    Это как яичница. Можно пожарить два яйца и сожрать вприкуску с луком и бутербродом с колбасой. А можно сделать глазунью и нарезать туда колбаски, помидорки, лучок, все обжарить, чтобы шкварчало... пойду поем чего-нить.
    Ответ написан
    Комментировать
  • Как реализовать фасетную фильтрацию?

    @Vampiro
    Для решения задачи, необходимо определиться с терминами.
    Пусть "пользователь выбрал производителя" означает выбор из некоего select в форме поиска.
    Пусть "пользователь выбрал размер" - это числовое значение в поле формы.
    Пусть "отфильтровался товар" - это результат показываемый пользователю после нажатия кнопки "Поиск".
    Тогда на стороне сервера в php можно сделать примерно так:
    $where[]=1; <- это чтобы фильтровать по всем товарам и не сломать при этом запрос.
    
    if (isset($_GET['madeby']))
    {
    если мы что-то выбрали в списке производителей...
    $where[]="t.madeby='".(int)$_GET['madeby']."'";
    }
    if (isset($_GET['sizeHi']))
    {
    если мы что-то указали в размерах - то добавляем еще одно условие, пускай оно в джойн-таблице.
    $where[]="parenttable.size<='".(int)$_GET['sizeHi']."'";
    }
    формируем запрос, собирая все условия в одну строку через "and"
    $request = "select * from sometable t left join parenttable on (parenttable.parent_id=t.id) where ". implode(" and ",$where);
    и смотрим что получилось.
    var_dump($request);
    запрос выполняем, результат показываем.

    Это не самый оптимальный, но самый простой вариант который должен бы направить вас в "нужную сторону мысли"
    Ответ написан
    Комментировать
  • [PHP] Ставить ли скобки в условии if, если в блоке всего 1 действие?

    @Vampiro
    Есть такое понятие, как "стандарт кодирования". Первый с гугла: www.skillz.ru/dev/php/article-Standarty_kodirovani...

    Разные команды пишут по разным стандартам. Большинство редакторов умеют "отстандартить" код =) Так что дело вкуса.

    ЗЫ на собеседованиях про psr-2 могут запросто спросить.
    Ответ написан
    Комментировать
  • Как через ajax запустить php, генерирующий файл?

    @Vampiro
    Учитывая, что у вас уже есть приличная готовая часть и ее нет смысла переделывать, я бы реализовал это так:
    1. Добавляю в форму некий UID (rand)
    2. onSubmit, кроме отправки формы к generate.php я дизаблю контролы и отправляю на сервер ajax запрос с этим UID (/generationcheck.php?uid=....) в коллбеке — разлочивание контролов.
    3. в generate.php я добавляю в самое начало коннект к мемкешу (допустим) и в него ставлю отметку, что начал генерить файл с UID=$_POST['UID']. после генерации, я отмечаю в мемкеше, что все сделано (например, меняю значение с 0 на 1)
    4 файл generationcheck.php подключается к мемкешу, проверяет, что файл еще генерится и засыпает в цикле while на секунду. Как только при очередной проверке замечено, что файл сгенерился — удаляем переменную из мемкеша и отправляем респонс клиенту, чтобы раздизаблить контролы на форме. Ну и аварийный выход через 60 циклов, на случай если генерация файла с ошибкой произошла.

    Как-то так, если не хочется ифреймы воротить. Потом можно будет сделать просмотр — какие именно файлы сейчас генерятся на серваке при желании. Но у вас на одного клиента будут висеть два открытых коннекта, что не есть гуд.
    Ответ написан
    Комментировать
  • PHP Cluster и файлы сессий на общем файловом хранилище. Возникают бесконечные блокировки?

    @Vampiro
    В порядке бреда: Может на серверах php-fpm от разных пользователей запущены? И тогда права на файл с сессией созданой серв№1 не позволяют в нее записать с серв№2?
    Ответ написан
  • json_encode — строгая типизация

    @Vampiro
    Я бы сделал такую штуку:
    ввел массив с типами переменных, которые должны быть в json явно указаны.
    и применял эти типы. Как-то так, в псевдокоде.
    class MyJson {
        private $types = ['id'=>intval,'name'=>'strval','price'=>'floatval'];
        public function convert2Json($array)
        {
            foreach ($array as $key=>$value)
            {
                if (isset( $this->types[$key] )) $array[$key] = {$this->types[$key]}($value);
            }
            return json_encode($array);
        }
    }
    
    Ответ написан
    Комментировать
  • Классы, пространства имен, функции?

    @Vampiro
    ок, еще раз. Вот вы создали такую штуку. Напичкали в нее кучу классов. Скажем… 15. Теперь вы в коде пишите:
    class A {
        callMethod('foo',|
    }
    

    Вот вы набрали функцию, и набрали даже неймспейс. Курсор у вас стоит после запятой. Что дальше? Дальше вам придется вспоминать название функции или лезть в документацию по утилите. Поскольку никакая IDE не сможет разрезолвить что вам сейчас предложить. И как быть с количеством параметров ей тоже будет не ясно. И еще вы не получите «ленивую загрузку» сходу, как это было бы при нормальной реализации.
    Если в вашем варианте есть хоть один положительный момент — подскажите, плиз. Я, наверное, слеп(
    Ответ написан
  • Выгрузить класс из памяти

    @Vampiro
    Есть система, в ней используется шаблонизатор (Smarty), который инициализируется как поле родительского класса всех модулей. Есть модуль которому шаблонизатор не нужен.

    Найдите модуль родителя. скопируйте его, назовите как-то а-ля BaseModuleNoSmarty. Выкиньте оттуда все, что связано со смарти и отнаследуйтесь от него. То есть у вас два варианта, быстрый и хороший:
    хороший:
    было
    class MyModule extends BasicModule
    стало
    class MyModule extends BasicModuleNoSmarty
    

    и второй, с большим объемом рефакторинга:
    было
    class MyModule extends BasicModule
    class BasicModule extends AbstractModule ( а может это и базовый класс, тогда чуть проще)
    стало
    class MyModule extends BasicModuleNoSmarty
    class BasicModule extends BasicModuleNoSmarty{
    тут добавление Smarty куда надо
    }
    class BasicModuleNoSmarty extends AbstractModule {
    тут все, что было в обычном модуле но без шаблонизатора.
    }
    

    Это если вы не хотите переделывать реализацию базового класса всех модулей.
    Ответ написан
    Комментировать
  • Использование виртуальной среды в веб-разработке

    @Vampiro
    Поднимайте виртуалку, ставьте на нее Linux (я ставлю ubuntu-server). Поднимайте lamp+git|svn|hg. теперь клонируете.
    Разработкой занимаетесь в своей привычной среде, большинство редакторов поддерживает svn из коробки, нужно только указать сервер. Отредактировали — запушили на linux.
    Если для следующего проекта будет нужно другое окружение — копируете виртуалку из клона.
    А там, глядишь, и на linux переползете полностью :)
    Виртуалки рулят, только желательно оперативы побольше и винт ssd, чтобы совсем огонь было. Но я заводил и на ноутбуке.
    Ответ написан
    2 комментария
  • Определение кода юникод по символу (PHP)?

    @Vampiro
    а пробовали более простой метод, а-ля
    iconv + preg_match('A-z|А-я|0-9|....')?
    Ответ написан
  • Socket-сервер php или python?

    @Vampiro
    Выбирайте то, что лучше знаете. Если пишете не для повышения квалификации. Потом, на досуге, можете сделать вариант на питоне (для самообразования) и сравните. Может и статья родится на Хабр! А для продакшана лучше идти там, где большинство граблей уже прощупано.
    Ответ написан
    1 комментарий
  • Как замаскировать номер кредитной карты с помощью регулярного выражения?

    @Vampiro
    Для записи в лог лучше делать примерно так:
    cc_number=HIDDEN_CC_NUMBER&amount=1500&CVV=HIDDEN_CVV
    А то через пару недель вы будите лепить регулярки для поисков по логам 3-4-12-14-16 последовательных «X»
    Ответ написан
    1 комментарий
  • Проблема в связке PHP + MS SQL Server 2005

    @Vampiro
    SELECT @@MAX_CONNECTIONS AS 'Max Connections';

    Погуглите sp_configure еще.

    Но, как уже сказали выше, это не решит проблему, необходима прокладка. Хотя может дать время на ее разработку.
    Ответ написан
    Комментировать
  • Какой красивый CRUD/Scaffold генератор под PHP+MySQL вы используете?

    @Vampiro
    Я не смог найти. Сделал свой за 15 минут, прикрутил бутстрап.мин и смотрится няшно.
    Ответ написан
    1 комментарий
  • Поиск фрагмента в PHP,HTML или JS-коде сайта

    @Vampiro
    Я пользуюсь мозгом и логами http-сервера, в котором написано какой файл и с какими параметрами был вызван при запросе.

    Другое дело, как вы не зная в каком месте надо что-то делать, пишите кусок кода эти тридцать минут? Может там двумя строчками ниже есть для этого готовый метод?
    Ответ написан
    Комментировать
  • Как ограничить произвольный mysql запрос только SELECT командой?

    @Vampiro
    ИМХО grant
    Ответ написан
    Комментировать
  • Очередь заданий на PHP/MySQL. Пишу очередной костыль?

    @Vampiro
    Погуглите phpdeamon. Думаю, однопоточного демона тут вполне достаточно. Есть задача — работаем. Нету — слип на 10/60/600 сек. Запуск демона можно будет прикрутить на крон.

    Грамотно — не использовать паттерн «костыль», а пользовать готовое решение, разбираясь в нем по ходу дела :)
    Ответ написан
    3 комментария