Задать вопрос
Ответы пользователя по тегу PHP
  • Как результат вызова команды php exec поместить в переменную или файл?

    @rPman
    Потому что это stderr и его перехватить можно либо с помощью пайпов и proc_open либо меняйте командную строку запуска nodejs так чтобы она возвращала ошибки в стандартный вывод или куда вам удобно простым перенаправлением в файл:
    exec("capture-website https://yandex.com --output=img.jpg 2>capture-website.err", $out);
    $err_str=file_get_contents('capture-website.err');
    Ответ написан
    Комментировать
  • Как лучше сравнить два файла изображения?

    @rPman
    В http стандарте есть заголовки, отвечающие за размер и время изменения файла
    посмотрите на ваш файл в своей программе или с помощью утилит curl -I http://.... сам файл при этом не загружается.

    Такие заголовки как Content-Length или Date или ETag, не всегда они есть но если они есть и изменились - значит файл изменился, иначе загружать весь не обязательно.
    Ответ написан
  • Как добавить файл на раздачу в торрент из php?

    @rPman
    создаете штатной command line утилитой mktorrent (идет с почти любым linux, например debian/ubuntu)
    а уже после добавляете его в любой торрент клиент с помощью web api
    Ответ написан
    Комментировать
  • Почему curl php последующие страницы ретранслирует на основной сайт?

    @rPman
    Универсального ответа нет но в большинстве случаев, с осторожностью, достаточно в файлах html и возможно javascript заменить простой заменой все вхождения site.ru на ваш домен

    т.е. перед curl_close($ch); проверяйте заголовок, тип данных curl_getinfo($ch, CURLINFO_CONTENT_TYPE); и в зависимости от типа заменяйте содержимое тела.
    Ответ написан
  • Как разместить сервер на php?

    @rPman
    Не пользоваться хостингом VDS, всеравно react на нем не поднимете.

    Вам нужна полноценная машина Dedicated Server либо виртуальная VPS.

    Чтобы вы не сделали, в настройках веб сервера всегда можно указать, какие каталоги показывать как файлы, какие пытаться исполнить как php а какие вообще не показывать. Это и называется - правильно настроить веб сервер.

    React приложение не должно вообще как то размещаться в каталогах открытых веб сервером, так как оно само является веб сервером, зачастую доступ к нему проксируют от основного веб сервера но это не обязательно просто рекомендовано.
    Ответ написан
  • Как уменьшить SQL нагрзку?

    @rPman
    Вы закачиваете ВСЮ таблицу и построчно анализируя ее делаете апдейты по одной строчке, тут поплохеет любому серверу. Во первых почти наверняка всю логику можно просто засунуть в запрос, так как там проверки по простому условию на дату. Во вторых, я не изучал код, если это сложно реализовать в sql, то хотя бы не делайте update по одной записи, собирайте id необходимых записей и обновляйте пакетом либо через временную таблицу либо через инлайн данные тупо через where id in (список id)

    p.s. не пытайтесь везде работать с датами как дата в виде строки, это всегда неудобно, половина кода у вас парсинг строки с датой... работайте с __int64 date timestamp, зачастую это самый удобный тип данных.
    Ответ написан
    1 комментарий
  • Можно ли как-то считать несуществующие элементы массива равными 0?

    @rPman
    если ключи числовые то обычный for($i=0;$i<размер;$i++) ...
    Ответ написан
    Комментировать
  • Какой есть рабочий вариант PHP7.4+Oracle8?

    @rPman
    https://www.php.net/manual/en/ref.pdo-oci
    https://www.php.net/manual/ru/oci8.requirements.php

    там в требованиях веселая чехарда с версиями библиотек и клиента, но теоретически возможно.

    Могу предложить попробовать разнести (если сейчас не так) на разные машины (конечно виртуалка/докер) сервер и клиент для php, так как инсталлятор oracle может плохо обрабатывать такие ситуации.

    p.s. если не сумеете побороть, пилите прослойку, благо работы на вечер, т.е. буквально http (или даже websocket) сервер на самом php (осторожно с многопоточностью) старой версии работает исключительно для выполнения запросов и сериализацию ответа. Накладные расходы конечно будут (не обязательно большие) но дальше уже вопрос что вам важнее - затраты на разработку или затраты на железо и главное у вас будет возможность подправить эту прослойку для оптимизации.

    Не уверен но есть шанс что данная прослойка уже существует (http => sql), ищите.
    Ответ написан
    Комментировать
  • Как сделать выдачу другого сервиса на своем сайте?

    @rPman
    При активном противодействии целевого сайта - очень сложно и в общем случае никак. Если целевой сервис не против и даже сотрудничает с вами, то смотреть на api запросы, которые используются сервисом (в идеале это могут быть ajax get/post), добавив ваш сайт в настройки целевого Cross-Origin Resource Sharing (CORS).
    Про причину проблемы читать - Cross Site Request Forgery (CSRF).

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

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

    @rPman
    потому что не вставляешь внутри первого цикла foreach
    Ответ написан
  • Php! или === null?

    @rPman
    Если есть возможность, меняйте тип возвращаемого значения, т.е. зоведите специальный класс Error и после вызова проверяйте тип результата.

    Еще есть практика выноса статуса ошибок из возвращаемого значения, так как ошибки бывают разные и требуют разной ответной реакции, с помощью исключений - классов потомков Exception

    В этом случае каждый вариант ошибки должен быть отловлен в своей секции catch а вызов в try (саму ошибку инициализировать с помощью throw).
    Ответ написан
  • Можно ли в PHP определить сколько аргументов требует функция?

    @rPman
    Из вне контекста определить количество параметров нельзя, потому что с 5.6 версии появилась поддержка переменного количества аргументов variadic functions

    Внутри можно - func_num_args

    p.s. так что лучший вариант - парсить исходники
    Ответ написан
  • Пагинация комментариев (одна страница). Как решить проблему после удаления/добавления комментов?

    @rPman
    Постраничная навигация должна быть не по номерам страниц, а номерам первых комментариев на очередной странице, т.е. в идентификаторе в url должен быть именно этот идентификатор а не номер страницы. При получении несуществующего 'первого' комментария, делать поиск по ближайшего наибольшего id (select ... where id > @current_page_id limit 1), то потребует инкрементального id (а так все и делают) это значит и сортировку комментариев на странице делать можно по нему, и вообще выборку.

    Недостатки - сложно получить N-тую страницу, так как придется перебирать всю базу, но обычно никто не заморачивается с этим и обходятся первые M страниц, затем многоточие, затем ссылка на последнюю и количество страниц считать от общего количества комментариев.
    Ответ написан
    2 комментария
  • Как сделать так, чтобы php не записывал строку в файл, если она уже есть?

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

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

    @rPman
    Без цикла можно использовать array_reduce только массив отреверсить
    $a=['key1','key2','key3'];
    $value='test';
    $r=array_reduce(array_reverse($a),function($c,$i) use ($value) {return [$i=>(is_null($c)?$value:$c)];});
    var_dump($r);
    Ответ написан
    Комментировать
  • Ретрансляция m3u8, возможно?

    @rPman
    C вероятностью 99.(9)% ваш .m3u8 это набор статический файлов-кусочков видео (откройте этот файл в текстовом редакторе это простой плейлист текстовый), загрузите их на свой сервер разом и создайте свой .m3u8 со своим url.

    Если же содержимое стрима динамическое то уже сложнее. гуглить m3u8 stream proxy, есть опенсорс мини проекты для этого.
    Ответ написан
  • С чего начать делать сайт если никогда не писал для web?

    @rPman
    Для изучения WEB вам нужно начинать с HTML.

    Затем изучение разделяется на минимум три направления - бакэнд (то что крутится на сервере), фронтэнд (то что работает у клиента в браузере) и верстка (изучение HTML и CSS чтобы страница в браузере, причем на всех, включая мобильные и десктопные разных ОС, выглядела как хочется а не как получится). Бакэнд и фронтэнд фактически преследуют одну цель - формировать HTML (в т.ч. динамически изменяемый от действий пользователя).

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

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

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

    @rPman
    var_export выдаст строку в формате PHP, добавляйте впереди что то типа $x=, сохраняйте в файл с расширением .PHP и подключайте прямо в код include.

    Это самый быстрый способ инициализации больших структур и массивов которые редко меняются, с оговорками и объектов.

    p.s. ещё есть serialize/unserialize и json_encode/json_decode, они чуть медленней но для своих случаев удобнее.
    Ответ написан
    Комментировать
  • Проверить на пустоту переменные?

    @rPman
    Правильно - проверять и обрабатывать ошибку в момент получения данных (они могут приехать частично, например)

    json - это строка, преобразуем его в объект json_decode, если вернули NULL - is_null($result)!==true то значит json не валидный (пустой или не до загружен).

    Если все же нужно проверять именно внутри объекта наличие значения, то есть метод isset($data['value']) или isset($data->value), если в json_decode был второй параметр false.
    Ответ написан
    3 комментария
  • Два вопроса: как настроить постоянный онлайн в облаке и перехват fatal ошибок php?

    @rPman
    Вам нужно работу выполнять не в скрипте, запускаемом браузере, а отдельно запускаемом вами, в идеале в виде службы (в windows это делается средствами планировщика задач или программ типа srvstart или anyservice, уже нет таких либо 10-ку не поддерживают, не задавался никогда такими глупостями).

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

    Чтобы после фатальной ошибки ваша программа снова была перезапущена - запускайте ее в бесконечном цыкле из другого процесса, хоть на том же php или cmd:
    @echo off
    :loop
    php main.php
    goto :loop
    приведенный пример кривой, не умеет отслеживать причину ошибки и советую между запусками вставить хотя бы 1 секундную паузу, чтобы не за-ддосить вашу базу данных или еще какой глюк не словить из-за слишком частых запросов, но как пример показывает что к чему. Но это приложение не должно быть слишком умным, чтобы не допустить и в нем ошибки и фатальные случаи.

    Ваш сервис долгой обработки должен при запуске попытаться понять, первый это его запуск или после фатальной ошибки, и что делать.

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