Ответы пользователя по тегу PHP
  • Как удалить пустые строки в CSV файле PHP функцией?

    @rPman
    осторожно, пустые строки в csv могут оказаться частью данных в строковых колонках, php fgetcsv корректно их обрабатывает а вот всякие упрощенные file и fgets ... нет

    правильно - написать приложение из 10 строчек типа такого:
    $r=fopen('filename.csv','r');
    $w=fopen('result.csv','w');
    while(!feof($r))
    {
      $row=fgetcsv($r,0,',','"'); // из-за 0 вторым параметром будет работать медленно, если знаешь максимальную длину строки в файле, пропиши ее тут с запасом
      if(empty($row)) continue;
      fputcsv($w,$row,',','"');
    }
    fclose($w);
    fclose($r);


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

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

    p.s. для тех кто не понял, \n внутри строк это часть стандарта
    escaped = DQUOTE *(TEXTDATA / COMMA / CR / LF / 2DQUOTE) DQUOTE
    Ответ написан
    Комментировать
  • Сurl выдаёт ошибку, что делать?

    @rPman
    "SSL certificate problem: self signed certificate in certificate chain"

    Запусти:
    curl -vvI https://api.telegram.org/
    и если ответ не будет что то типа
    * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
    * ALPN, server accepted to use h2
    * Server certificate:
    *  subject: CN=api.telegram.org
    *  start date: Mar 24 15:21:45 2022 GMT
    *  expire date: Apr 25 15:21:45 2023 GMT
    *  subjectAltName: host "api.telegram.org" matched cert's "api.telegram.org"
    *  issuer: C=US; ST=Arizona; L=Scottsdale; O=GoDaddy.com, Inc.; OU=http://certs.godaddy.com/repository/; CN=Go Daddy Secure Certificate Authority - G2
    *  SSL certificate verify ok.

    то поздравляю, ваш vps провайдер атакует ваши соединения атакой Man-in-the-middle

    p.s. более подробно сертификат сервера смотреть можно так:
    echo | openssl s_client -showcerts -servername api.telegram.org -connect api.telegram.org:443 2>/dev/null | openssl x509 -inform pem -noout -text

    выполни команду на надежной машине и на твоем vps и сравни вывод

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

    @rPman
    Отсортировать как обычно и транспонировать матрицу, (x,y) элементы которой это элемент в твоем массиве = x+y*количество_столбцов, транспонированная матрица будет соответственно y+x*количество_строк.

    т.е. тебе достаточно скопировать матрицу в новый массив используя для первого индекс как в первой формуле а для второй - как во второй соответственно.

    p.s. это не эффективный но самый понятный алгоритм.
    эффективный это просто перестановка элементов, пробегаясь по диагоналям итоговой таблицы
    Ответ написан
    Комментировать
  • Как отправить curl через Open Server на другой сайт который находится так же на open server?

    @rPman
    добавь отображение заголовков
    CURLOPT_HEADER, true
    возможно сервер там что-нибудь вернет полезное

    либо CURLOPT_VERBOSE, true тогда вся информация о запросе будет в stderr

    а еще посмотри что возвращает curl_getinfo и curl_error
    Ответ написан
  • Yii2 как сделать несколько сайтов с одной кодовой базой?

    @rPman
    За то, какой именно код будет запускаться на разных доменах, обычно отвечает веб сервер, смотри настройки в нем. Там на каждый домен своя секция конфига. Работать такие сайты будут совершенно независимо, т.е. база сессий у каждого своя, ну а настройки баз данных сам пропишешь в коде у каждого свой.
    Ответ написан
    2 комментария
  • Как декодировать файл в js?

    @rPman
    В приведенном коде, если ты уберешь base64_encode и оставишь только file_get_contents то код должен заработать

    Но вот так <?= вставляем огромный json ?> делать - страшный быдлокод, так делать не надо.

    Нормально, передавать файл простым http запросом без сериализации (пусть сам веб сервер его и отдает) а на клиенте получаешь файл простым ajax запросом

    вот тут документация и куча примеров по работе с бинарными блобами в браузере
    Ответ написан
    Комментировать
  • Как перенести данные из нескольких таблиц в одну?

    @rPman
    последовательно выполнить
    insert into new_table select from old_table
    если в таблице есть foreign key индксы ли другие constraint, которые могут препятствовать простому их копированию, то отключаешь их перед копированием (для innodb придется удалять и позже создавать заново, для myisam есть метод alter table ... disable keys)
    Ответ написан
    1 комментарий
  • Как посмотреть чем занят процесс (php-fpm сайта)?

    @rPman
    /proc/{идентификатор_процесса}/
    содержит кучу информации о процессе, например cmdline - команду запуска, а environ - переменные окружения, fd/... список открытых файловых дескрипторах выглядящих как симлинки на соответствующие файлы или сокеты

    на сколько я знаю, fpm передает подробную информацию о запросе в переменных окружения, так что смотри там

    p.s. формально ты можешь приаттачить отладчик gdb к процессу, но помним что это интерпретатор php, без отладочной информации понять будет что либо сложно
    Ответ написан
    Комментировать
  • Как сделать, чтобы изменения php.ini входили в силу?

    @rPman
    В конфигурационном файле php.ini изменил
    а в каком именно файле произвел изменения?
    в /etc/php есть каталоги по версиям и по apache/cli/... менять настройки нужно в правильном месте
    Ответ написан
    Комментировать
  • Как из статичного метода вызвать динамичный?

    @rPman
    Динамические методы при работе работают с экземпляром объекта (внутри это $this а снаружи эито то что перед '->'), а статические методы не имеют такого объекта и в таком случае нужно явно передавать его.

    В твоем случае например добавить в метод static exec параметр $this (кстати не называй это так, чтобы путаницы не было) либо завести статичную переменную и хранить в ней в виде массива (или последний созданный, в общем под задачу) все экземпляры объекта.

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

    @rPman
    у тебя 100 php файлов и в каждом ты определяешь переменные константой, с содержимым куски html?

    пишешь простейший парсер своих php файлов регулярными выражениями (например построчно, все что между '<<
    чуть более интересный способ, пишешь или берешь готовый поисковик по своему сайту (который собирает уже готовые страницы http запросами)

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

    @rPman
    Сохраняй идентификатор сессии session_id в базе данных с привязкой к пользователю (1 к М так как пользователь может авторизоваться с разных устройств), при необходимости отзыва доступа (смена пароля или пользователь пожелал) просто удали определенную по этому идентификатору
    session_id($sid);
    session_destroy();
    session_commit();

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

    кстати в настройках php можно указать как хранить сессии session.save_handler например redis или memcached, это значит централизованно и немного проще управляться
    Ответ написан
    Комментировать
  • Поддерживает ли PHP асинхронность на уровне ядра языка программрования?

    @rPman
    из коробки в php есть асинхронные методы работы с сокетами, метод socket_select позволяет создать event loop и вести асинхронную коммуникацию

    так же библиотека curl позволяет вести загрузку в фоновом режиме с помощью curl_multi_...

    используя штатные механизмы языка созданы библиотеки по типу ReactPHP с помощью которых можно создавать событийно-ориентированные приложения, например асинхронный websocket и http сервер в одном приложении. Если сравнивать с nodejs, где асинхронность 'из каропки' то реализация на php чуть медленнее но так каксам язык в большинстве случаев работает быстрее, в некоторых случаях код будет работать быстрее (например я писал простейший веб сервис, работающий со сжатыми gzip файлами 'построчно', так вот на nodejs было сильно медленнее, но сам event loop там быстрее)

    p.s. чтобы nodejs по скорости был сравним с php приходится осторожно выбирать какими методами пользоваться, например штатные объекты и массивы там медленнее чем класс Map
    Ответ написан
    4 комментария
  • Почему тормозит код записи в MySQL после разбивки его на функции?

    @rPman
    хоть один пример такой функции показал бы

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

    p.s. гугли - php профилирование вызовов функций
    Ответ написан
    1 комментарий
  • Как запустить php скрипт после ajax запроса?

    @rPman
    Вопрос немного не понятен.
    * Если задача в php скрипте как то отличить обычную загрузку страницы от запроса, то к запросу нужно добавить параметры, это нормальный способ, специально для этого созданный. Параметры могут быть добавлены напрямую в ссылку, это формат запроса http get (используется по умолчанию) или как дополнительные поля запроса http post, в любом случае метод ajax jquery все делает автоматически и достаточно указать данные в settings в виде массива key->value в параметре data
    * Если проблема в том что запрос выполняется параллельно загрузки данных браузером и может быть прерван принудительно браузером или при проблемах с соединением, то типичный способ - запускать свои задачи отдельным приложением (сервисом), с которым веб приложение (то что внутри index.php) должно как то общаться (обычно используют тот же http протокол но это не обязательно, например один из способов - оставить в базе данных задачу, список которых и будет мониторить это приложение). Способов тьма, написано куча решений, особенно когда речь идет о высоконагруженных задачах, но настоятельно рекомендуется решить подобную задачу самостоятельно, благо там нет ничего сложного.
    В данном решении должно появиться понятие задачи, у которой есть статусы новая, исполняется, завершена, ошибка,... а на стороне клиента это соответственно должно обрабатываться.

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

    @rPman
    linux запущен из wsl windows?
    что то похожее (точнее там была разница значений внутри linux контейнера из windows было странно разное)

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

    p.s. консольный php работает без кеширования
    Ответ написан
    6 комментариев
  • Какой есть инструмент для генерация pdf из html на стороне сервера?

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

    @rPman
    окончание искомой строки символ '/' либо конец строки ?

    универсально и просто - регулярные выражения, функция preg_match_all с регуляркой что то типа
    \/(category|product)\/([^/]+)
    Ответ написан
    Комментировать
  • Конвертация телепрограммы в json на php?

    @rPman
    Настоятельно рекомендую не работать с xml/json огромного размера, а размещать информацию в чем то более подходящем, например база данных, ее и обновлять удобнее и запросы делать проще

    По вопросу, использовать нужно потоковые парсера, которые не загружают xml в память а обрабатывают элементы подряд, например xmlreader
    Ответ написан