• PHP: Почему Class not found если use в другом файле?

    dubr
    @dubr
    пыхарь
    Почитайте доку для разнообразия.
    Неймспейсы и директивы use работают на уровне файлов. То есть use связывает полное имя с кратким/алиасом только в том файле, где его написали.
    Ответ написан
    Комментировать
  • Как узнать что элемент вышел из контейнера?

    dubr
    @dubr
    пыхарь
    Если надо код попроще, делайте requestAnimationFrame + getBoundingClientRect, когда элементов мало будет работать норм. Если надо, чтобы быстро работало на больших списках - стройте модель, как советует napa3um
    Ответ написан
    Комментировать
  • Как удалить данные строки из индекса google?

    dubr
    @dubr
    пыхарь
    1)
    User-Agent: *
    Disallow: /wp-content/

    Это если в папке wp-content нету ничего, что вы хотите индексировать (например, какие-нибудь PDF).

    2) Настройте сервер, чтобы он не показывал индексы директорий.

    Для nginx см. autoindex
    Для apache см. DirectoryIndex
    Ответ написан
    Комментировать
  • Как реализовать распределение фото по серверам?

    dubr
    @dubr
    пыхарь
    Вот довольно известная статья: Масштабируемое хранилище фоток - с картинками и сниппетами на пхп.
    Ответ написан
    Комментировать
  • Как удалить все переменные созданные внутри цикла по его окончанию?

    dubr
    @dubr
    пыхарь
    Поддерживаю мысль Василий - если имеется php 5.4+, можно даже так:

    $res = [];
    array_walk(
        $arr,
        function($k, $v) use (&$res) {
             // создаем любые переменные в любом количестве
             // при необходимости пишем что-нибудь в $res
        }
    );

    И посмотрите еще на array_map.

    Либо можно вынести сам цикл в отдельный метод.

    Кстати, расскажите, зачем оно вам вообще понадобилось?
    Ответ написан
    Комментировать
  • Как правильно составить регулярное выражение?

    dubr
    @dubr
    пыхарь
    * влияет на предыдущий символ. Ваша регулярка ищет символы: "n" (1 шт), "i" (1 шт), "c" (0 и более шт).

    Зачем вам тут вообще регулярка - не понимаю, по ощущениям скорее всего надо делать как-то иначе =) Если таки хочется получить регуляркой часть после nic (если я правильно понял ход мысли), то как-то так:

    <?php
    preg_match("~^nic(.+)$~", "nic0000-0000-0000", $matches);


    В $matches будет
    array (
      0 => 'nic0000-0000-0000',
      1 => '0000-0000-0000',
    )


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

    dubr
    @dubr
    пыхарь
    Вместо дополнительных таблиц под каждый тип можно создавать дополнительные столбцы.

    entity_id       # INT, ссылка на объект, которому принадлежит свойство
    attribute_id    # INT, ссылка на инфу о свойстве
    value_int       # INT, значение целочисленное
    value_varchar   # VARCHAR, короткий текст
    value_text      # TEXT, длинный текст
    value_whatever  # и так далее: DATETIME, ENUM, DECIMAL


    Так раньше было сделано в Битриксе, например (как сейчас не знаю). При таком подходе мы можем собрать свойства отдельной энтити одним запросом (без юнионов), но таблица получается разреженной, большую часть значений составляют NULL-ы.

    Отдельная таблица на тип создается, например, в Magento (опять же надо проверить, но раньше было так, и вряд ли они радикально меняли схему). Можете посмотреть, какие запросы генерирует их ORM.

    Ну и вообще поковыряйте разные e-commerce продукты, EAV в каком-то виде реализован у всех.

    Если вас пугает именно написание джойнов - зря пугаетесь, один фиг завернете их в какой-то API, потому что писать такое руками - утомительно и ведет к ошибкам.

    Если вас пугает производительность схемы - ну, в идеале надо тестировать на ваших данных с вашими сценариями. Если лень или пока нет ни данных, ни сценариев ;) погуглите бандл / модуль для своего фреймворка и пляшите от него.
    Ответ написан
    1 комментарий
  • Как решить проблему с ошибкой: open_basedir restriction in effect. File(/home/u314597346/public_html/tmp) is not within the allowed path(s)?

    dubr
    @dubr
    пыхарь
    open_basedir - настройка, которая ограничивает места, куда php может "лезть".

    В вашем случае это директории:

    /home/u850868817
    /tmp
    /var/tmp
    /opt/php-7.0/pear
    /usr/local/bin // вау!
    /etc/pki/tls/certs

    На шаред-хостингах значение задается "сверху" хостером и переопределить его из скрипта нельзя.

    На картинке: Джумла взяла значение upload_tmp_dir - это временная директория для загрузки файлов на сервер, и попыталась проверить, можно ли туда писать. Но проверить не получилось, потому что open_basedir не пустил is_writable() к этой директории, потому что ее и ее родителей нет в списке разрешенных.

    Вам хорошо бы выяснить, кто такой u314597346 - потому что ваш аккаунт называется u850868817. Скорее всего вы где-то его скопипастили и надо искать по исходникам. Попробуйте создать вот такой файл:

    <?php
    echo 'tmp dir: '.ini_get('upload_tmp_dir')."<br />";
    echo 'doc root: '. $_SERVER['DOCUMENT_ROOT'];


    и посмотрите, что он выведет. Если там будут разные uXXXX - надо спрашивать хостера, чо за. Если оба будут u850868817 - надо искать, откуда взялся u314597346.
    Ответ написан
    7 комментариев
  • Какие кавычки следует использовать в массиве и почему?

    dubr
    @dubr
    пыхарь
    1) Решительно пофигу, где используются кавычки - в массиве или где-то еще. При обращении к индексу массива $a["key"] в квадратные скобки попадает выражение "key", состоящее из одного строкового литерала. Кавычки - это не часть магии, достающей что-то из массива =) Так тоже можно:

    $a = ['key' => 'val'];
    $k = "key";
    
    // вау! вот это магия!!!
    echo $a[$k]; 
    
    // просто невероятно!
    echo $a[ strrev('ek') . substr($k, -1, 1) ];


    2) По поводу "одинарные быстрее работают": надо понимать, за счет чего они "работают быстрее". Пхп пытается найти в них переменные и специальные последовательности типа \n при разборе скрипта. То есть один раз в самом начале, а не каждый раз, когда выражение исполняется. То есть:

    for ($i = 0; $i < 100500; $i++) {
    	$b = $a["key"];
    }


    Заменив тут двойные на одинарные, почувствовать разницу не получится, несмотря на длинный цикл. Ее можно почувствовать, если у вас очень очень очень большой php-файл.

    3) И я вот решил наконец выяснить, какая она, это разница =)

    <?php
    $s = 'return count([';
    
    ini_set('memory_limit', '900M');
    
    $rands = [];
    $num = 1000000;
    $quot = '"';
    
    // я турбо-кавычка!
    // $quot = "'"; 
    // ^ ^ ^ ^ ^
    // раскомментируй меня и почувствуй настояющую скорость!
    
    for ($i = 0; $i < $num; $i++) {
        $s .= $quot. md5( rand(100000000, 999999999) . rand(100000000, 999999999) ).$quot.' => 1';
        if ($i !== $num - 1) {
        	$s .= ',' ;
        }
    }
    $s .= ']);';
    
    // получилось строка:
    // return count(['a' => 1, 'b' => 1, ... 1kk раз ])
    
    $start = microtime(true);
    // вот тут будет работать парсер
    eval($s);
    
    // например, 1.4128859043121 сек.
    echo (microtime(true) - $start) . " сек.";


    Мы генерим строку с кодом, который создает массив с миллионом ключей, каждый ключ - md5 от двух случайных чисел. eval запускает парсер и он типа 1.4128 сек отрабатывает.

    Теперь раскомментируем одинарную кавычку, и видим... 1.2484261989594 сек.! То есть разница в 0.16 с на дичайшем и нереальнейшем примере =) Повторим 100 раз, у меня получилось в среднем 0.12 сек. в пользу одинарных. Это на маке с php 5.6. Погонял на VPS с php 7 - там разница 0.36 сек, но между отдельными замерами одинакового способа разброс получается сильно больше этих 0.36, так что не показательно.

    4) Поэтому ориентироваться на "быстродействие" надо в последнюю очередь. На возможность вставлять переменные внутрь двойных кавычек ориентироваться тоже не надо, потому что так делать плохо, потому что читать сложнее, хорошо - закрыть кавычку, поставить точечку и дальше уже доллар (как эс) =)

    В первую очередь надо ориентироваться на вероятность появления переносов строки, которые могут возникнуть в этой строке. Во вторую - на вероятность появления собственно кавычки одного из типов, потому что экранирование снижает читаемость (особенно если это регулярка, где сам слеш тоже надо экранировать). В остальных случаях можно юзать любую, но желательно одну и ту же. Например одинарную, потому что ее на клавиатуре нажимать удобнее =)
    Ответ написан
    Комментировать
  • SSL-сертификат на DNS от Яндекс?

    dubr
    @dubr
    пыхарь
    Как уже написали, в панельке Яндекс.ПДД можно задать нужную TXT-запись. Клик по ссылке "и делегирован на Яндекс" приведет к нужной форме =)

    ca7faf17edaa4233baac3a3c899864b7.png

    Небольшой лайфхак: если не знаете, к какому именно аккаунту на Яндексе прицеплен домен, это можно выяснить вот так:

    dig blogovo.ru soa +short

    Покажет что-то типа:
    dns1.yandex.ru. dubrowsky.yandex.ru. 2012102901 14400 900 1209600 14400


    Значит, надо искать пароль от почты dubrowsky@yandex.ru ;)
    Ответ написан
    5 комментариев
  • Какой конструктор сайтов посоветуете?

    dubr
    @dubr
    пыхарь
    А расскажите подробнее, что такое "мощный, сложный сайт"? Какие конструкторы смотрели и что не получилось сделать?

    "Без регистрации" - имеется ввиду, что на созданном сайте не смогут регистрироваться пользователи, или вы сами не хотите нигде регистрироваться? ))

    Мы сейчас пилим Флоксим - вот это: floxim.ru - сложность можно навертеть довольно сложную, мощность не измерял, дизайны не то чтобы классные, но что-то более-менее приличное можно нащелкать (все демо-сайты собраны прямо в браузере, от ручной верстки шаблонов мы отказались). Посмотрите, но имейте ввиду, что мы где-то между альфой и глубокой бетой =)

    Еще посмотрите https://webflow.com - они на нас во многом похожи (в частности, это одна из немногих платформ, позволяющих более-менее произвольно задавать шаблоны для вывода динамических данных). Но у них хардкорное управление html/css через визивиг, то есть это совсем "верстка в браузере", а мы стараемся все-таки от дивов абстрагироваться, используя более человеческие конструкции. То есть у них можно в любое место dom-дерева добавить любой элемент и приделать к нему любые css-свойства - но при этом хорошо бы понимать устройство CSS layout model. У нас набор свойств ограничен контекстом и (местами) переведен на человеческий язык (например, есть просто "выравнивание", а как оно реализовано внутри - через justify-content, align-items, text-align, margin:auto, float:left и т.д. - это типа наше личное дело, а не дизайнера-пользователя). Таким образом набор "крутилок" очень сильно сокращается, но иногда возникают ситуации, когда что-то сделать нельзя.

    А, ну и еще гляньте https://bubble.is если реально нужна "сложность". Когда я последний раз смотрел, с дизайном там было так себе, а вот визуальное управление всякой логикой они сделали круто. Собственно, они и позиционируются как "visual programming" и скорее для приложений, чем для просто сайтов.
    Ответ написан
    Комментировать
  • Битрикс, shop-script, друпал или какой-то другой движок?

    dubr
    @dubr
    пыхарь
    Судя по описанию проекта, тут важнее выбрать хорошего программиста и положиться на него, чем навязывать платформу, присоветованную людьми, которым это не кодить. Если хороший программист выберет плохую платформу, то он плохой программист - возвращаемся в начало =)

    Смотрите в первую очередь портфолио на предмет похожих по функционалу/масштабу проектов. Далее - ценник и просто взаимопонимание. Велосипедов избегайте, но не стоит тешить себя надеждой, что раз оно сделано на чем-то известном, следующий программист не захочет все сжечь и написать заново ;)

    P.S. Магазинная часть, кажется, не ложится на готовые решения совсем, соответственно ее я бы пилил на фреймворке, а контентную (рецепты/блог) можно и на цмску рядом посадить. Но бес в деталях, а детали должен смотреть уже ваш исполнитель - просто имейте ввиду, что гипотетически можно дробить проект на части и брать под каждую более подходящий инструмент.
    Ответ написан
    Комментировать
  • Как сделать очередность товаров?

    dubr
    @dubr
    пыхарь
    1. Как советовали выше, добавляем колонку (у меня называется priority - дело вкуса).
    2. Определяем ее, например, как decimal(6,3) - то есть число с тремя знаками после запятой.
    3. Для новых объектов заполняем ее значением max(priority)+1 - вставка в конец.
    4. Когда пользователь решает перетащить объект на другую позицию, получаем значения предыдущего и следующего элементов. Если нет предыдущего, считаем его за 0, если нет следующего - за предыдущий+1. Записываем для сортируемого объекта priority = (prev + next) / 2.
    5. Если очень много раз таскать туда-сюда, можем получить ситуацию, когда соседние priority отличаются на 0.001 - обрабатываем этот случай в коде, пересчитывая приоритеты так, чтобы увеличить интервал. Или просто переиндексируем все целиком в фоне с какой-то разумной регулярностью.

    Таким образом для сортировки нам нужно выбрать только два объекта одним запросом и изменить только одну строку.

    Вместо дробных значений можно тупо добавлять новые с большим шагом - max(priority)+1000.
    Ответ написан
    Комментировать