• Как обрезать правильно строку PHP?

    обрезать все запятные, точки, дефисы (тире) и т.д.

    $str = preg_replace('/[^a-zA-Zа-яА-Я ]/i', '', $str);
    Ответ написан
    Комментировать
  • Как начинающему php разработчику разобраться в framework?

    YardalGedal
    @YardalGedal
    yeah boy
    Начинающему PHP разработчику фреймворки не нужны. Пишите на чистом PHP. Не стоит браться за работу, если чувствуете, что она Вам не под силам и это Вам ещё рано.
    Ответ написан
    1 комментарий
  • Проект с высокой посещаемостью - архитектура. Фреймворк или самопис?

    developerYii
    @developerYii
    bash/php/python/ruby/js/css/yaml+++
    не рекомендовал бы frame для крупного проекта. вопрос производительности возникнет - ковырятся придется долго. а так сами сможете сделать все под свои нужды чтобы быстро и гибко, потому что сами писали - проверено неоднократно!
    Ответ написан
    5 комментариев
  • Как работают таймеры в играх?

    RusPOPsy
    @RusPOPsy
    Говорила мама, учи математику ...
    Например таймер до конца
    допустим до конца чего либо осталось 180 секунд
    Демка

    (function($){
        // Количество секунд в каждом временном отрезке
        var days	= 24*60*60,
        hours	= 60*60,
        minutes	= 60;
        
        $.fn.timer = function(callback){
            callback = callback ? callback : function(){}
            return new $.ctimer(this, callback);
        }
        $.ctimer = function(element, callback) {
            callback = callback || function(){}
            var secs = parseInt(element.html());
            function tick(){
                // Осталось дней
                var sec = secs;
                var d = Math.floor(sec / days);
                sec -= d*days;
    			
                // Осталось часов
                var h = Math.floor(sec / hours);
                sec -= h*hours;
    			
                // Осталось минут
                var m = Math.floor(sec / minutes);
                sec -= m*minutes;
    			
                // Осталось секунд
                var s = sec;
                h = (h+"").length<2 ? "0"+h : h;
                m = (m+"").length<2 ? "0"+m : m;
                s = (s+"").length<2 ? "0"+s : s;
                if(secs==0){
                    element.html(null);
                    callback();
                    return false;
                }
                secs--;
                element.html(d+" дн. "+h+":"+m+":"+s);
                setTimeout(tick, 1000);
            }
            tick();
        }
    })(jQuery);
    Ответ написан
    3 комментария
  • Будет ли востребован подобный сервис?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Google "сервис для видео собеседований"
    Первые же ссылки:
    lime-prime.ru
    vcv.ru
    webinar.tw/primenenie-vebinarov/onlayn-sobesedovan...
    cmsone.ru/veb-razrabotka/veb-tehnologii/v-runete-p...

    Вообще эту историю разные люди пытаются делать года так с 2007. До сих пор не взлетело нормально ни у кого.

    Исходя из моего личного опыта приема людей на работу - и не взлетит.
    HR приходится просматривать дикое количество резюме, в среднем на резюме уходит секунд 20-30.
    Никто не будет тратить часы на просмотр видеороликов.
    Тем более что по записанному видео ответу ничего особенно не понятно, хочется задать какой то уточняющий вопрос итд - а на записи это сделать не возможно :(
    Если хочется пособеседовать конкретного человека, но не хочется с ним встречаться - проще назначить ему в скайпе. Потратишь своего времени ровно столько же, сколько от просмотра роликов, но есть возможность двухстороннего общения.

    В итоге считаю что эти автоматизированные видео интервью в каком то виде на какие то должности могут применяться как один из этапов (ассистентку потенциальную о размере сисек спросить, посмотреть будет ли стесняться например ) но массовой эта история не станет.
    Ответ написан
    1 комментарий
  • Как безопасно хранить пароли к TC или WinSCP?

    CTAKAH4uK
    @CTAKAH4uK
    Не используйте пароль, аутентифицируйтесь по ключу (winscp.net/eng/docs/public_key)
    Ответ написан
    Комментировать
  • Можно ли CURL получить архив?

    WebSpider
    @WebSpider
    Как-то так
    $ch = curl_init('http://site.com/picture.jpg');
    curl_setopt(CURLOPT_RETURNTRANSFER, true);
    $pic = curl_exec($ch);
    curl_close($ch);
    file_put_contents('pic.jpg', $pic);
    Ответ написан
    Комментировать
  • Из-за чего возникает такая ошибка?

    @bzz
    Там же написано: Could not installed memcache
    Ответ написан
    1 комментарий
  • Как прервать if?

    kompi
    @kompi
    nullstack devoops
    Что мешает добавить else между двумя корневыми if?
    А вообще, для множества однотипных сравнений лучше использовать конструкцию switch.
    Ответ написан
    1 комментарий
  • Как перейти на PDO ?

    cha-cha
    @cha-cha
    Издеваетесь? Всего-лишь нужно было открыть документацию.

    $dbh = new PDO("mysql:dbname={BEZ_DATABASE};host={BEZ_DBSERVER}", BEZ_DBUSER, BEZ_DBPASSWORD);
    $dbh->exec("
        SET NAMES utf8;
        set character_set_client='utf8';
        set character_set_results='utf8';
        set collation_connection='utf8_general_ci'
    ");
    Ответ написан
    1 комментарий
  • Создание лицензии для движка, что прочитать?

    Я решил взяться за это дело нормально и подарить миру нормальную cms.

    927_v4.png
    Ответ написан
    5 комментариев
  • Создание лицензии для движка, что прочитать?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Я решил взяться за это дело нормально и подарить миру нормальную cms.

    Удачи. Получится как обычно.

    Не рассматривали схему, которую выбрали всякие gitlab, магенты и и т.д.? open-source + энтерпрайз редакции + суппорт.
    Ответ написан
    1 комментарий
  • Как набирать аудиторию на свой сервис и сколько это стоит?

    @azShoo
    Тут, по сути, стоит несколько последовательных задач:
    1) Первоначальное наполнение контентом.
    Если речь идет о контентном сервисе (напр. блогоферме, вроде жежешечки), то пользователю не интересен "пустой" портал.
    Следовательно надо "налить" первоначального контента.
    Это можно делать самому, если позволяют ресурсы, либо, что оптимальнее - привлекать сторонних авторов. Сёрфите аналогичные по тематике порталы, ищете интересных вам авторов, связываетесь и предлагаете сотрудничество.
    В зависимости от автора, объемов необходимого контента и тематики - расценки будут меняться от минимальных до заоблачных.
    Многие площадки злоупотребляют кросс-постами (тянут и ре-постят посты с других источников), но тут стоит понимать, что при отсутствии уникального контента привлечь аудиторию будет сложнее.

    2) Когда первоначальный контент сформирован - привлечение первого круга ЦА -> здесь уже идет чистый SMM. В помощь - опять же договоренности с авторами на платные посты, кросс-посты в тематических соц.сетях, всяческая пиарщина. Опять же все зависит от тематики.

    3) Удержание и преувеличение аудитории. Когда первая волна аудитории получена - начинается самый ад. Надо удерживать аудиторию и максимально стимулировать её к шарингу с кругом знакомых. Плюс, конечно же, привлечение новых людей по модели из шага 2.
    Нужно мониторить показатели и при необходимости стимулировать генерацию контента, запускать холи-вары и прочее.

    В целом, этим занимаются целые отделы пиарщиков и SMM-щиков, так что просто так взять и сказать "сделай вот это и все будет ок" - нельзя.

    btw, в первую очередь нужно определиться с:
    1) Целевой аудиторией. Без понимания типичной целевой аудитории делать социальный проект - заранее провальная идея.
    2) Исходя из п.1 определитесь с основными конкурентами за вашу ЦА, заранее выделите популярных авторов и "сердце" данного сообщества. В общем всячески анализируйте конкурентов.
    3) Подумайте, реально подумайте, что вы можете предложить своей ЦА. На мой взгляд, рынок блого-платформ сейчас прибывает в убытке. Большинство блоговых платформ было убито либо соц.сетями, либо лидерами отрасли. Что бы пользователи к вам шли - они должны понимать, зачем это им нужно.

    А дальше скачиваете гигабайт книжек по тэгам "Продвижение проектов", "SMM" и прочее, выкидываете оттуда 90% воды, вычерпываете 10% полезных мыслей и стараетесь остаться после этого на плаву.
    Ответ написан
    3 комментария
  • Асинхронная многопоточность в PHP: для чего?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Все очень просто. Вот вам приблизительное значение таймингов доступа к данным:
    io-cost.png

    То есть запросив данные в сети мы тупо ждем. Долго ждем и ничего не делаем.

    В случае с curl (он же HTTP) мы можем соорудить очередь запросов и послать их одним махом и ждать пока завершится загрузка всех документов в очереди для обработки результатов. Если мы хотим забрать 10 документов, то без multi curl у нас ушло бы времени "среднее время получения документа" * 10. И это примерно. В случае же с мультикурлом мы получаем время обработки 10 запросов как время выполнения самого долгого запроса. Если представить что время запросов всегда одинаковое, получаем выйгрыш примерно в 10 раз.

    С сокетами веселее. Они бывают блокируемые (по умолчанию) и неблокируемые (выставляется опцией O_NONBLOCK). Для начала давайте определимся что такое чтение данных из сокетов и как нам это дело предоставляет операционная система. Упрощенно, когда мы создаем сокет, мы просто просим операционную систему предоставить оный. У каждого сокета есть буфер чтения и буфер записи. Если буфер записи полный - ОС начинает отправку данных пока буфер не опустеет (буфер записи нужен для организации проверки дошли ли пакеты и переотправки в случае чего, так же этот буфер замешан в выборе операционкой размеров пакетов и т.д. Это не особо важно в контексте вопроса). Когда данные приходят в сокет, сначала они помещаются в буфер чтения. Там они лежат пока их не попросят вернуть из кода. Так мы можем быть уверены в том, что данные не пропадут.

    Так вот... возьмем блокирующие сокеты и попробуем запросить 1024 байт данных из оного. Причем клиент в данный момент ничего не отправляет, буфер чтения пустой. И так допустим минут 10. Как только мы сделали запрос за данными, и оказалось что буфер чтения пустой, процесс выполнения блокируется пока не появятся данные.

    А теперь представим что проверять периодически наличие данных нам надо не в одном сокете а в десятке. Представим так же что 9 клиентов подключенных по нашим сокетам хорошие и присылают данные вовремя, а один не хороший и любит тупить по пол часа. Если бы мы пользовались блокирующими сокетами, то мы можем обрабатывать только одного клиента за раз. Причем если у него вдруг данных не оказалось - нам придется ждать, хотя в других сокетах уже вполне могли появиться данные какие для обработки. И если в случае с "хорошими" клиентами мы можем тратить на оных по пол секунды - секундочке, то наткнувшись на плохого клиента наш сервер замирает за те самые пол часа о которых мы договаривались. Сервер тупо ждет "плохого" клиента а хорошие в итоге не могут достучаться до сервера. Новых соединений мы так же не установим... короче все мертво.

    И тут на помощ к нам приходит опция O_NONBLOCK. В этом случае если у сокета пустой буфер чтения он сразу вернет выполнение не вернув нам ни капли данных не дожидаясь медлительных клиентов-тугодумов. В случае если буфер не пустой - все будет так же как и в случае с блокирующими сокетами - тупо вернет содержимое буфера и вернет управление. Так что мы можем в бесконечном цикле просто проверять по очереди все сокеты. В этом случае делей получения данных будет сведен к минимуму.

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

    Еще есть такая чудная штука, которую предоставляет операционная система как select или epol (в контексте php socket_select и stream_select). Данные функции позволяют нам скармливать массивы сокетов, за которыми вы следите (не сокетов, а их дескрипторов но не суть, и не один массив а три, массив дескрипторов что бы следить появились ли данные на чтение, записал ли сокет все и освободился ли буфер записи и третий отслеживает сокеты в которых произошли какие-то ошибки, например отвалилось соединение). Так же этой функции можно задавать таймаут, что очень удобно если мы сначала собираем данные с нескольких клиентов и если от них небыло вестей пару секунд, значит мы забрали все и можно начинать обработку.

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

    Но все что выше имеет смысл только с TCP/TLS, если бы у нас были UDP сокеты, то было бы еще веселее. Там нету никаких буферов. Не принял данные - потерял данные. Нету соединений. Нету блокировок. Есть только пакеты. Поэтому этот протокол используют (или используют как основу) для реализации реалтайм систем. Задержек нету, а если какой пает не дошел, велика вероятность что он уже не актуален. Правда если сеть не надежная и потери пакетов велики, то начинается боль и слезы и обычно все же для таких случаев дублируют все на TCP.
    Ответ написан
  • Как записать результаты цикла в БД?

    @vdem
    $html = "<h1>";
    for ($id = 0; $id < 3; $id++) {
        $html .= "<b>{$pic[$id]}</b>";
    }
    $html .= "</h1>";
    // $html теперь содержит весь построенный HTML
    Ответ написан
    1 комментарий
  • Где и в каких случаях в php (ООП) используется __constructor?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Метод конструктор вызывается при инициализации объекта. В контексте PHP его главная задача - инициализировать все свойства значениями, что бы добиться какого-то начального состояния объекта. Так же туда следует передавать все зависимые классы. И крайне не рекомендуется в конструкторе делать что-то сложное, например, как пишет @hlogeon, кого-то нотифаить о своем присутствии, или с конфигами работать. Это все должно быть по хорошему сделано до инициализации. Если у вас в конструкторе код лезет в файлы/базу то это уже сигнал о плохом дизайне.

    class Bar {
        public function doSomething() {}
    }
    class Foo{
        private $bar;
        private $someConfig;
        private $createdAt;
        public function __construct(Bar $bar, $someConfig) {
             $this->bar = $bar;
             $this->someConfig = $someConfig;
             $this->createdAt = new \DateTime();
        } 
    }
    
    // загружаем конфиг каким-то образом
    // мы не должны заставлять Foo что-то делать еще, что не относится к его задаче
    // например он не должен знать как создается класс Bar и что ему нужно
    // он не должен ничего знать о том где хранятся конфиги и т.д. 
    // Для этого можно отдельный класс сделать, который будет знать где брать конфиги
    // но не будет знать как эти конфиги используются.
    $config = $configurator->getConfig('foo');
    $bar = new Bar();
    $foo = new Foo($bar, $config);
    Ответ написан
    2 комментария
  • Какие данные работодатели обычно требуют от соискателя при приеме на удаленную работу?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Для официального трудоустройства - норм. Вообще почитайте там трудовой кодекс и погуглите.

    p.s. по ссылкам наверняка какой развод или для голодных студентов/школьников чего.
    Ответ написан
    1 комментарий
  • Для какого типа веб проектов используют PHP фреймворки?

    KorsaR-ZN
    @KorsaR-ZN
    CMS - это уже законченный продукт, и на нем будет сложно сделать что-то, кроме того, для чего она разрабатывалась, т.к вы ограниченные ее функционалом и задачами и т.д, вообщем всем, тем для каких целей она создавалась.

    Фреймворк - это нечто совершенно другое, это строительный материал, как пластилин и Вы вольны его использовать, как Вам вздумается.
    Т.е фрейморк просто набор функций, грубо говоря ядро вашего будущего проекта, обычно включает в себе: кеширование, ORM, шаблонизатор, MVC, di и т.д, на разработку, которых Вам не придется тратить время, и Вы сможете спокойно сконцентрироваться на разработке уже свое продукта, а не его ядра.
    Ответ написан
    3 комментария