• Объясните как работает php-fpm?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Для начала почитайте что такое SAPI. Затем представьте что apache + mod_php разделили на web-сервер, который проксирует запросы на php-fpm и отдает статику, и собственно отдельный web-сервер который имплементит SAPI и выполняет запросы связанные только с php. То есть статику отдавать мы можем только через php. Суть примерно та же что и у apache2 + prefork + mod_php но оптимизированный только для работы с php. Так же можно поставить на фронт более быстрый и легковесный сервер который умеет проксировать запросы.

    То есть php-fpm это эдакий fast-cgi сервер который постоянно держит готовые для работы пул-процессов (сколько в пуле процессов настраивается, так же как и от какого пользователя их запускать и все такое прочее). Каждый новый запрос уходит в какой-либо процесс из пула, запрос отрабатывает, возвращаем результат тому кто попросил (web-серверу обычно). Если процесс падает (fatal допустим) - поднимаем новый.

    Принципиальной разницы между apache2+mod_php нету, просто упрощается инфраструктура. Наш web-сервер должен только уметь проксировать запросы и отдавать статику, а php-frpm вообще может быть на разных машинах (балансировщиком можно раскидывать запросы). Ну и сами понимаете, nginx + php-fpm будет быстрее обрабатывать запросы чем apache2+mod_php какой бы мы менеджер процессов не использовали в апаче. Минусов по сравнению с apache+mod_php я даже не могу предложить.

    А php-runtime не зависит от этого. Он один на всех, CLI, FPM, mod_php...
    Ответ написан
    7 комментариев
  • Почему я не могу печатать русские буквы в mysql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Чтобы сделать запрос с русскими буквами, надо заходить не под рутом, а под нормальной учетной записью.
    Под рутом в консоли будет применяться дефолтная кодировка, а до версии 8.0 это Latin1, в которой русских букв нету.

    При заходе под нормальным юзером консоль mysql автоматически подхватит текущую кодировку клиента командной строки.
    Ответ написан
    Комментировать
  • Best Practice при работе с репозиториями в Laravel?

    Если у вас большая часть данных может быть взята с помощью eloquent - не стоит внедрять репозитории. Два года уже работаю над проектом, в котором в наследство были добавлены репозитории (все реализовано так, как у вас описано + как описал D3lphi), пришел к выводу, что это избыточный слой. В ларавел они хорошо выглядят разве что когда много сложных запросов и часто используется query builder. Но если все-таки решили, помните, что репозитории не должны отдавать из себя Eloquent модель.
    Ответ написан
    2 комментария
  • Как пушить на github чтобы не вводить каждый раз логин и пароль?

    bukinion
    @bukinion
    Некороткий мануал по SSH + GitHub & BitBucket (на Win, почти тоже и на Lin)

    Вначале надо найти ключи
    $ ls -al ~/.ssh
    # Спискок файлов в директории .ssh, если они есть
    # id_rsa.pub # Нам интересны эти два брата, точнее этот публичный код (паб)
    # id_rsa # Это для сверки с пабом


    Если их нет, то будем генерить, после чего ласково попросят пароль, он должен быть сложным, в конечном итоге вводится он будет только один раз при старте сессии.
    $ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    # Enter file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]
    # Enter passphrase (empty for no passphrase):
    # Enter same passphrase again:


    Кстати, пароль можно и поменять:
    $ ssh-keygen -p # Введете старый, а потом новый.

    Консоль выведет следующее:
    # Your identification has been saved in /Users/you/.ssh/id_rsa.
    # Your public key has been saved in /Users/you/.ssh/id_rsa.pub.
    # The key fingerprint is:
    # 01:0f:f4:3b:ca:85:d6:17:a1:7d:f0:68:9d:f0:a2:db your_email@example.com


    Теперь надо добавить ваши ключи в ssh-агент
    Удостоверьтесь в том, что он у вас есть — запустите
    $ ssh-agent -s

    Должен быть следующий однострочный (!) вывод, номер pid будет другим, все остальное от лукавого:
    Agent pid 59566

    Если нет, то скорее всего в терминале другая оболочка, тогда:
    $ eval $(ssh-agent -s)
    Agent pid 59566


    Вот теперь можно добавить ключи в ssh-агент
    $ ssh-add ~/.ssh/id_rsa

    Далее, добавим ключи в VCS-сервисы github и bitbucket, для этого скопируйте содержимое id_rsa.pub, и вставьте в настройках своего аккаунта на VCS (например, "SSH and GPG keys" для Github). Активируем ключи.

    для github:
    $ ssh -T git@github.com

    чуть длинней, для bitbucket, вначале надо создать файл-конфиг, ~/.ssh/config, куда добавить следующие строки:
    Host bitbucket.org
    IdentityFile ~/.ssh/id_rsa # Тут приватный ключ!


    После чего запустить следующую команду:
    $ ssh -T git@bitbucket.org

    В каждом случае, если все пройдет успешно, то вы получите следующие сообщения:
    Hi #{username}! You've successfully authenticated, but GitHub does not provide shell access.


    или
    conq: logged in as tutorials.
    You can use git or hg to connect to Bitbucket. Shell access is disabled.


    К слову, что Github, что Bitbucket выдали мне в этот раз такое:
    Thу authenticity of host 'github.com (192.30.253.113)' can't be established.
    RSA key fingerprint is 12:12:12...12.
    Are you sure want to conecting (yes/no)?


    Ответил yes, консоль что-то ответила и все работает.

    Если же вы используете алиасы для хостов, то и активация должна быть через алиас:

    $ ssh -T git@alias


    Если работаете с Sourcetree (рекомендую для винды), то есть такой момент, что программа не принимает стандартный формат этих ключей и что бы работать с программой через ssh придется из полученного ключа (приватный) сгенерировать их в другом формате понятном putty. Для этого используется программа puttygen. Которая входит в поставку Sourcetree.


    Занудно, но уже финал близок, далее нам нужно настроить ~/.bashrc, которого на винде нет, именно он будет содержать инициализационные настройки для консоли и запускать ssh-агент, который будет включать ваши ключи, запоминать сессию:
    # Note: ~/.ssh/environment should not be used, as it
    #       already has a different purpose in SSH.
    
    env=~/.ssh/agent.env
    
    # Note: Don't bother checking SSH_AGENT_PID. It's not used
    #       by SSH itself, and it might even be incorrect
    #       (for example, when using agent-forwarding over SSH).
    
    agent_is_running() {
        if [ "$SSH_AUTH_SOCK" ]; then
            # ssh-add returns:
            #   0 = agent running, has keys
            #   1 = agent running, no keys
            #   2 = agent not running
            ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ]
        else
            false
        fi
    }
    
    agent_has_keys() {
        ssh-add -l >/dev/null 2>&1
    }
    
    agent_load_env() {
        . "$env" >/dev/null
    }
    
    agent_start() {
        (umask 077; ssh-agent >"$env")
        . "$env" >/dev/null
    }
    
    if ! agent_is_running; then
        agent_load_env
    fi
    
    # if your keys are not stored in ~/.ssh/id_rsa or ~/.ssh/id_dsa, you'll need
    # to paste the proper path after ssh-add
    if ! agent_is_running; then
        agent_start
        ssh-add
    elif ! agent_has_keys; then
        ssh-add
    fi
    
    unset env


    И снова не финал, скорее всего так как вы не пользовались SSH, то ваши уже существующие локальные репо будут работать по http/https, поэтому надо сменить адреса. Адреса удаленных репозиториев проверяются командой $ git remote -v. Для смены адресов git есть специальная команда: $ set-url, ввести следующее:
    $ git remote set-url origin git@github.com:USERNAME/OTHERREPOSITORY.git


    Вернуть все на Родину можно аналогично
    Ответ написан
    1 комментарий
  • Можно ли в Laravel 5 отправить данные методом POST без формы?

    sayber
    @sayber
    Да, я программирую на PHP и еще асинхронно!
    Из 4х тегов к вопросу относится только 1.
    Вопрос определяет ваш уровень знаний, который почти что на нуле.
    Но вы уже используете laravel.

    Надеюсь это для себя а не клиента.

    Вам стоило сначала просто загуглить ошибку которая происходит при ajax
    Ответ сразу бы нашли. https://laravel.com/docs/5.3/csrf
    Ответ написан
    Комментировать
  • Как исправить права доступа к файлам?

    Есть еще chmod. Если веб-сервер запущен от имени другого юзера, то у него должны быть права как минимум на чтение. Попробуйте chmod 755 <файло или директория>. Есть опция -R для рекурсивного задания прав. https://ru.wikipedia.org/wiki/Chmod
    Ответ написан
    1 комментарий
  • Export.yandex.ru/weather-ng/forecasts/id.xml больше не будет работать?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Для тех кому нужен парсинг погоды. Делюсь.

    Официальный адрес для обращения к API:
    https://api.weather.yandex.ru/v1/forecast?geoid=2&lang=ru


    Заголовки, которые нужно передать для доступа:
    User-Agent: yandex-weather-android/4.2.1
    X-Yandex-Weather-Client: YandexWeatherAndroid/4.2.1
    X-Yandex-Weather-Device: os=null;os_version=21;manufacturer=chromium;model=App Runtime for Chrome Dev;device_id=[DEVICE ID];uuid=[UUID];
    X-Yandex-Weather-Token: [TOKEN]
    X-Yandex-Weather-Timestamp: [TIMESTAMP]
    X-Yandex-Weather-UUID: [UUID]
    X-Yandex-Weather-Device-ID: [DEVICE ID]
    Accept-Encoding: gzip, deflate
    Host: api.weather.yandex.ru
    Connection: Keep-Alive


    Где [TOKEN] генерируется функцией
    md5(secret.concat(timestamp))

    Ну и соответственно secret - eternalsun
    UUID и Device ID берите от вашего девайса на Android, либо получайте (как я) в ARC Welder.

    UPD: Кому интересно, выдается в таком формате:
    pastebin.com/w12KvC6q
    Ответ написан
    26 комментариев
  • Как оптимизировать обращения к базе данных?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Жадная загрузка.
    Post::with('commentsCount')->get();

    В модели что-то вроде:
    public function commentsCount()
    		{
    		  return $this->comments()
    		    ->selectRaw('count(id) as aggregate')
    		    ->groupBy('id');
    		}
    		public function getCommentsCountAttribute()
    		{
    		  if ( ! array_key_exists('commentsCount', $this->relations))
    		    $this->load('commentsCount');
    
    		  $related = $this->getRelation('commentsCount')->first();
    
    		  return ($related) ? (int) $related->aggregate : 0;
    		}


    В каждом посте будет аттрибут "commentsCount" с количеством комментариев.
    Ответ написан
    7 комментариев
  • Как заставить логирование Guzzle работать в Laravel?

    Denormalization
    @Denormalization
    Если нужно писать в общий лог файл лог Guzzle, то:
    use GuzzleHttp\HandlerStack;
    use GuzzleHttp\Middleware;
    use GuzzleHttp\MessageFormatter;
    use Monolog\Logger;
    
    $stack = HandlerStack::create();
    $stack->push(
        Middleware::log(
            \Illuminate\Support\Facades\Log::getMonolog(),
            new MessageFormatter('{req_body} - {res_body}')
        )
    );
    $client = new \GuzzleHttp\Client(
        [
            'base_uri' => 'some-url.com',
            'handler' => $stack,
        ]
    );


    Оно будет писать в общий лог файл.
    Если же нужно писать в кастомный лог файл, то:
    use Monolog\Handler\StreamHandler;
    // ....
    $logger = new Logger('GuzzleLogger');
    $logger->pushHandler(new StreamHandler(storage_path('logs/guzzle.log')));
    $stack->push(
        Middleware::log(
           $logger,
            new MessageFormatter('{req_body} - {res_body}')
        )
    );
    Ответ написан
    2 комментария
  • Выводить ли ошибку 404 в результатах поиска?

    valerium
    @valerium
    Изобретая велосипед
    С точки зрения HTTP ошибка 404 — это отсутствие ресурса по заданному адресу. Но по адресу есть поисковый движок, то есть ресурс есть. Так что да, логично отдавать 200.

    С точки зрения SEO я бы запретил индексацию результатов поиска. А ещё я бы с точки зрения пользователя бил по рукам тех, кто так не делает, потому что релевантость таких страниц нулевая, но поисковые движки на них часто «клюют».
    Ответ написан
    Комментировать
  • Как понять структуру laravel?

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

    Фасад - это способ к некому классу обратиться как к статическому. Для этого при "создании" (точнее регистрации) фасада регистрируется код создания экземпляра класса и дальше при вызове SomeClass::method() фреймворк создает класс SomeClass при помощи этого кода и вызывает метод method(). laravel.su/docs/5.0/facades

    Сервис-провайдер - это класс, который осуществляет инициализацию некоторой части приложения Laravel - регистрацию фасадов, папки вьюх, конфигов, в общем, всего подобного. Хватило бы одного сервис-провайдера, но их много, потому что модуль, пакет или логическую часть приложения удобнее инициализировать в отдельном классе, а не дописывать все в существующий. laravel.su/docs/5.0/providers

    Сервис-контейнер Laravel, при помощи которого (а не при помощи оператора new) создаются все классы во фреймворке, по сути не отличается от такого же фальконовского: laravel.su/docs/5.0/container . Он нужен для реализации DI, т.е. при создании некоторого класса, например контроллера, проходить по аргументам методов, смотреть, какие там подаются классы на вход, создавать экземпляры этих классов и собственно подавать их на вход.
    Ответ написан
    1 комментарий
  • Стоит ли использовать ооп?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    То, что легче без ооп - безусловно, для скрипта на 100 строк, это будет лишним.

    В остальном - однозначно нужно.
    ООП дает вам понятие "сущностей данных", как минимум. Можно конечно обмазываться массивами, но в этом случае лучше не используйте в лексиконе слово "безопасность".
    ООП дает разграничение обязанностей. Можно конечно нагородить 1кк функций и сварганить на их основе вермишельку, когда выльете пару ведер крови из глаз - вспомните мои слова.
    ООП дает заменяемость кода по интерфейсу (Полиморфизм), как следствие - возможность варьировать логику, без миллиона switch-case и сложных условий.
    ООП дает сокрытие данных (Инкапсуляция). Если переменную можно изменить в любом месте проекта (глобальную например) - она будет где-то изменена, вы об этом можете не узнать (или попросту забыть), как следствие ваш код будет работать не предсказуемо.
    ООП дает возможность расширять функционал порождаемых сущностей (Наследование), как следствие - DRY.

    То, что Виталий Пухов написал не верно. Легко !== правильно, удобно, человеко-понятно, тестируемо, надежно. Легко как правило писать говно. Фраза "работает же" как правило значит: "да, я понимаю, что оно хреновое, но лучше не могу".

    И писал пару робот на нём сильной разницы в скорости между ооп и не ооп проэктами не замечал.

    Вы не туда смотрите)). Производительность на stateless языке... В общем посмотрите на компилируемые))

    * Про vk вы правильно сказали, но забыли 2 важных нюанса: он писался, когда ООП в php особо не было; у них свой KPHP))
    * Для сравнения у facebook тоже свой php: hhvm, но он очень даже объектный.
    Ответ написан
    1 комментарий
  • Почему mkdir создает на сервере(UBUNTU) папки и файлы с замком?

    Tairesh
    @Tairesh
    Веб-программист
    Иконка замочка означает, что файл или папка принадлежит другому пользователю. Я посмотрел в хрустальный шар и там написано, что PHP у вас работает от юзера www-data, от его имени файлы и создаются.

    Самое простое решение -- добавить своего пользователя в группу www-data, а юзера www-data в свою группу.

    И да, зело сурово передавать из POST-запроса данные напрямую в mkdir.
    Ответ написан
    5 комментариев
  • Как сделать плавную прокрутку при скроллинге?

    junk1114
    @junk1114
    Web-программист
    Терпеть не могу, когда на сайтах такое встречаю
    Ответ написан
    Комментировать
  • Как записать ip в базу?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    функцию get_ip() выкини, используй вместо нее $_SERVER['REMOTE_ADDR']
    подробнее: phpfaq.ru/ip
    Ответ написан
    Комментировать
  • Какую посоветуете тему дипломной работы?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    У меня дежа-вю
    100% впечатление, что год назад я видел точно такой же пост
    Ответ написан
    1 комментарий
  • Как выстроить отношения между Eloquent моделями Laravel 5?

    cha-cha
    @cha-cha
    class Article extends Eloquent{
        public function images(){
            return $this->belongsToMany('Image', 'article_images', 'article_id', 'image_id');
        }
    }
    Ответ написан
    3 комментария
  • Чем заслужил свою популярность Laravel?

    ajaxtelamonid
    @ajaxtelamonid
    Laravel
    Тем, что там можно писать мало там, где мы привыкли писать много. Подобный "конвеншн овер конфигурейшн" - он помимо прочего оставляет ощущение, что автор пишет не сферическую вещь в вакууме, которая якобы должна подойти всем, а для нас, для простых рабочих пацанов с окраин, со своими вполне конкретными юзкейсами. Т.е. он 1. человек умный и 2. знает жизнь. Это подкупает.

    Например, в output идет то, что возвращено из контроллера, а если возвратить ORM-объект или массив (точнее коллекцию) ORM-объектов, то будет отдан json, причем со всеми связанными объектами. Масса нужных в хозяйстве вещей, которые идут из коробки (миграции, редис, кэш с множеством провайдеров, работа с очередями, консольная тулза artisan для разнообразных обслуживающих вещей). Изкоробочная работающая сборка вьюх в лейаут, минимум возни с авторизацией. Скоупы в ORM. Кусочки конфигов в файлах, которые удобно ставить в .gitignore. В общем, масса такого вот, мелкого, но очень удобного.

    На Laravel ОДНОВРЕМЕННО можно уйти в глубины аццкого хадкора по Фаулеру, с тестированием всего и вся, с интерфейсами, депенденси инжекшнами, репозиториями, обсерверами, ентитями, гексагональными сценариями итд, итп, _подставить_любимый_паттерн_, И в то же время забить на это всё, сгенерить _ide_helper для подсказок по "фасадам" в IDE и фигачить код со статическими вызовами, как будто весь фреймворк написан на статике, как Кохана. Т.е. и сайт-знакомому-за-вечер и огроменный кровавый энтерпрайз делаются на одном фреймворке - в зависимости от того, насколько глубоко исполнитель хочет погружаться в свой продукт. Подобная гибкость - это, имхо, очень круто.

    И еще - как показала практика фреймворкостроительства, или ты двигаешься вместе с развитием php, либо ты делаешь "более лучшее, удобное и грамотное" решение и тихо загниваешь с своем междусобойчике за пару лет. Laravel двигается максимально близко к php - следование psr, composer-платформа в качестве базы, фрейморк ставится оттуда и пакеты расширения тоже имеют composer-формат. Что говорит о том, что у фреймворка есть все шансы прожить долгую и счастливую жизнь.
    Ответ написан
    Комментировать
  • Как применить стиль к элементам img внутри div?

    nazarpc
    @nazarpc
    Open Source enthusiast
    НЛО, пожалуйста, сжалься над нами, не пропускай такие вопросы!
    Ответ написан
    5 комментариев