Ответы пользователя по тегу PHP
  • Как настроить Debug режим, если исходники лежат в Docker?

    Tyranron
    @Tyranron
    У Вас в конфиге Xdebug указан порт 9001.
    xdebug.remote_port=9001

    А в контейнере этот порт у Вас выставлен наружу через expose.
    expose:
          - "9000"
          - "9001"

    Документация ясно говорит что в этом случае порт доступен только другим сервисам из docker-compose.yml.
    Expose ports without publishing them to the host machine - they’ll only be accessible to linked services.


    PHPStorm'а в docker-compose.yml не видно, а значит он и не может видеть Xdebug на том порту, что Вы ему скармливаете.

    Что нужно сделать?
    1. Перенести порт 9001 в ports:.
    2. В настройках IDEA указать Host: localhost для Xdebug (сейчас у Вас там какой-то левый IP).
    Ответ написан
  • Как установить imagick для PHP7.1 (docker, alpine)?

    Tyranron
    @Tyranron
    В таких случаях через sub-shell можно скормить команде то, чего просит.
    Например:
    # Install Xdebug
    RUN apk add --update --no-cache --virtual .tools-deps \
                autoconf g++ libtool make \
     && (yes | pecl install xdebug) \
     && apk del .tools-deps \
     && rm -rf /var/cache/apk/*
    Ответ написан
    2 комментария
  • Можете помочь с одним регулярным выражением?

    Tyranron
    @Tyranron
    Вы можете дополнить регулярку своей логикой в PHP.
    function replaceSpacesWithTabs($line, $perTab = 2)
    {
        return preg_replace_callback('/^[ ]+/', 
            function ($matches) use ($perTab) {
                $len = strlen($matches[0]);
                $out = str_repeat("\t", floor($len / $perTab));
                if (($rem = $len % $perTab) > 0) {
                    $out .= str_repeat(' ', $rem);
                }        
                return $out;
            },
            $line
        ); 
    }

    Потыкать можно здесь.

    На решение чисто регуляркой, по моему мнению, не тянет. Но применить можно вполне себе.
    Ответ написан
    Комментировать
  • Зачем в PHP нужна рефлексия?

    Tyranron
    @Tyranron
    Еще с помощью нее делают удобние IoC-контейнеры, например, в Laravel.
    А еще она позволяет тестировать private методы классов напрямую.
    В общем-то, дальше дело фантазии, рефлексия всего лишь позволяет программе отслеживать свою структуру и поведение во время выполнения.
    Ответ написан
    2 комментария
  • Как отправить из textarea форматированный текст?

    Tyranron
    @Tyranron
    nl2br() для сохранения переносов.

    И htmlspecialchars(), чтобы корректно отображалось, если туда будете писать теги.
    Ответ написан
    1 комментарий
  • Как объединить массивы?

    Tyranron
    @Tyranron
    Пока писал, Вы двигались в том же направлении =) .
    Вот такой велосипед:
    function array_merge_sorted($first, $second)
    {
        $out = [];
        for (
            $f = 0, $s = 0,
            $firstLength = count($first),
            $secondLength = count($second);
            $f < $firstLength || $s < $secondLength;
        ) {
            if (!isset($first[$f])) {
                $out[] = $second[$s];
                ++$s;
            } elseif (!isset($second[$s])) {
                $out[] = $first[$f];
                ++$f;
            } elseif ($first[$f] > $second[$s]) {
                $out[] = $second[$s];
                ++$s;
            } else {
                $out[] = $first[$f];
                ++$f;
            }
        }
        return $out;
    }

    По времени: 1 проход по первому масиву + 1 проход по второму массиву.
    По памяти: 1 размер первого массива + 1 размер второго массива, лишних аллокаций нет.
    Ответ написан
    4 комментария
  • PDOStatement::bindParam - почему не получается биндить через foreach?

    Tyranron
    @Tyranron
    Потому, что нужно читать документацию:
    В отличие от PDOStatement::bindValue(), переменная привязывается по ссылке, и ее значение будет вычисляться во время вызова PDOStatement::execute().
    Ответ написан
    1 комментарий
  • Что быстрее: обработка данных на pgsql или php?

    Tyranron
    @Tyranron
    На pgsql будет быстрее, естественно, но для системы в целом - базу лучше не нагружать лишней работой, которую можно выполнить и так.
    Ответ написан
    Комментировать
  • Правильно составить .htaccess?

    Tyranron
    @Tyranron
    Исключить реально существующие папки и файлы можно добавив для правила 2 условия:
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([_a-zA-Z0-9]+)$ /system/page/profile.php?username=$1 [L,QSA]
    Ответ написан
    Комментировать
  • Автоматическое форматирование отступов в ассоциативных массивах в PHPStorm

    Tyranron
    @Tyranron
    PHPStorm 7
    Preferences (или Settings) > Секция Project Settings > Пункт Code Style > Подпункт PHP > Вкладка Other > Чекбокс Align key-value pairs
    Ответ написан
    1 комментарий
  • Как сделать выборку одной случайной записи MySQL?

    Tyranron
    @Tyranron
    Если выбрать одну, то вполне можно:
    SELECT * FROM `ex4` WHERE %условие% ORDER BY RAND() LIMIT 1

    Если нужно несколько, то такой подход не рекомендуется ибо RAND() сильно садит производительность запроса.
    Ответ написан
  • Как лучше изменить структуру массива в php?

    Tyranron
    @Tyranron
    function zip($tuple_of_lists)
    {
        $list_of_tuples = array();
        foreach($tuple_of_lists as $key => $list) {
            foreach($list as $i => $value) {
                $list_of_tuples[$i][$key] = $value;
            }
        }
        return $list_of_tuples;
    }
    
    $data = array_map('zip', $data);

    Try here
    Ответ написан
  • Какая технология лучше для comet-сервера: tcp sockets, websockets или long polling?

    Tyranron
    @Tyranron
    Если клиент на flash, то не вижу проблем использовать стандартные tcp sockets, это ведь не js в браузере и никто не запрещает.
    Сервер, как на меня, лучше сделать на node.js, чем на php, так как у последнего изначально иная природа (хоть и есть всякие php-daemon). Если будут какие-то тяжелые вычисления на сервере, то с node.js можно их пробрасывать на тот же php, дабы не грузить node.js (она однопоточная, не забываем об этом).
    В качестве альтернативы также могу посоветовать использовать Go. Сервер на нём пишется не медленнее, чем на node.js, он может работать не только в одном потоке, потому тяжелые вычисления, в принципе, можно и не выносить за пределы. Компилируется. А также гораздо богаче инструмент для асинхронных взаимодействий прямо на уровне языка, а не библиотек.
    Ответ написан
  • Как реализовать ленту новостей для социальной сети?

    Tyranron
    @Tyranron
    Ну, join'ить это дело можно (подозреваю что там ещё и union'ом прийдётся заливать), но так обычно не делают, потому что это решение потом невозможно будет отмасштабировать. Запрос тяжелый, кеширование поможет плохо, так как активность большая и кеш часто сбрасываться будет и база будет дергаться не многим меньше, ну и если базу надо распилить на 2 и больше серверов, то останемся лапу сосать с join'ами.

    Для начала можно сделать так - для конкретного `user_id` (владелец новостной ленты):
    1) Первым запросом стягиваем айди всех друзей
    2) Вторым запросом стягиваем айди всех групп, в которых состоит
    3) Третьим запросом стягиваем из comments все записи WHERE `user_id` IN (группы + друзья) ORDER BY/LIMIT по вкусу.

    Преимущества:
    Меньшая нагрузка на базу, она будет делать меньше дорогостоящих операций с временными таблицами. По индексам быстрее будет отдавать результат.
    Первые 2 запроса можно спокойно закешировать, так как добавляются/удаляются друзья гораздо реже, чем сами посты. Потому по сути сводится всё к одному запросу на сами посты без join'ов.

    Минусы:
    Больше кода на обработку 3х запросов. Чуть более длительное выполнения скрипта, что, в принципе, не будет ощущаться пользователем, и вообще будет не справедливо, если первые 2 запроса кешировать.

    Но если стоит задача масштабироваться, то и такого подхода к делу недостаточно. Там уже надо будет скорее всего жертвовать лишним местом, чтобы сократить расходы на собирание размазанных данных по всем серверам баз, например, вести отдельную таблицу ленты новостей для каждого пользователя, которая будет агрегировать все необходимые айдишники.
    UPD: ...как и указал @jarvis
    Ответ написан
    4 комментария
  • Что не нравится php в скрипте при обращении к массиву?

    Tyranron
    @Tyranron
    Проверьте, возможно "M" или "E" или в коде, или снаружи прилетают, не латиницей, а кириллицей, из-за чего интерпретатор их считает разными строками, хотя для человека на вид они одинаковы. Других причин для бага не вижу.
    Ответ написан
  • Присвоение индексов строкам в таблице

    Tyranron
    @Tyranron
    UPDATE `board`
    SET `position`=`position`+1
    WHERE `position`>='$myPosition' AND `id`<>'$myID'

    Хотя я не вижу смысла делать отдельно поле для позиции. Этим самым Вы только мороки себе добавляете, так как нужно синхронизировать 2 поля, которые по сути означают одно и то же - место игрока в рейтинге. Достаточно `id` и `scores`. При выборке делаете ORDER BY `scores` ASC/DESC и уже в PHP проставляете порядковые номера по ходу разбора результатов запроса. Если нужна позиция по конкретному `id`, то:
    SELECT COUNT(`b`.`id`) AS `position`
    FROM `board` AS `b` JOIN `board` AS `my`
    ON(`b`.`scores`>`my`.`scores` OR (`b`.`scores`=`my`.`scores` AND `b`.`id`<`my`.`id`))
    WHERE `my`.`id`='$myID'

    ...если одним запросом, но лучше 2мя: сначала выбрать кол-во очков для конкретного `id`, потом посчитать позицию исходя из `id` и очков.
    Лучше увеличить сложность выборки, чем обновлять пол-таблицы каждый раз.
    Ответ написан
    2 комментария
  • Как отправить HTTP запрос методом POST на URL через PHP?

    Tyranron
    @Tyranron
    Действительно, за время, которое потратили на создание вопроса, Вы могли без проблем найти интересующую Вас информацию в любом поисковике.

    Но раз вопрос уже задан, то должен быть и ответ(ы).
    Собственно, @OnYourLips дал ссылку на хороший фреймворк, но если нет смысла тащить в проект/скрипт целый фреймворк ради одного запроса, к примеру, то логичнее воспользоваться упомянутым CURL. В Вашем случае сценарий использования CURL будет выглядеть примерно следующим образом:
    $myCurl = curl_init();
    curl_setopt_array($myCurl, array(
        CURLOPT_URL => 'http://target.site.com/form.php',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => http_build_query(array(/*здесь массив параметров запроса*/))
    ));
    $response = curl_exec($myCurl);
    curl_close($myCurl);
    
    echo "Ответ на Ваш запрос: ".$response;

    Если надо передать при этом ещё и файлы, или обратиться по https, или ещё чего Вам понадобится - добро пожаловать в документацию:
    http://php.net/manual/ru/book.curl.php
    Советую обратиться к документации в любом случае, дабы ознакомиться со всеми возможными нюансами, а также понять и выбрать то, что конкретно Вам потребуется для решения Вашей задачи.
    Ответ написан
    3 комментария