• Как удалить последнюю строку txt файла средствами php?

    @smple
    Грязный способ, но должен удалить последнюю строку.
    $file = file_get_contents('test.txt');
    
    $exploded = explode(PHP_EOL, $file);  // вместо PHP_EOL символ конца строки
    unset($exploded[count($exploded) - 1])
    $file = implode(PHP_EOL, $exploded);   // вместо PHP_EOL символ конца строки
    
    file_put_contents('test.txt', $file);
    Ответ написан
  • Есть ли в php пулл соединений к БД?

    @smple
    Есть такой флаг как persist connection php.net/manual/ru/features.persistent-connections.php его использовать я бы не советовал, для разных баз оно создается по своему.

    Также есть различные версии драйвров для разных баз и некоторые вполне могут не закрывать за собой подключения а кэшировать его, например для Mysql есть два драйвера limysql (стандартный) и mysqlnd, реализация которого в драйвере может отличатся, но апи для вас одинаковые, тут все зависит от драйвера и надо рассматривать конкретную реализацию
    Ответ написан
    Комментировать
  • Как ставить между двумя массивами неизвестный математический знак?

    @smple
    можно это сделать с помощью eval конечно, но такой способ я не рекомендую, вот так например
    <?php
    $a = 5;
    $b = 6;
    $c = '+';
    
    echo eval("return $a $c $b;");

    Более правильно сделать интерфейс OperationInterface и для каждого действия сделать свою реализацию (например OperationPlus, OperationMinux, OperationMultiply и тд)
    Ну соответсвенно сделать выбор нужную реализацию, это по сути будет паттерн стратегия https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D...

    Как еще один вариант можно просто сделать массив функций, которые будут принимать аргументом два параметра и делать операцию вот так:
    <?php
    $a = 5;
    $b = 6;
    
    $operation = [];
    $operation['+'] = function ($a, $b) {
        return $a + $b;
    };
    $operation['*'] = function ($a, $b) {
        return $a * $b;
    };
    // тд на все варианты
    
    $c = '+';
    echo $operation[$c]($a, $b) . PHP_EOL;
    
    $c = '*';
    echo $operation[$c]($a, $b) . PHP_EOL;
    Ответ написан
    4 комментария
  • Стоит ли передавать в исключения дополнительную информацию?

    @smple
    не проще ли в тексте исключения указывать `Name` is unknown column (вместо Name указывать имя колонки что не нашлось)
    Получается в классе где создается исключение определяется неверная колонка и текст сообщения говорит что в таком то месте обращение идет к такой то колонке, которой нет в бд, текст всего запроса видеть не надо.

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

    @smple
    Вот так:

    <?php
    
    $p_url = $_POST['p_url'];
    $url = 'https://site.ru/?url='.$p_url.'';
    
    $result = file_get_contents($url);
    echo json_decode($result, true)['media_id'];
    Ответ написан
    3 комментария
  • Composer autoload как работает?

    @smple
    он подгружает только то что требуется в коде
    там загрузчик добавляется через php.net/manual/ru/function.spl-autoload-register.php
    Ответ написан
    Комментировать
  • Как на php пересохранить html-файл в UTF-8?

    @smple
    с помощью php.net/manual/ru/function.mb-convert-encoding.php

    например:
    $value = file_get_contents('path');
    $result = mb_convert_encoding($value, 'целевая кодировка в твоем случае utf8 найди название под каким она на сервере', 'из какрой кодировки, опять же имя лучше взять как в ОС она называется');
    file_put_content('путь для результата', $result);


    эта штука использует mb string его надо поставить отдельно php.net/manual/ru/book.mbstring.php обычно в debian based apt install php-mbstring
    Ответ написан
    1 комментарий
  • Как найти соседние объекты зная x и y?

    @smple
    Необходимо найти расстояние между каждым объектом и целевым.
    Расстояние определяется по формуле (легко гуглится) sqrt(sqr(x2 - x1) + sqr(y2 - y1))
    Где sqrt - корень квадртаный, sqrстепень в квадрате (2), x1,y1 кооординаты точки(объекта целевого) x2,y2 координаты остальных точек.
    Далее отсортировать полученные результаты по возрастанию и результат будет в массиве по порядку с начала.
    Ответ написан
    4 комментария
  • Как улучшить архитектуру сервиса отложенных задач?

    @smple
    Создать консольное приложение с бесконечным циклом.
    Которое ждет наступление следующего события, как только оно наступает оно делает http запрос и берет следующее событие.

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

    Технологии для написания демонов https://daemon.io/ или reactphp.org можно еще почитать про создание демонов на php, но для этой задачи php не лучший язык, задача небольшая можно реализовать на чем угодно.
    Ответ написан
  • Как вывести массив в twig?

    @smple
    {{result[1]['name']}}

    но в твоем случае лучше использовать цикл for. twig.sensiolabs.org/doc/tags/for.html
    Ответ написан
    Комментировать
  • Как лучше использовать инфраструктурный код?

    @smple
    Указанные тобой варианты имеют право на существование, также я бы дополнил список
    5. использовать Proxy объект
    6. Использовать di и на основе настроект di подсовывать реализацию и параметры из конфигов

    Например у твоего MailServer есть interface MailServerInterface от который будет использоваться тобой везде, у тебя есть эталонная реализация MailServer и тебе надо сделать логирование методов.
    ```php
    MailServerProxy implements MailServerInterface {
    public function __construct (LoggerInterface $logger, MailServerInterface $server) {
    $this->setLogger($logger);
    $this->setMailServer($server);
    }
    public function __call($name, $args) {
    $this->logger->info('called method ' . $name);
    return call_user_func_array([$this->mailServer, $name], $args);
    }
    }
    ```
    Примерный шаблон кода.

    Тогда там где нужен MailServerInterface его будет создавать di, а уже di в зависимости от настроек системы будет создавать зависимости, например если надо логировать, то будет создавать MailServerProxy которому аргументами нужен Logger(тут любые параметры могут быть) и MailServer (а ему нужны аргументы $host, $login, $password которые в конфиге лежат и их читать будет di)

    А в случае если логирование не нужно станет, достаточно в настройках di при запросе MailServerInterface создавать MailServer сразу, ну или использовать NullLogger какой нибудь который ничего не пишет.

    также есть еще аспектно ориентированное программирование https://github.com/goaop/framework
    но оно работает медленнее так как надо прочитать анотации через reflection но тоже может быть не плохо.
    Ответ написан
    Комментировать
  • Как хранить массивы обьектов в свойстве другого обьекта?

    @smple
    я обычно использую array для хранения, а в class Product указываю анотации что я там храню
    например
    class Product
    {
    /**
     * @var Path[]
     */
    private $someProperty
    /**
     * @var AnotherClass[]
     */
    private $someProperty2
    }

    тогда имею в ide автокомлит например внутри циклов

    Также для хренения коллекций есть SPL php.net/manual/ru/book.spl.php соответственно можно выбрать структуру данных и раньше даже было преимущество в скорости но сейчас бенчмарков нет и сказать наперед сложно, и проблема с автокомлитом в ide будет так как нет поддержки generic.
    Ответ написан
    Комментировать
  • Что не так с моими тестами на PHP?

    @smple
    после добавления записи с psr может ты забыл сделать composer update ?
    выложи файлы:
    autoload_classmap.php
    autoload_namespaces.php
    autoload_psr4.php
    autoload_real.php

    посмотри там объявлены ли твои namespace и где их композер ищет.
    Ответ написан
    Комментировать