• Есть китайфон на андроиде. Треснул тачскрин. Нижняя половина дисплея не откликается на касания. как достать информацию с встроенной памяти?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    1. Bluetooth мышь
    2. Обычная мышь через переходник microUSB->USB A, настраиваем в телефоне автоматичекое подключение как флешку.
    3. Прошить кастомное рекавери - если для этого телефона его собирали, загрузиться в рекавери и включить режим флешки.

    //можно ли подчлюить другой тач от тела с другим разрешением?
    не представляется возможным

    //поможет ли загрузка в инженерном режиме?
    в стоковом нет.
    Ответ написан
    Комментировать
  • Как запускать функцию по таймеру php?

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

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

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    Если результат запроса пустой, first() вернёт NULL, стоит проверить $test на NULL прежде чем его возвращать

    P.S - если в where первый и третий аргументы должны быть равны, второй ('=') можно опустить и написать
    where('category_id',$category_id)
    Ответ написан
  • Какие тестовые задания допустимы для джунов?

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

    Как вариант - составить тестовое задание из теоретических вопросов с вариантами ответа и несколько практических вопросов где нужно подумать. При правильном подходе к сборке такого задания Вы подберете себе нужного кандидата
    Ответ написан
  • Как остановить 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 всё стало примерно так-же как и у вас и местами (таблицы) хуже. Просто попробуйте использовать более старую версию. Думаю, это поможет.
    Ответ написан
    Комментировать
  • Как правильно реализовать контроллируемое скачивание файлов?

    eXcNightRider
    @eXcNightRider
    FullStack Web Developer | DevOps
    Суть сводится к примерно следующей функции:
    public function getFile($file_id)
        {
            $file_data = Files::where('fileable_id', $file_id)->first();
            $file = "/var/project/{$file_data['path']}/{$file_data['original_name']}";
            header('Content-type:'.$file_data['content_type']);
            header('Content-Disposition: attachment;filename=' . md5($file_data['original_name']));
            header('Cache-Control: must-revalidate');
            header('Content-Length: ' . filesize($file));
            readfile($file);
        }
    Ответ написан
  • Как организовать обмен данными между приложениями 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 комментарий