Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Re: Laravel 5.x » Кэширование шаблонов blade? » 04.11.2017 11:04:19

может опкэш не проверяет время на файлах? что задано в opcache.validate_timestamps и opcache.revalidate_freq?
при разработке должно быть opcache.validate_timestamps=1 и opcache.revalidate_freq=0

#3 Re: Laravel 5.x » Как сохранять файл с кириллическим именем? » 29.09.2017 07:20:39

этот «трэш» – нормальное русское название, просто в неправильной кодировке. если ты смотришь по фтп, у тебя просто фтп-клиент неправильно настроен…

#4 Re: Laravel 5.x » Middleware sms аутентификации » 29.09.2017 07:19:03

я думаю, твоя принципиальная ошибка – в том что ты это делаешь внутри миддлвари. этот код на 100% должен находиться в контроллере и иметь свой собственный экшен, и не один. вторая ошибка – то что разные действия совершаются в одном методе – отправка кода и его проверка – это разные экшены, в-третьих с параметрами запроса надо работать через объект Request, а не лазить в $_POST, чай не на PHP4 пишешь…

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

#5 Re: Laravel 5.x » Тайм аут работы скрипта 180 сек. выхожу за пределы » 29.09.2017 07:12:58

Можно увеличить лимит времени работы через set_time_limit(0)

не всегда этого достаточно. nginx и апач тоже имеют обычно настроенные таймауты ожидания, плюс php-fpm в настройках пула также может иметь ограничения, на которые time_limit не влияет

Как можно этот скрипт разбить на несколько этапов. Например, обрабатывать 10 строк, потом следующие 10 и.тд

долгий процессинг лучше вообще не выполнять в контексте веб-запроса. даже если эта выгрузка прилетает через какой-то http-запрос, можно сохранить xml в файл, и запустить обработку в фоне. обычно это делается через Queue и правильно настроенные обработчики очереди. в крайнем случае можно выкрутиться через крон – добавление крон-задач поддерживается даже совсем дубовыми шаред-хостингами… соответственно в браузер ты отдаёшь уже только идентификатор задачи и по нему отображаешь статус – в работе или завершено…

очереди задач как и крон-задачи запускаются через artisan команднострочным пхп-интерпретатором, на нём всегда set_time_limit = 0

#6 Re: Laravel 5.x » Как увелечить Скорость и производительность Laravel? » 29.09.2017 07:05:58

использование расширения php-opcache в продакшене является обязательным – в этом случае неважно сколько и какого объёма php-файлы в приложении – они все предкомпилируются в байткод, хранятся в памяти и оттуда же и выполняются. собственно в девелопменте тоже можно работать с этим расширением, в php.ini должно быть opcache.enable=1, в opcache.memory_consumption указать размер максимально выделяемой памяти в мегабайтах (для ларавеля стандартных 64м более чем достаточно, но если на серваке крутятся другие сайты возможно надо будет увеличивать, следи за количеством свободной памяти в опкэше через phpinfo). в продакшене можно выиграть ещё немного задав opcache.revalidate_freq отличным от нуля – в этом случае он не будет проверять время на файлах на каждый запрос, только с определённым интервалом, а также сэкономить немножко памяти установив opcache.save_comments=0 – комментарии в ларавеле ни для чего не используются (и слава богу)

что касается скорости загрузки данных из базы, то она оптимизируется настройками сервера БД и особенно сильно зависит от правильного выбора индексов в таблицах

#7 Re: Laravel 5.x » база данных по-умолчанию » 29.09.2017 06:58:43

PDO принимает connection string в качестве параметра, в них нет ничего mssql-специфичного, это нормально. в качестве соединения используется имя соединения, а не название драйвера. никто не мешает иметь два соединения к двум разным базам mysql например. соединение по умолчанию определяется параметром default в config/database.php и может браться например из DB_CONNECTION в .env если оно там задано

#8 Re: Laravel 5.x » Как правильно закешировать большие объемы данных » 27.09.2017 17:12:04

всё что ты сохраняешь в кэш автоматически сериализуется с помощью serialize/unserialize, модели и коллекции вполне нормально переживают такое обращение smile

#9 Re: Laravel 5.x » Какой поиск выбрать » 27.09.2017 16:52:42

На хостинге в качестве сервиса поддерживается только sphinx, но я его ни разу не настраивал и боюсь, что могу сделать еще хуже. ElasticSearch не поддерживается на хостинге

поменять хостинг, vps – самый нормальный вариант, на шареде с ларавелем вообще неинтересно… на vps рутовый доступ позволяет установить там хоть чёрта лысого, единственное что самому настраивать надо всё, но это в чём-то даже плюс…

или да, платить алголии – это тот же эластик по сути, только «облачный» и с веб-интерфейсом…

#10 Re: Laravel 5.x » Удаление папки или файла не работает » 27.09.2017 11:16:29

потому что Storage – это абстракция над операциями с файлами. файлы, с которыми он работает, могут находиться как локально так и удалённо, поэтому корнем для путей является та папка, которая настроена в config/filesystems.php. по умолчанию в установке ларавеля настроено два хранилища – одно local (используется по умолчанию) использует папку storage/app, второе – public в папке storage/app/public, оно может быть публично доступно через веб-сервер если выполнить команду php artisan storage:link – через симлинк в папке public. именно эти папки и являются корневыми для указанных хранилищ и через Storage можно получить доступ только к ним и вложенным в них папкам. если понадобится кластеризовать хранение файлов, использовать CDN или переехать в амазон – при условии что код работает с файлами только через Storage, это делается тупо изменением настроек в конфиге, в коде ничего менять не нужно. и это очень удобно, конечно же, для того оно и задумано так…

#11 Re: Веб-разработка » Архитектура конструкторов сайтов (SaaS) » 27.09.2017 10:07:51

я сомневаюсь что тут есть универсальное решение. каждый конструктор уникален, формулируются потребности в ТЗ, нанимается группа разработчиков, которые фигачат пока не реализуют всё в полном объёме – примерно как-то так… smile

#12 Re: Laravel 5.x » Удаление папки или файла не работает » 27.09.2017 10:05:39

Storage работает не от корня файловой системы, все пути для него являются относительными от родительской папки, которая задаётся в настройках конкретного сториджа в config/filesystems.php

#13 Re: Laravel 5.x » Вопрос по локальной разработке » 27.09.2017 10:03:20

homestead на винде очень просто поднимается. единственная проблема у меня была с ним, когда имя пользователя в винде содержало русские буквы – вагрант не мог найти свой конфиг, причём проблема была чуть ли не в руби, на котором он написан. в остальном всё очень просто и быстро поднимается

ещё очень простой и универсальный вариант – докер. с недавних пор пользуюсь практически только им, множество проектов, сборная солянка из версий чего бы то ни было и разных расширений – через docker-compose собирается наиболее близкий к продакшену конфиг и каждый проект разрабатывается и дорабатывается в среде, практически идентичной той, в которой он в итоге работает. когда среда не нужна docker-compose down удаляет всё нахрен и освобождает ресурсы, снова понадобился – docker-compose up -d и проект снова в работе. нужно немного повозиться с настройкой, но потом конфиги переносятся из проекта в проект с минимальными изменениями…

#14 Re: Laravel 5.x » Проблема с view » 27.09.2017 09:57:41

а у процесса веб-сервера вообще есть права на запись в лог?

#16 Re: Laravel 5.x » отладочная информация до окна ошибки » 21.09.2017 15:09:35

а собственно зачем выводить отладку в браузер? есть же хелпер logger() – от в storage/logs/laravel.log пишет, там ничего не пропадает…

#17 Re: Laravel 5.x » Соединить 2 массива » 21.09.2017 15:04:33

$res = array_map('array_merge', $arr1, $arr2)

вроде должно работать…

#18 Re: Laravel 5.x » Автоматическое определение локали на мультиязычном сайте » 21.09.2017 15:01:23

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

#20 Re: Laravel 5.x » Автоматическое определение локали на мультиязычном сайте » 19.09.2017 07:35:38

атрибут html[lang] вообще для другого предназначен. ты можешь например иметь разные стили элементов в зависимости от активного языка в CSS и раскидать их по одним и тем же селекторам с помощью :lang(xx). ну и в качестве селектора в jquery он тоже вполне работает. в остальном на отображение страниц в браузере он не влияет. если нужно понять какой язык хочет получить браузер пользователя, надо смотреть в заголовок accept-language запроса например.

вообще отдавать разноязыкий контент по одним и тем же адресам – не очень хорошая практика с точки зрения SEO. если ты делаешь админку или личный кабинет – окей, норм. если это контентная часть сайта, которая должна индексироваться гуглом, у тебя просто проиндексируется только один язык (скорее всего английский). поэтому языки всегда раскидывают по разным url (через сегменты адреса или поддомены), и добавляют переключатели языка которые дают поисковикам ссылки по которым можно ходить и индексировать контент других языков…

#21 Re: Laravel 5.x » Как перенести сайт с кастомной авторизацией на laravel » 19.09.2017 07:30:07

у меня в одном проекте была старая база пользователей с паролями в двойном md5, делается это примерно так

в app/Providers/AppServiceProvider.php в register() добавляем

$this->app['auth']->provider('myprov', function () {
    return new \App\Services\MyUserProvider;
});

в app/Services/MyUserProvider.php:

<?php

namespace App\Services;

use App\User;
use Illuminate\Auth\EloquentUserProvider;
use Illuminate\Support\Str;

class MyUserProvider extends EloquentUserProvider
{
    public function __construct()
    {
        parent::__construct(new MD5Hashing(), User::class);
    }

    public function retrieveByCredentials(array $credentials)
    {
        $query = $this->createModel()->newQuery();

        foreach ($credentials as $key => $value) {
            if (!Str::contains($key, 'password')) {
                $query->where($key, $value);
            } else {
                $query->where($key, $this->hasher->make($value));
            }
        }

        return $query->first();
    }
}

остаётся добавить хэшер app/Services/MD5Hashing.php:

<?php

namespace App\Services;

use Illuminate\Contracts\Hashing\Hasher as HasherContract;

/**
 * Class MD5Hashing - крайне ненадёжное шифрование для паролей, не надо так делать
 *
 * @package App\Services
 */
class MD5Hashing implements HasherContract
{
    /**
     * Hash the given value.
     *
     * @param  string $value
     * @param  array $options
     * @return string
     */
    public function make($value, array $options = [])
    {
        $hash = md5(md5($value));

        return $hash;
    }

    /**
     * Check the given plain value against a hash.
     *
     * @param  string $value
     * @param  string $hashedValue
     * @param  array $options
     * @return bool
     */
    public function check($value, $hashedValue, array $options = [])
    {
        if (strlen($hashedValue) === 0) {
            return false;
        }

        return $this->make($value, $options) === $hashedValue;
    }

    /**
     * Check if the given hash has been hashed using the given options.
     *
     * @param  string $hashedValue
     * @param  array $options
     * @return bool
     */
    public function needsRehash($hashedValue, array $options = [])
    {
        return false;
    }
}

остаётся подключить этого провайдера в конфиге auth.php, примерно так:

return [
    'defaults' => [
        'guard' => 'web',
    ],
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'myprov',
            'model' => App\User::class,
        ],
    ],
    'passwords' => [
        // …
    ],
];

#22 Re: Laravel 5.x » В каких случаях следует добавлять в head meta name="csrf-token"? » 19.09.2017 07:21:08

когда нужно делать аякс-запросы с POST-методом. токен в них добавлять же надо, а откуда он возьмётся-то? надо его в скрипты каким-то образом «прокинуть» и проще всего это сделать через элемент в html-коде. meta csrf-token это негласный стандарт как это делать – ряд библиотек понимают такой способ автоматически. исторически, если я правильно помню, это начала делать либа jquery-ujs для rails, кстати с ларавелем она вполне нормально «дружит», для простой аяксификации разных форм и кнопок она подходит идеально…

#23 Re: Laravel 5.x » Лог ларавел » 19.09.2017 07:18:01

в geoip2 по-моему архитектура либы так спланирована что оно или возвращает результат или бросает исключение. всяких false и null они возвращать не считают правильным…

#24 Re: Laravel 5.x » Лог ларавел » 18.09.2017 07:58:58

недокопировал строки, надо ближе к #1 и #0 смотреть. и конкретное сообщение об ошибке.

#25 Re: Laravel 5.x » доступ к методу модели из другого класса » 18.09.2017 07:57:14

смотря каким именно образом не получается. возможно ошибка вообще в другом месте

Подвал раздела