Ответы пользователя по тегу PHP
  • В чем преимущества и недостатки static методов?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    + ты вызываешь метод не создавая экземпляр класса
    - класс должен быть инициализирован* "где то там"** в момент обращения к методу
    - тесты со статикой = боль

    *инициализация = автолоад, инклуд
    **"где то там" = файл в цепочке инклудов
    Ответ написан
  • Как реализовать логирование на php?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    но как мне получить старое значение?

    Функцию записи логов нужно вызвать лишь один раз, предварительно собрав все нужные данные. У вас к примеру на бэк приходит POST, вы собираете из него список значений "Новое значение" и формируете строку, где перечислены новые значения. Чтобы получить старое значение, придётся сделать запрос в БД прежде чем будет сделано обновление данных в БД. Запросили данные и точно так же формируете строку "Старое значение". Далее добавляете по вкусу нужные данные (инициатор, дата), делаете апдейт базы и в случае успешного апдейта пишете запрос записи в таблицу с логами ровно один раз. Вот и всё.
    Ответ написан
    1 комментарий
  • Что нужно знать новичку в php?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    Учить это конечно хорошо, но без практики никуда. Настройте себе окружение, познакомьтесь с xDebug. Берите какой нибудь фреймворк (Laravel, Symfony), либо CMS (Wordpress), запустите на своём окружении, попробуйте сломать, увидите как xDebug выводит ошибки, сможете научиться отслеживать цепочку вызовов, посмотрите как это работает и уже там появятся идеи как то всё изменить, заставить работать иначе, добъетесь результата - я вас поздравляю. Эффективное обучение начинается с задачи, которую вы сейчас не можете решить, но когда разберетесь по шагам, станет проще и интереснее. Есть отличный пример базового конструктора веб приложения - userfrosting - админка с управлением пользователями на базе которой можно построить сайт, приложение, кучу всего. Если будет интересно, попробуйте запустить это приложение и начать менять в нём то, что вам не понравится или вы вдруг захотите узнать как конкретная кнопка работает и что происходит когда вы её нажимаете. Удачи!
    Ответ написан
    Комментировать
  • Как вывести данные с БД в массив и проверить их?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    Так пройдитесь foreach`ем по массиву и сравните c помощью if
    Маны здесь:
    IF
    FOREACH
    Ответ написан
    2 комментария
  • PDO подключение и ошибка Fatal error: require_once() что делать?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    Рабочий вариант:
    config.php
    class Config {
        public $database = [
      'host' => 'localhost',
      'base' => '1111',
      'user' => 'root',
      'pass' => '11111',
      'charset' => 'utf-8'
     ];
    }

    Файл с классом
    Если нет автолоада, то перед объявлением класса поставьте require_once 'config.php';
    class db{
      private $link;
      public function __construct(){
         $config = new Config();
                $this->config = $config->database;
      }
    //etc	
    }
    Ответ написан
    4 комментария
  • Php не видит и не подключает существующие файлы, почему?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    /usr/share/pear и /usr/share/php - это альтернативные пути для различных библиотек.
    Проверьте права на чтение здесь '/home/bitrix/www/local/modules/custom.module/lib/exception.php'
    Ответ написан
    3 комментария
  • Почему падает php7-fpm при повышенной нагрузке на MariaDB?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    Либо падение происходит потому что параметр idle_timeout по умолчанию 30 секунд и их не хватает, либо превышен лимит дочерних процессов у FAST CGI. Можно увеличить лимиты memory_limit и max_execution_time, read_buffer time в конфиге Марии. Не уверен, что это сильно поможет. Лучше проставьте индексы в БД, чтобы злые запросы стали добрее и укладывались в таймауты.
    Ответ написан
    Комментировать
  • Как запускать функцию по таймеру php?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    // Cron.
    Не согласен так как крон сам не умеет запускать задачи чаще чем раз в минуту - без колхоза не обойтись, а это уже слишком сложно для данной задачи.

    //Риал-тайм реализован через сокеты на пхп
    Значит у вас есть cli-скрипт, запускаемый из консоли.
    Если сокеты в php реализованы с помощью Ratchet, то вот вам мой ответ по ссылке.
    клац
    Там подробно всё расписано - уверен, что поможет на 100%
    Ответ написан
    Комментировать
  • Как остановить PHP скрипт, который рассылает письма в цикле?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    в БД, в некоторой таблице, возможно такая у вас есть - где хранятся различные параметры, создайте параметр например enable_sendmail и значение 0 или 1. В вашем скрипте, который рассылает письма, делайте запрос в базу и проверяйте данный параметр перед каждой отправкой письма, далее любой удобный способ остановки процесса
    Ответ написан
    Комментировать
  • В каком порядке разрабатывать и тестировать web-приложение?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    Самое главное в подобных проектах ИМХО это безопасность. После определения стека технологий я бы начинал реализовывать управление пользователями и правами доступа так как это основа - скелет, если можно. Затем логика уже самого приложения и права доступа на просмотр уже между пользователями (Мои записи может видеть...кто?)
    Ответ написан
    Комментировать
  • Как лучше реализовать механизм множественных сессий?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    Мне кажется у вас всё слишком усложнено. Поэтому реализовать множественные сессии в таком решении может быть затруднительно. Что можно в Вашем случае сделать?

    Вам не нужны current_session и long_session. Используйте классический механизм сессий. Чтобы в куки записывался id сессии и её время жизни, а в базу данных id сессии и id пользователя - остальные данные типа времени входа - по вкусу. Храните записи сессий в базе таким образом, чтобы на один id пользователя можно было сделать несколько записей. Таким образом у вас не будут отваливаться сессии при входе на разных устройствах. И не переживайте за записи в БД - они не будут занимать много места. В конце концов можно записывать таймштамп истечения срока сессии и по крону периодически проверять и чистить старые записи.
    Пример реализации подобного решения вы можете найти в библиотеке birke/remembermeссылка на github
    Ответ написан
    1 комментарий
  • Как можно решить проблему с кодировкой CSV файла созданного с помощью fputcsv?

    eXcNightRider
    @eXcNightRider Автор вопроса
    FullStack Web Developer | DevOps
    $converted_file = iconv('utf-8','windows-1251',file_get_contents('/var/project/documents/' . $this->type . '/tmp_' . $file));
    Ответ написан
    Комментировать
  • Как обрабатывать массивы GET, POST при получении?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    Для каждого случая все индивидуально. Например вы POST-ом отправляете данные пользователя, которые надо записать в базу. Точно известно какие параметры придут на backend, нужно забрать только их и отфильтровать по регулярному выражению, прогнать trim либо использовать валидацию. Если отправить кучу других значений, они должны просто игнорироваться.
    Пробелы в GET можно передать только закодировав в base64, в обычном случае их нет.

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

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    используйте второй раз groupby(); по типу товара
    Ответ написан
  • Почему mPDF стал криво выводить pdf?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    mPDF в последних версиях работает со шрифтами и css несколько иначе и в вашем примере это очевидно видно. В своём проекте я использую mPDF 6.1 , при переходе на 7 всё стало примерно так-же как и у вас и местами (таблицы) хуже. Просто попробуйте использовать более старую версию. Думаю, это поможет.
    Ответ написан
    Комментировать
  • Как организовать обмен данными между приложениями PHP?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    Существует отличная реализация сокетов с поддержкой протокола WAMP на PHP - Ratchet. Подробная документация на этом сайте
    А теперь рецепт из практики:
    1. Собираем простое приложение с помощью composer, нам понадобится пакет cboden/ratchet
    2. Пишем базовый класс
    <?php
    namespace MyApp;
    use Ratchet\MessageComponentInterface;
    use Ratchet\ConnectionInterface;
    
    class Msg implements MessageComponentInterface {
        public function onOpen(ConnectionInterface $conn) {
        }
    
        public function onMessage(ConnectionInterface $from, $msg) {
        }
    
        public function onClose(ConnectionInterface $conn) {
        }
    
        public function onError(ConnectionInterface $conn, \Exception $e) {
        }
    }

    Четыре определённых в коде функции обязательны, они предназначены для обработки соответствующих событий
    3. PHP-CLI скрипт, который запустит сервер сокетов и будет принимать сообщения:
    msg-server.php
    <?php
    use Ratchet\Server\IoServer;
    use MyApp\Msg;
    
        require dirname(__DIR__) . '/vendor/autoload.php';
    
        $server = IoServer::factory(
            new Msg(),
            8080
        );
    
        $server->run();

    Если запустить данный файл командой
    php bin/msg-server.php
    Сервер будет работать и к нему можно даже подключиться с помощью telnet
    telnet localhost 8080

    4. Клиентская часть - пакет ratchet/pawl
    5. Пример реализации:
    <?php
    
        require __DIR__ . '/vendor/autoload.php';
    
        \Ratchet\Client\connect('ws://192.168.1.100:8080')->then(function($conn) {
            $conn->on('message', function($msg) use ($conn) {
                echo "Received: {$msg}\n";
                $conn->close();
            });
    
            $conn->send('Hello World!');
        }, function ($e) {
            echo "Could not connect: {$e->getMessage()}\n";
        });


    Для передачи структурированных данных можно использовать традиционный JSON
    Ответ написан
    Комментировать
  • Как объединить два двумерых массива?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    1. С помощью foreach собираем новые массивы в которых ключи будут иметь значение id или ids для первого и второго массива соответственно.
    2. $result_array = array_merge_recursive($new_array1, $new_array2) P.S если заранее есть возможность сформировать массивы с правильными ключами при получении данных из БД это будет замечательно.
    Ответ написан
  • Как сделать единую точку входа для подкючения к бд?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    Вариант 1. На скорую руку и эффективно. Чтобы не вдаваться в глубокие подробности, для решения задачи можно использовать фреймворк. Например Slim. Он легкий и достаточно простой в освоении и в нем как раз реализована из коробки та самая Единая точка входа. В документации все достаточно подробно расписано, как строится приложение, как подключается база, как работает роутинг, как подключить шаблонизатор, например twig и многое многое другое. На русском языке.
    Вариант 2. Сложный, но можно получить больший опыт. Пишем классы, в том числе и класс для подключения к бд. Кладем их в папку. Единой точкой входа станет, традиционно файл index.php в котором будет использоваться spl_autoload. Чтобы обращаться по различным урлам приложения, а не непосредственно файлам php понадобится роутинг. По данному вопросу опять же есть много информации в сети.
    Ответ написан
    Комментировать
  • Постоянно запущенный скрипт на PHP, как реализовать?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    Привожу живой пример из личной продакшн практики. PHP-CLI скрипт как запускаемое приложение
    Начальные условия:
    Наличие GNU Linux (в моём случае это Debian)
    Установленные пакет php, php-cli, остальные по вкусу и зависимостям
    В качестве таймера используется класс React\EventLoop\Factory
    1. Создаём пустой файл, можно без разрешения (например daemon), открываем в текстовом редакторе
    Важно, чтобы в начале была строка #!/usr/bin/php -q
    2. Пишем
    #!/usr/bin/php -q
    <?php
    ini_set("display_errors", 1);
    error_reporting(E_ERROR);
    require "/var/project/vendor/autoload.php";
    require '/var/project/bin/cli_config.php';
    use Ratchet\Session\SessionProvider;
    
    $loop = React\EventLoop\Factory::create();
    //вызовы $loop->addPeriodicTimer можно ставить в нужном количестве, первый параметр - количество секунд
    $loop->addPeriodicTimer(120, function(){
    //код здесь будет выполняться каждые 120 секунд
    });
    //если нужен повторяющийся цикл 
    //$loop->run();
    //а если нужен один раз на вызов
    $loop->tick();

    3. chmod a+x /www/project/bin/daemon - даём права на выполнение
    4. запускаем ./daemon будучи в папке с файлом. Если ошибок нет, всё будет работать
    5. А ещё скрипт можно установить как демон в systemd и управлять с помощью /etc/init.d/daemon.service (start|stop|restart) и есть ещё bash-скрипт который будет держать службу на контроле и перезапускать если что, так как не всегда ошибка возвращает код и systemd считает, что процесс не упал, а его остановили, но это уже другая история

    6. Для решения задачи "Требуется по запросу юзера (нажал кнопку) вести отсчет таймера от 120 секунд до 0 и произвести действие" в php на действие пользователя просто запустить exec('/var/project/daemon', $output_1, $exitval);
    Ответ написан
    1 комментарий