Ответы пользователя по тегу PHP
  • Как настроить config:cache для запуска локально?

    @iljaGolubev
    Проще всего в .env файле прописать нужный путь.
    #.env
    APP_SERVICES_CACHE
    APP_PACKAGES_CACHE
    APP_CONFIG_CACHE
    APP_ROUTES_CACHE
    APP_EVENTS_CACHE
    а вообще, смотрите в исходниках как это работает.
    grep -rn APP_ROUTES_CACHE vendor/laravel/
    Ответ написан
    Комментировать
  • Влияет ли на быстродействие и потребление памяти, отказ от обращения к свойствам класса, внутри методов?

    @iljaGolubev
    Быстрее будет присвоение $someProperty = $this->someProperty до цикла.
    Но это именно про приведённый код с учетом, что цикл 1000 внутри someMethod. Прирост скорости настолько незначительный, что в реальных условиях может выиграть и echo $this->someProperty;
    Но ведь в реальности такой код не имеет смысла...
    Если уж заменять, то с реальными циклами и требуемым окружением.

    По памяти разницы нет - создание новой переменной без изменения не выделяет дополнительную память.
    `CV` - compiled variable == ссылка на реальную переменную.

    // для echo $someProperty;
    0000 EXT_STMT
    0001 T0 = FETCH_OBJ_R THIS string("someProperty")
    0002 ECHO T0
    0003 EXT_STMT
    
    // для echo $this->someProperty;
    0000 EXT_STMT
    0001 T1 = FETCH_OBJ_R THIS string("someProperty")
    0002 ASSIGN CV0($someProperty) T1
    0003 EXT_STMT
    0004 ECHO CV0($someProperty)
    0005 EXT_STMT


    Мини-микро-нано прирост скорости возможет только из-за того, что в цикле для `echo $someProperty; ` будет выполняться только ECHO, тогда как для `echo $this->someProperty; ` две инструкции FETCH_OBJ_R и ECHO.
    Ответ написан
    Комментировать
  • Как реализовать подписание оферты на сайте простой электронной подписью?

    @iljaGolubev

    Простая электронная подпись — это комбинация логина и пароля, которая применяется для входа на сайт

    Вам нужно реализовать "регистрацию" пользователя и добавить обязательный чекбокс при оформлении заказа "Согласен с офертой" . Добавить саму оферту в которой прописано что юрист скажет...
    странно что он не сказал о ФЗ-152 в связи с "клиенты прикрепляют скрин паспорта".
    Ответ написан
    Комментировать
  • Почему PHP8 выдаёт ошибку на стандартный цикл?

    @iljaGolubev
    PHP 8.0.0 count() will now throw TypeError on invalid countable types passed to the value parameter.
    Ошибка потому,что
    interface Countable ...
    ...
    class DOMElement extends DOMNode implements DOMParentNode, DOMChildNode {
    // не реализует Countable


    Сделал проверку перед if (is_countable($array)) {

    $dom = new DOMElement('div');
    echo var_dump(is_countable($dom));
    // bool(false)

    Так что непонятно что вы проверяли.
    Ответ написан
    Комментировать
  • После регистрации пользователь в базу таблицы users не попадает..В чем проблема?

    @iljaGolubev
    Явно включите
    class Database{
    ...
        public function __construct(){
            try {
                $this->conn = new PDO($this->dsn,$this->dbuser,$this->dbpass);
                 $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


    Отключите на время отладки js обработчик формы.
    - добейтесь работы стандартным .

    Убедитесь, что вообще в нужный кусок кода попадает
    if(isset($_POST['action']) && $_POST['action'] == 'register'){
       die('POST WORK');
    Ответ написан
    Комментировать
  • Как правильно отслеживать ошибки?

    @iljaGolubev
    При разработке:
    использовать xdebug (или альтернативы).
    методы которые могут выкинуть исключение включать в try..catch.
    писать подробные сообщения в лог не только на пойманные и исключения, но и на весь процесс обработки запроса. (отключать такое логирование изменением конфига)
    В бою:
    читать свои логи, читать логи сервера.
    Ответ написан
    Комментировать
  • Зачем используют curl когда есть file_get_contents?

    @iljaGolubev
    curl больше возможностей.
    сравнивать имеет смысл curl и stream-context-create.
    Ответ написан
    Комментировать
  • Как реализовать "журнал событий"?

    @iljaGolubev
    В базе храните ключи (enum) типа действия.
    Добавьте ключи в локализацию.
    Добавьте cast в модель и измените toArray() (метод сериализации) чтобы возвращал локализованные значения.
    пример enum

    enum JournalAction: string
    {
        case Edit = 'edit';
        case Add = 'add';
    
        public function translated($replacements=[]): string
        {
            return Lang::get('journal.' . $this->value,...$replacements);
        }
    }

    Идентификаторы вакансии и пользователя храните в поле jsonb. (как делать их локализацию - совсем другой вопрос). Хранение их локализованного значения в журнале в виде строк может стать проблемой когда название или имя изменится (или из локализация).
    Ответ написан
    Комментировать
  • Как обратиться к константе(методу) класса PHP через переменную?

    @iljaGolubev
    если без этого никак, то вот...
    $rightsManager = Driver::getInstance()->getRightsManager();
    $ref = new ReflectionClass( get_class($rightsManager) );
    $needleRight = $ref->getConstant('TYPE_'.$rightType);
    $accessTaskId = $rightsManager->getTaskIdByName($needleRight);
    Ответ написан
    Комментировать
  • Максимальное число на PHP?

    @iljaGolubev
    $dir = glob('my_files/*.txt');
    $last = array_pop($dir);
    preg_match('/.*_(\d+)\.txt/', $last, $matches);
    $max = empty($matches)? 'null': $matches[1];
    echo "Max number:  $max";

    Glob уже сортирует файлы. Если в my_files лежат файлы именно с указанным форматом имени, то последний будет с максимальным числом.
    Если в директории могут быть файлы с другим форматом имени (number_XXX.txt, например), можно использовать цикл как у вас. Только перебирайте массив $dir с конца - там наиболее вероятно появление искомого.
    Ответ написан
  • Можно ли как либо защитить php-проект от "угона" другим наёмным программистом (фрилансером)?

    @iljaGolubev
    Если проект - монолит, то 100% клонируют при желании (опуская ответственность за это).

    Защита исходных кодов проекта php - отсутствие к ним доступа.
    Можно разделить монолит на фронт/бэк/сервис(ы) - всё отдельные проекты. Наёмный фрилансер получает доступ только к отдельной части. Всё самое важное (ноухау, бизнес-идею) - держать в сервисах, доступ к коду которых только у особо доверенных товарищей. CI/CD и интеграционные тесты обязательны.

    В целом, сложность проекта возрастает в разы... но если есть, что защищать, наверное, оно того стоит?
    Ответ написан
    1 комментарий
  • Как сохранить get параметр при переходе на другую страницу?

    @iljaGolubev
    через php дописать get параметр в адресной строке

    это невозможно - php не управляет браузером напрямую.
    ---
    Можно сделать редирект, но думаю для seo это тоже не хорошо.
    //псевдо
    if REFERRER has ?сity=mos
         return redirect REQUEST?сity=mos

    ---
    В php генерите страницы добавляя в ссылки нужные параметры
    т.е. на странице https://domen.ru/test/?сity=mos
    ссылка должна быть сразу https://domen.ru/test_2/?сity=mos

    ---
    Как вариант - через добавить ?сity=mos к нужным ссылкам на странице.
    Ответ написан
    Комментировать
  • Как в Carbon получить слово "День" склоняясь в зависимости от числа (дней,дня,дни)?

    @iljaGolubev
    В Carbon - через функции локализации.
    Внутри carbon использует symfony/translation, (pluralization)
    <?php
    $daysTranslator = 'ru_Days';
    $translator = \Carbon\Translator::get($daysTranslator);
    $translator->setTranslations([
        'day' => ':count день|:count дня|:count дней',
    ]);
    
    $date1 = Carbon::create(2018, 1, 1, 0, 0, 0);
    $date1before = Carbon::create(2018, 1, 2, 4, 0, 0);
    $date2before = Carbon::create(2018, 1, 3, 4, 0, 0);
    $date5before = Carbon::create(2018, 1, 6, 4, 0, 0);
    $localized=$date1->locale($daysTranslator);
    
    echo $localized->diffForHumans($date1before)."\n"; 
    echo $localized->diffForHumans($date2before)."\n"; 
    echo $localized->diffForHumans($date5before)."\n"; 
    
    // 1 день до
    // 2 дня до
    // 5 дней до


    Ещё сюда загляните - Склонение числительных
    Ответ написан
  • Как переместится на n-ную запись в большом xml при помощи XMLReader?

    @iljaGolubev
    В php XMLReader нет возможности перейти на произвольную строку. При каждом запуске чтение начинается с начала файла. Значит нужно читать последовательно до того продукта на котором закончилась прошлая обработка.
    //Псевдокод. не проверял.
    
    $lastProductIndex=100000;
    // сначала нужно дочитать до <products>
    // потом перебирать <product>
    while($xmlReader->next("product") && --$lastProductIndex) {
        // skip
    }
    if($lastProductIndex==0){
        // тут последний обработанный прошлый раз
    }else{
        // продуктов стало меньше? 
    }
    Ответ написан
  • Как запустить php скрипт в фоне?

    @iljaGolubev
    Как отдать ответ клиенту и продолжить выполнение долгого скрипта?

    или так.
    <?php
    ignore_user_abort(true);
    set_time_limit(0);
    ob_start();
    header('Connection: close'); 
    header('Content-Length: '.ob_get_length());
    // можно добавить http статус подходящий
    ob_end_flush();
    ob_flush();
    flush();
    // дальше запуск
    run_havy_task();


    оба варианта предполагают, что есть отдельный способ получения результатов выполнения запущенной задачи.

    UPD: после критики в комментариях, поясню.
    Предложенное мной решение - примитивный способ сказать web серверу вернуть клиенту ответ и после этого продолжить выполнение скрипта.
    При этом ресурсы ресурсы сервера не будут освобождены пока функция run_havy_task не закончит работу. Можно использовать fastcgi_finish_request - но она не на 100% гарантирует завершение процессов.
    Таким образом, если до этого вы не переживали о ресурсах выделенных на выполнение "тяжелого" скрипта, то можно продолжать и так - запихнуть всё тяжелое в внутрь run_havy_task.
    Но лучше будет "тяжелую" часть обрабатывать в отдельных процессах. Например, одним из способов из комментариев к вопросу или из другого ответа, ссылку на который я дал в начале своего.
    Ответ написан
  • Как записать неформатированный текст?

    @iljaGolubev
    1. Из вопроса непонятно при чём тут mysql.
    2. Вообще не очень понятно какой результат вам нужен: в коментах не увидел никакого форматирования тоже.
    3.
    остаются какие-то тройные пробелы.. хотя в регулярке убираю

    Вы её неверно используете
    echo str_replace(['a','b','c'], 'c', 'ab'); // 'cc'

    4. Попробуйте так, может окажется достаточно для вас.
    Ответ написан
  • Как сохранить сформированный через php xml в файл на сервере?

    @iljaGolubev
    но ничего не получается
    - плохой диагноз.

    В $data у вас XMLReader которые не умеет автоматом __toString. А вы его в `file_get_contents(filename: $data)` суёте. Что по вашему должно произойти?

    Само название XMLReader говорит от назначении "читать".
    Для записи используйте XMLWriter.
    Ответ написан
    3 комментария
  • Как вместо 0,00 вывести 55.000.000?

    @iljaGolubev
    FixMoney($data[$user['cash']]);
    Скорее вы что-то не то передаёте в функцию. Проверьте что в переменных $data, $user. Включите error_reporting(E_ALL);
    Если в number_format первый параметр = null то получаете сообщение `PHP Deprecated: ...` , но на выходе как раз будет 0,00.
    Ответ написан
    1 комментарий
  • Как передать аутентифицированного пользователя в job очереди Laravel?

    @iljaGolubev
    пользователь не реализует контракт "MustVerifyEmail"

    Ну так реализуйте.
    class User extends Authenticatable implements MustVerifyEmail
    Ответ написан
    2 комментария
  • Как прописать API от timeweb?

    @iljaGolubev
    curl -H "x-app-key: {appkey}" \
    x-app-key нужно передавать в заголовке.

    следуйте инструкици

    Вообще не должно быть этого в коде приложения. https://api.timeweb.ru/v1.2/access нужен только для получения токена. Последующая аутентификация в api с помощью этого токена.
    Ответ написан
    Комментировать