Задать вопрос
Ответы пользователя по тегу PHP
  • Как добавить модуль 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
    Мыслишь верно.
    У тебя твое приложение в какой то момент принимает решение отправить запрос, вместо этого запроса сразу добавляй его в таблицу очередь, отдельным воркером, пусть даже в этом же приложении с периодичностью запрашиваешь самую старую запись, если вернули не пустой результат, значит делаешь попытку отправить запрос.

    Теперь про эти сервера, тебе нужно точно определять, успешно ли запрос отправлен или есть ошибки, проверяй все что вернул сервер, возможно там есть запросы на проверку и т.п. задачу из таблицы очереди удалять только после успешной отправки, можно завести статусы, чтобы можно было мониторить состояние, например перед отправкой запроса ставишь состояние 'отправляется', по окончании менять на 'успешно' (потом или сразу удалять) или 'ошибка' что делать с ошибочными тебе виднее, например повтор через интервал времени (периодически менять статус на 'ожидает отправки' для записей старее этот монтировал времени)
    Ответ написан
    Комментировать
  • MySQL + PHP :: Хранение паролей клиентов в базе данных с целью их извлечения, как защить?

    @rPman
    Забудем что принципиально хранить пароли - плохая практика, но так как задача уже такова что хранение вынужденное то:
    1. шифровать логины и пароли (весь набор данных, не имеющих смысл друг без друга, лучше хранить сериализованными в одном поле, особенно когда от задачи к задачи поля меняются, т.е. логин пароль почта api key, gpg ключи шифрования и т.п. пусть это будет свободная json строчка, за ее анализ отвечает клиентская часть приложения)
    2. ключом/паролем, который не хранится в базе данных (он должен являться частью бакэнда, т.е. в том месте где на бакэнде хранятся настройки подключения к внутренним сервисам либо отдельное место хранения) - при разделении работ между людьми (обслуживать базы могут другие люди, чем те кто имеет доступ к бакэнду) чувствительные данные не утекут легко.
    3. логируй все, т.е. показал пароль - сохрани в специальном логе (в базе или файлах уже вопрос организации работ) - кто, когда, с какой машины, что получил
    4. когда показываешь пароль на клиентской машине, повторно запрашивай авторизацию (чтобы не использовалась автосохраненная), важный момент, это исключит кражу данных уже на стороне клиента, очень мало кто правильно организует рабочее место (это просто неудобно и дорого).
    Ответ написан
    2 комментария
  • Как правильно реализовать авторизацию пользователя БД через сайт?

    @rPman
    Безопасность чего?

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

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

    p.s. oracle дорос до скоростей mysql/postgres веб? особенно если речь об мелких объемах
    Ответ написан
    3 комментария
  • Как в php заблокировать файл от других обращений?

    @rPman
    POST это http?
    Тебе нужен свой http сервер, реализующий нужную логику. Инструментов миллион, попробуй swoole
    .
    Если его реализовать без многопоточности и асинхоронщины, то пока он будет обрабатывать один запрос, никакой другой не будет получен, другие будут ждать в очереди сетевого стека и отваливаться с ошибкой по таймауту.

    Интересно что встроенный отладочный http сервер php -S xxx:port какраз однопоточный, и хотя его не рекомендуют для продакшн, можешь попробовать.
    Ответ написан
    4 комментария
  • Возможны ли коллизии при использовании rename?

    @rPman
    Системный rename атомарный, т.е. два одновременно работающих приложения отработают так что одно вернет true а другое false. Осторожно с сетевыми файловыми системами, к примеру nfs не гарантирует.

    Но вот записи в файл - нет, совершенно нормально получить кашу, если писать в файл к примеру логи (строчки) одновременно из двух потоков/процессов. И fflush тут не спасет, понадобится синхронизация либо через блокировки файлов (не рекомендую) либо через семафоры/мьютексы или другие IPC механизмы. Есть мнение что запись кластера файловой системы - атомарна (если твои writes выровнены по нему и размером с него), но как я понимаю гарантий этого никто не дает.

    p.s. если у тебя многопоточный доступ к данным, настоятельно рекомендую не извращаться а взять готовую базу данных, даже если объемные блобы будут продолжаться храниться в файлах на диске (имя в базе) а за блокировки отвечает база данных или иной механизм, проблем будет на порядок меньше.
    Ответ написан
    9 комментариев
  • Как работает открытие сокета на сервере?

    @rPman
    Во первых веб браузеры не умеют работать с обычным универсальным tcp/udp советами, им нужен определенный протокол, т.е. приложение, которое слушает сокет (socket_listen) должно работать по совместимому протоколу (сейчас это http, его расширение websocket, а для udp - webrtc).

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

    Про 'ваш сервер', я встречал виртуальный хостинг, обычно точно дешёвые так делают, когда сервер сидит в локальной сети, а порты по тарифу подбрасываются nat, т.е. Только разрешенные порты так работают
    Ответ написан
    Комментировать
  • Как из функции вытащить переменную?

    @rPman
    сделай $UserId global или передай в объект/массив (они по ссылке передаются), прописанный в use.

    учти что вызывается эта функция позже, когда приходит message, а значит и userid твой будет установлен позже
    Ответ написан