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

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

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

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

    Напомню, что исторически php - это язык для написания шаблонов html документов ;) возьмите это за основу. Еще напомню, что уже давным давно файлы эксель (да и open document на то пошло, лучше его реализовывать) - это zip архив с xml и xls файлами, описывающими итоговый документ, они текстовые, имеют строгий формат и легки для генерации и обработки.

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

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

    так что не майтесь дурью, zip поддерживается везде, чуть ли не по умолчанию, передавайте одним файлом.
    Ответ написан
    2 комментария
  • Как запоминать последний визит пользователя?

    @rPman
    Судя по всему проблема кроется не в записи в базу данных, а в том, когда и как часто вы это делаете.

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

    Правильный подход - клиентское приложение открывает и держит открытым сетевое соединение (websocket например, все браузеры поддерживают, ну а приложения могут сами ниже уровнем tcp использовать), в этом случае приложению так или иначе придется отсылать в это подключение ping пакет (keep alive таймаут) но в этом случае закрытие приложение пользователем будет отловлено в тот же миг по закрытию сетевого подключения, т.е. в базу данных на сервере не нужно ничего писать, бакэнд сможет по списку открытых подключений все сказать сам.

    Да, если у пользователя смартфон - то в момент ухода в сон или из-за проблем с сетью (смена базовой станции при движении или просто рукожопство ОпСоС-ов) соединение тоже может закрыться или наоборот подвиснуть и в пределах таймаута выдавать неверную информацию (т.е. человек приложение закрыл а сервер это не отловил) но окно ошибки в этом случае будет тот же таймаут, что был бы в первом неправильном способе.
    Ответ написан
    3 комментария
  • Как временно хранить информацию?

    @rPman
    Храните в памяти, в переменных или вам нужно слишком много или нужно хранить между запусками скриипта (например между разными запросами)?

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

    Существуют in memory database, начиная со старейшего memcache. Попробуйте redis.
    Ответ написан
    Комментировать
  • Как создать независимый цикл, который смог бы передавать данные в сокет, когда в цикле появляются данные, без остановки сокета на прием соединения?

    @rPman
    Если хотите все сами пилить, смотрите метод socket_set_nonblock переключа.ющий сокеты в неблокирующий режим и с помощью socket_select следить, какой из ваших сокетов выдал данные.
    Ответ написан
    1 комментарий
  • Как спарсить src iframe?

    @rPman
    Старейший парсер библиотека на php: https://simplehtmldom.sourceforge.io
    Ответ написан
    Комментировать
  • С чего начать сайт для локалки?

    @rPman
    Начните с ТЗ. Любая работа должна начинаться с нормальной постановки задачи. Фраза хочу все объединить ни о чем не говорит. Если так поставить задачу, разработчик шутник просто соберет все ваши скрипты на одну страницу ;) обычным объединением (.е. максимум работа, изоляция переменных в коде) само собой вам скорее всего этого не надо. Вот и начните с того что сядьте и подумайте, что вы хотите видеть как пользователь результата. Рисуйте (просто описанием текстовым тоже покатит) какими вы видите страницы с примерами, определите бизнеслогику и т.п.
    Ответ написан
    Комментировать
  • Почему если в php сложить число и текст, то выведется только число. Текст и число, то все равно только число?

    @rPman
    Плюс в php всегда возвращает число. Если хотите объединение как строк, используйте оператор точка '.'.
    echo 123.'xxx'.987;

    Осторожно так как точка ещё и десятичный разделитель

    ещё неплохой вариант использовать автоматическую подстановку значений переменных, если строка в двойных ковычках то $ в строке обрабатывается с заменой на заявление переменной.
    $xyz='asd';
    echo "\$xyz='$xyz'";

    выведет
    $xyz='asd'
    Ответ написан
    Комментировать
  • Как остановить экспортирование файла, если процесс экспорта уже запущен?

    @rPman
    Что у вас за вебсевер? В настройках сервера можно определить, сколько одновременно запросов он может обрабатывать, а некоторые (например встроенный в php по ключу -S ) и вовсе умеют только один поток, остальные запросы в этот момент ждут.

    Правильное и универсальное решение - вынести длительные задачи в сторонний сервис/процесс, запускаемый независимо (например php-cli запускаемый с помощью services а во время отладки просто в консоли или screen). Совсем правильно - организуйте ваш сервис в виде приложения с использованием например reactphp (websocket сервер например и проксируйте его через ваш веб сервер), при этом организуйте работу полностью асинхронно (есть методы для асинхронной работы со всем включая работу с файлом, т.е. ваш цыкл будет выглядеть как метод, который указан в качестве вызова успешной записи в файл для записи следующей порции данных)

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

    @rPman
    В вашем случае, даже если числа float, где то нужно хранить 15 000 000 * 500 000 * 4 = 30 000 000 000 000 это 30 терабайт. Это просто линейный блоб, файл в формате 4 байта на число. И это без индексов (они появятся когда вам понадобятся поисковые запросы по выборкам). Не вздумайте брать универсальные базы данных, у вас узкая специализация и практически любое другое готовое решение будет требовать от вас плату либо местом либо процессорным временем.

    Никуда от этих чисел вам не деться!.

    3 минуты на последовательность умноженные на 15 миллионов штук - это приговор, 31тысчу cpu дней, это вам кластер из тысячи процессоров надо на месяц загружать, и хорошо если можно использовать gpu (это может позволить одной машине делать не десяток вычислений а сотни за раз), тогда обойдетесь десятком инстансев амазона и за пару тройку недель посчитаете.

    Поверьте, стоимость места в данном случае настолько мизерная что даже смешно ;)

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

    Отличный пример, вам нужно посчитать матрицу якобиана для нейронной сети, изменяя значения весов по одному +e и -e. Т.е. нужно вычислить матрицу N*N чисел где N - количество весов в нейронной сетию Если решать задачу в лоб, это значит нужно O(N^3) вычислений - это дико много. Но, так как для каждого числа из матрицы в нейронной сети меняется только один вес, то почти в половине случаев вычисления веса будут использовать одни и те же числа (особенно если вес изменился в сети близко к ее концу) а значит если хранить промежуточные значения вычислений, можно их опускать. На практике хранить ВСЕ на постоянной основе не по требуется, достаточно используя знания в каком порядке идут вычисления (не важно в каком она будет считаться, пусть например с конца) можно рекурсивно считать нейронную сеть, храня эти промежуточные значения в стеке. Трудоемкость конечно все равно останется большой где то порядка O(N^2*log(N)*...) но за ускорение будет небошая плата в N*log(N) памяти
    Ответ написан
    1 комментарий
  • Как выполнить этот код на PHP?

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

    Нажмите F12, выберите закладку network, включите логирование (страница перегрузится), отправьте файл на сайт (что там у вас форма постинга сообщений?) и старательно изучите лог network, на нужной записи нажмите правую кнопку и выберите в меню Copy - Copy as curl.

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