Ответы пользователя по тегу PHP
  • Как отправить данные через POST?

    @rPman
    "category": "8",
    попробуй убрать запятую тут, это не считается валидным json, например php json_decode его не распознает
    Ответ написан
    1 комментарий
  • Имеется ли возможность в PHP создать переменную для всех соединений?

    @rPman
    php изначально создавался для запуска короткоживущих приложений, работающих только пока открыто веб-соединение, и чтобы данные шарить между соединениями используют на выбор: семафоры, очереди и общую память (самый простой с точки зрения обслуживания но считается низкоуровневым и немного сложноват для использования), сторонний сервер ...nosql (например memcache/redis/...) или ...sql (рекомендуется так как легко масштабируется), файлы с блокировками (не эффективный быдлокод, но очень прост в использовании)

    Но со временем язык стал на столько крутым что можно целый веб сервер на нем написать, причем асинхронный (например с использованием reactphp), точно так же как делают на nodejs... и вот в этом случае, приложение получается работает постоянно, а значит общая оперативная память и данные можно передавать просто через глобальные/статические/фабрику.
    Ответ написан
    4 комментария
  • Как хранить логи приложения на php?

    @rPman
    Храни в sql базе, так как это временные логи, используй партиционирование, и очень хорошо думай какие индексы ставить
    Ответ написан
  • Как добавить в регулярное выражение кириллицу?

    @rPman
    preg_replace не понимает мультибайтовые кодировки, и воспринимает символы просто как набор байт, соответственно он может найти искомый символ к примеру на пересечении двух символов, где конец первого и начало второго символа случайно совпали с искомым символом (что произойдет с этими двумя символами или всей строкой после можете сами догадаться).

    Я периодически вижу в интернете странные попытки настраивать локаль и использовать модификатор u и говорят даже работает, но документации для этого мне найти не удалось

    Но зато есть штатный механизм работы с кодировками - это расширение Multibyte String, пользуйтесь им и все будет работать как ожидается. В частности использовать нужно mb_ereg_replace
    Ответ написан
    1 комментарий
  • Как получить массив в массиве, в одном запросе?

    @rPman
    Зачем?

    Я надеюсь ты объединяешь в одном запросе данные изначальной таблицы и той из которой собираешь data с помощью inner (left если нужны записи с пустым data) join?

    Реляционные базы данных это про буквально табличное представление данных, не подразумевающее наличие вложенных списков (в некоторых типа oracle есть такие типы но по сути это как бы отдельный запрос к серверу, да достаточно эффективный но запрос).

    Если тебе нужен плохой совет, ты можешь сериализовать данные, собрав строку из них, например с разделителем ',' с помощью GROUP_CONCAT. В этом случае, используя группировку ты исключишь из результата запроса дубликаты (который умножает данные таблицы на данные data, дублируя колонки из таблицы) но потратишь время на конкатенацию на sql сервере и парсинг (для числ да простой) массива из строки на бакэнде.
    Ответ написан
    6 комментариев
  • Как убрать из переменной лишние символы?

    @rPman
    intVal или floatVal автоматически преобразуют число в начале строки, проигнорировав все остальные символы а так же отсутствие числа в принципе (вернет 0).
    Ответ написан
    1 комментарий
  • Как добавить модуль pdo?

    @rPman
    Модули php тесно связаны с конкретной сборкой php, поэтому распространяются вместе и по отдельности на имеют смысла.
    Тот механизм, который ты использовал для установки своей версии php, если не содержит нужного модуля, значит его нет и остаётся только самостоятельная компиляция из исходников, и это очень не тривиальный процесс.

    Выбери другой источник пакетов php, например на launchpad backports
    Ответ написан
  • Почему при ajax запросе на php файл ничего не приходит?

    @rPman
    Echo не умеет выводить массивы, воспользуйся какой-либо сериализацией, json_encode или var_dump или вместо echo используй print_r
    Ответ написан
    Комментировать
  • Есть ли волшебный метод, чтобы запретить var_export вытащить приватные поля класса?

    @rPman
    Не хранить переменные в виде мембера класса, а хранить как static внутри метода
    Ответ написан
    2 комментария
  • Как записать данные в переменную PHP и вызывать их в любом участке кода?

    @rPman
    С высокой вероятностью у тебя проблема в непонимании различий между локальными и глобальными переменными.

    Если бы ты включил вывод всех варнингов, то в том месте, где у тебя используется ожидаемая переменная и ее значение пустое - будет ошибка что она не определена.

    p.s. есть разные способы использовать переменные глобально, в т.ч. экзотические
    * если переменная определена глобально вне функций, то чтобы получить к ней доступ внутри функции, ее нужно добавить в оператор global внутри этой функции или предопределенный массив $GLOBALS (не рекомендую)
    * можно определить переменную как статическую внутри класса, и получать к ней доступ везде по имени класса, типа ClassName::$variable
    * есть странный способ, хранить переменную (или просто доступ к ней) через вызов глобальной функции (или статичного метода по аналогии выше), само собой на запись примитивов потребуется заворачивать переменные в структуры. Как там внутри доступ организуется, отдельный разговор, как вариант очень смешно определить переменную внутри этой же функции как static
    function db()
    {
      static $db=false;
      if($db===false) $db=...;
      return $db;
    }
    ...
    db()->execute(...);
    // напоминаю что пример вырожденный, делать так именно для бд не рекомендую, хотя когда то таким пользовался
    Ответ написан
    Комментировать
  • Как реализовать бэкап сайта/бд посредством PHP?

    @rPman
    Суточного бакапа тебе будет достаточно? Если в момент смерти сайта ты сможешь восстановить только 'вчерашнюю' копию, с потерей всех сегодняшних изменений и данных?

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

    Чтобы решить эти проблемы используют снапшоты, на выбор - либо на уровне виртуальной машины (если она используется либо у провайдера), либо разделов (например если используется lvm), либо файловой системы (если используется btrfs/zfs/ntfs, с оговорками).

    Перед резервным копированием делают снапшот файловой системы, замораживая ее состояние, делают копирование, после чего снапшот удаляют/отключают. Самые быстрые снапшоты на основе файловой системы и у виртуальной машины (правда некоторые делают это вместе с оперативной памятью, что медленнее).

    Самый интересный механизм резервного копирования базы данных - это онлайн репликация базы на соседнюю машину. Все изменения будут копироваться в тот же миг как они были совершены на исходной машине (можно настроить master-master репликацию, тогда изменения будут гарантированно синхронизированы), что позволяет использовать копию практически моментально, не теряя данных вообще (это не учитывает сценарий ошибки администратора или разработчика! т.е. обычные резервные копии это не отменяет, но очень хорошо защищает от остальных проблем с оборудованием и связью).

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

    Ну и конечно есть механизмы онлайн резервирования целой виртуальной машины, когда за резервирование системы в целом отвечает вииртуализация (заранее построенный отказоустойчивый распределенный кластер), возможно создание такой системы, что в момент сбоя даже не перестанет работать приложение, оно прозрачно и оперативно переедет на другую ноду в крастере.
    Ответ написан
    Комментировать
  • Как исправить ошибку при подключении БД Access к PHP?

    @rPman
    А если не использовать dsn а указать в настройках подключения путь до файла базы?
    p.s. https://www.php.net/manual/en/odbc.installation.php
    spoiler
    To avoid «[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified»:

    - Find the ODBC manager in Windows control panel and check the "Drivers" tab. Please note that 64 bit Windows has two different managers for 32 [1] and 64 bit drivers: drivers must match your PHP installation.

    - If the required driver doesn't show up there, you need to install it. The free "Microsoft Access Database Engine 2010 Redistributable" package [2] is one of the possibilities for Access and Excel.

    - When connecting with odbc_connect(), make sure you are using the exact driver name in the DRIVER parameter: 'Microsoft Access Driver (*.mdb)' will not work if your driver is called 'Microsoft Access Driver (*.mdb, *.accdb)'.

    [1] C:\Windows\SysWOW64\odbcad32.exe
    [2] www.microsoft.com/en-us/download/details.aspx?id=13255
    Ответ написан
    Комментировать
  • Что означает константа IMAGETYPE_COUNT?

    @rPman
    Если я верно понимаю исходники, это фиктивное значение для enum, чтобы автоматически определять количество элементов в нем (последняя будет автоматически иметь значение равное количеству, если не переопределять их значение) - т.е. сколько типов описывают исходники.

    Это по уму жуткий быдлокод, особенно без хотя бы комментария, чтобы нужно было это понимать.

    p.s. ума не приложу где это может понадобиться
    Ответ написан
    Комментировать
  • Можно ли передать данные из PHP в «отдельностоящий» HTML?

    @rPman
    Выбрав SSI ты заранее создал себе проблемы.
    Собирать страницу из кусочков можно на самом php, прямо в твоем process.php (именно так и делают), а с помощью mod_rewrite веб сервера скрывают .php от пользователя, оставив /process

    Так же совершенно нормально (с оговорками про поисковые системы, роботы еще не очень хорошо читают такие страницы но все решаемо) формировать страницу не на сервере а на клиенте, с помощью javascript (такой подход активно используется в SPA веб приложениях), в этом и похожих случаях необходимые переменные передаются с сервера на клиент с помощью технологии ajax (на основе fetch или XMLHttpRequest, сам ajax реализован в популярном jquery) а еще лучше с помощью websocket (но нужно на сервере уже бакэнд с его поддержкой), ведь это позволит не только клиенту запрашивать данные но и серверу оперативно передавать данные клиенту по своему желанию а не когда спросят.
    Ответ написан
    Комментировать
  • Необходима библиотека для распознавание текста с документа на PHP?

    @rPman
    открытый бесплатный готовый к использованию - tesseract
    недостаток, если документ не распознается, то нужно будет тюнить его шрифты

    на английский язык и некоторые другие языки есть современные языковые OCR модели, гуглить на huggingface.co ocr multilang, на русский я не нашел. Но куча готового софта, подбираешь датасет, обучаешь,...
    Ответ написан
    2 комментария
  • Как отслеживать изменение локального файла в директории через js?

    @rPman
    Сама идея приложения у тебя максимально неправильная но да ладно.

    В тегах у тебя php, на нем обычно пишут бакэнд - серверную часть, вот и отслеживай изменения в файле через него. Т.е. к примеру на javascript из браузера по таймеру (setInterval) раз в 1-10 секунд делаешь запрос на сервер вида - выдай мне изменения в файле начиная с такой то даты (например новые строки) или пустой ответ. А на php код должен проверять дату последнего изменения в файле метод filemtime (осторожно, результаты кешируются, поэтому перед проверкой сбрасывай кеш) и сравнивать с датой, которую запросил браузер.

    Почему дата, с которой нужно сравнивать, нужно хранить в браузере, потому что у тебя может быть открыто несколько вкладок (или разные пользователи) на чтение данных из этого файла но в разные моменты времени, и для каждого этот момент времени свой. Используй не время на клиенте, а время, которое возвращает функция filemtime (т.е. твой бакэнд помимо строк из файла должен вернуть дату на момент чтения этих строк).
    Ответ написан
  • Как в контейнере из php apache увеличить выделенную память?

    @rPman
    посмотри полный путь до конфиг файла, так как в системе их будет несколько, один для php-cli, другой для php-apache, третий для php-cgi, там прямо в пути это название будет
    Ответ написан
    Комментировать
  • Можно ли в PHP из дочернего процесса создавать еще дочерние процессы?

    @rPman
    php прекрасно создает процессы как с помощью popen так и с помощью exec/passthru, запуская како-нибйдь nohup или просто указывая в конце команды &, а еще есть расширение parallel
    Ответ написан
    7 комментариев
  • Не работает локализация setlocale в PHP?

    @rPman
    функция date умеет только англоязычные названия (формат 'F'). Для русских подменяй сам, заведи константу массив (нулевой элемент пустой, так как нумерация месяцев с нуля) типа $month_names=['','Январь','Февраль',... и для вывода пользуйся $month_names[$mon]

    Формат в date для месяца бери 'n', он выдаст номер без дополнительного символа 0 в начале (если оставишь 'm' то в массиве имен не будут найдены значения по ключу '01'...)

    p.s. есть strftime, оно умеет разные языки, но русский не умеет (хотя в системе все прописано и настроено)
    Ответ написан
    2 комментария
  • Как организовать очередь POST-запросов, если сервер в дауне?

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

    Теперь про эти сервера, тебе нужно точно определять, успешно ли запрос отправлен или есть ошибки, проверяй все что вернул сервер, возможно там есть запросы на проверку и т.п. задачу из таблицы очереди удалять только после успешной отправки, можно завести статусы, чтобы можно было мониторить состояние, например перед отправкой запроса ставишь состояние 'отправляется', по окончании менять на 'успешно' (потом или сразу удалять) или 'ошибка' что делать с ошибочными тебе виднее, например повтор через интервал времени (периодически менять статус на 'ожидает отправки' для записей старее этот монтировал времени)
    Ответ написан
    Комментировать