Ответы пользователя по тегу PHP
  • Переход с PHP на …?

    Stdit
    @Stdit
    Если надоел PHP и вообще такой подход (запустился-выполнился-умер), хочется чего-то свежего и концептуально другого, я бы порекомендовал Nodejs. Особенно интересно становится при использовании вебсокетов через socket.io. По поводу xslt не могу ничего сказать, не было такого опыта, но библиотеки соответствующие имеются.
    Ответ написан
    Комментировать
  • Сортировка и выборка в MySQL

    Stdit
    @Stdit
    Скорее всего запускается фулскан, потому что не находит правильного индекса. Что говорят EXPLAIN запросов? И это, я надеюсь, $counthis[posid] эскейпится перед вставкой в строку запроса, а то выглядит опасно.
    Ответ написан
    6 комментариев
  • Как изучить/разобраться в чужом PHP коде?

    Stdit
    @Stdit
    Схему вызовов функций и методов классов неплохо делает xhprof. Правда, он предназначен скорее для выявления узких мест, но его графы вызовов очень облегчают понимание механизма работы фреймворка.
    Ответ написан
    Комментировать
  • Использование тернарного оператора ?: с подавлением ошибки?

    Stdit
    @Stdit
    Неудивительно, что вас смущает использование «собаки», нутро верно подсказывает, что это — умалчивание ошибки и во многих случаях используется как костыль. А isset, empty и is_null — это очевидная логика, причем разная, и более чистый и понятный код. Я бы рекомендовал забыть что «собака» вообще существует, пока нужда остро не прижмет в каком-нибудь стареньком проекте.
    Ответ написан
    4 комментария
  • Как эмулировать браузерный запрос к google при помощи cURL?

    Stdit
    @Stdit
    Гугл ведь неспроста блокирует запросы от скриптов, и проверяет их капчей, поэтому нужно доказать ему, что ваш скрипт — не бот (распознать капчу). Я замечал, что он это делает, когда запрашиваемые слова не связаны морфологически и идут массово с одного адреса (который, к тому же, наверняка принадлежит известному датацентру?). Еще можно попробовать отправлять корректный «браузерный» заголвок, с юзерагентом и прочими хедерами.
    Ответ написан
  • Дизайн клиента API. Как лучше возвращать ошибки от API?

    Stdit
    @Stdit
    Я сталкивался. Когда-то тоже ломал голову над этим вопросом, и не нашел однозначного ответа, потому что всякий способ имеет как сильные, так и слабые стороны. Пробовал разные варианты, включая велосипеды, возврат кода ошибки и даже возврат ассоциативных массивов типа {status, result}. Многие не рекомендовали бросать исключения, аргументируя тем, что исключение должно оставаться исключением, а не становиться бизнес-логикой (в том числе, когда параметры исключения передаются в его конструктор при его бросании, в зависимости от типа исключения). В целом же, на практике оказалось, что это достаточно удобно, уменьшает количество условий, проверок, код становится короче и читается проще, багов становится меньше. На скорости работы почти не отражается. В нескольких поздних проектах на php обработка ошибок модели была сделана похожим образом. При реализации rest-api на эту модель достаточно просто создаются контроллеры. Возможно у кого-то есть другой опыт и он поделится негативными впечатлениями от исключений, но после выбора такого подхода мне жалеть не приходилось. Так что, как разработчику, такой способ контроля ошибок вполне бы подошел.
    Ответ написан
    4 комментария
  • Борьба между Smarty и отладчиком браузера

    Stdit
    @Stdit
    Первое, что бросается в глаза — у li нет ol/ul. А с html4 версией этого файла (поменять doctype, убрать section, header) такая же беда, или все нормально?
    Ответ написан
    1 комментарий
  • IDE с принципом работы FTP как у Notepad++

    Stdit
    @Stdit
    Я бы порекомендовал изменить свой подход к разработке. Закачивать к себе весь код проекта — это нормально. Это значительно упрощает навигацию, позволяет использовать межфайловые подсказки и прыжки, избавляет от риска потерять файл из-за ошибки закачки, и многое другое. А если навесить ещё и систему контроля версий — будет вообще хорошо. Если же эти радости жизни вас не интересуют, а в силу каких-то причин нужно именно редачить файлы на сервере, попробуйте eclipse или что-то на его основе. Например, Aptana.
    Ответ написан
    Комментировать
  • Простейшая очередь задач на PHP?

    Stdit
    @Stdit
    Один из самых простых способов организации фоновых задач (таких как отправка письма, например) — делегировать их скрипту в cron-е через базу данных. То есть записывать задачу с аргументами в таблицу-очередь, а кроном эту очередь разбирать по таймеру. Если по каким-то причинам это не подходит (например, из-за скорости реакции или нагрузки на бд), то наверное смотреть в сторону gearman.
    Ответ написан
    1 комментарий
  • GD или imagemagick. Как вырезать многоугольник из изображения?

    Stdit
    @Stdit
    Эмм… сота это шестиугольник. :)
    Можно попробовать сделать как-то так:
    1. Копируем прямоугольник, описывающий нужный нам многоугольник, и вставляем во временное изображение.
    2. Вычисляем области, которые нужно срезать, формируем из них треугольники.
    3. Заливаем эти треугольники прозрачным цветом.
    4. Получившийся шестиугольник копируем (в виде прямоугольника) и вставляем в другую картинку.
    Ответ написан
    2 комментария
  • Сложный запрос к БД

    Stdit
    @Stdit
    Этой проблеме много лет, и о ней много написано на разных ресурсах (search). Помимо предлагаемых вариантов запросов разной степени жуткости, можно использовать денормализацию (занесение данных во вспомогательную таблицу-топ на триггерах или по крону).
    Ответ написан
    Комментировать
  • Куда именно память утекает в PHP?

    Stdit
    @Stdit
    или xhprof
    Ответ написан
    Комментировать
  • Создание тестового окружения для разработки сайтов

    Stdit
    @Stdit
    У меня несколько вритуальных машин для тестов с разной конфигурацией сервера. При необходимости любую машину можно легко клонировать и ставить туда обновления или что-то ещё. В случае, если вам нужен не индивидуальный, а именно общий сервер, виртуальные машины можно поставить на один из постоянно работающих компьютеров и сделать их членами офисной сети.
    Ответ написан
  • Подсоединиться по SSH и поменять пароль?

    Stdit
    @Stdit
    Теоретически, можно уменьшить количество лишних сущностей, если передать всю команду одной строкой.
    Как-то так (пароли заслэшить):
    ssh user@host 'echo -e "password\npassword" | passwd username
    
    Ответ написан
    5 комментариев
  • Необъяснимое линейное увеличение времени SELECT к базе MySQL при одинаковых запросах в цикле?

    Stdit
    @Stdit
    Это замедление распространяется только на один запуск, или на каждый последующий? Я бы для начала поставил профайлер и посмотрел его отчёт по памяти на предмет метода, в котором возникает утечка памяти.
    Да, и ещё: почему бы не получить сразу все свойства для всех юзеров одним запросом, а потом сгруппировать и сформировать нужный $result?
    Ответ написан
    5 комментариев
  • Генерация 1млн билетов со случайными уникальными ID

    Stdit
    @Stdit
    Как вариант, можно завести дополнительное поле (sort) у билетов и заполнить его уникальными случайными числами. После этого сделать индекс по user_id и sort. Тест на таблице в миллион записей (InnoDB):

    mysql> SELECT * from ticket WHERE user_id = 0 ORDER BY sort LIMIT 10;
    +--------+------+---------+
    | id     | sort | user_id |
    +--------+------+---------+
    | 923164 |    1 |       0 |
    | 171274 |    2 |       0 |
    | 217458 |    3 |       0 |
    | 182627 |    4 |       0 |
    | 183120 |    5 |       0 |
    | 483756 |    6 |       0 |
    | 210156 |    7 |       0 |
    | 362920 |    8 |       0 |
    | 311591 |    9 |       0 |
    | 545096 |   10 |       0 |
    +--------+------+---------+
    10 rows in set (0.00 sec)
    
    mysql> UPDATE ticket SET user_id = 1 WHERE id IN (923164, 171274, 217458);
    Query OK, 3 rows affected (0.01 sec)
    Rows matched: 3  Changed: 3  Warnings: 0
    
    mysql> SELECT * from ticket WHERE user_id = 0 ORDER BY sort LIMIT 10;
    +--------+------+---------+
    | id     | sort | user_id |
    +--------+------+---------+
    | 182627 |    4 |       0 |
    | 183120 |    5 |       0 |
    | 483756 |    6 |       0 |
    | 210156 |    7 |       0 |
    | 362920 |    8 |       0 |
    | 311591 |    9 |       0 |
    | 545096 |   10 |       0 |
    | 230442 |   11 |       0 |
    | 472816 |   12 |       0 |
    | 138187 |   13 |       0 |
    +--------+------+---------+
    10 rows in set (0.00 sec)
    
    
    Ответ написан
    Комментировать
  • Что быстрее — глобальная переменная или инициализация класса в другом классе?

    Stdit
    @Stdit
    Это будет работать примерно одинаково быстро. Гораздо важнее «что удобнее». Ещё можно использовать готовый фреймворк для модели, если вас интересует результат и срок, а не обучение проектированию на практике. Для поддержки высоких нагрузок, на мой взгляд, важнее уделить внимание архитектуре кластера, в который можно быстро добавлять новые ноды. А оптимизацию кода производить уже потом, наслаждаясь отчётами мониторинга, для экономии издержек на сервера.
    Ответ написан
    Комментировать
  • как научиться программировать?

    Stdit
    @Stdit
    Теорию обязательно надо мешать с практикой, делать-переделывать выдуманные задачки, копаться в манах, пытаться понять каким образом всё работает. Я начинал с наглядных программ, с графикой, простейших демосцен, мини-игр и т.д, потому что мне так было приятнее воспринимать результат и спать до утра не хотелось. По поводу языка, это дело вкуса и предпочтений. Сейчас многие начинают с яваскрипта из-за его доступности, неприхотливости и относительной простоты (в плане «написать что-нибудь», понять что такое программирование вообще). Также полезно читать форумы и другие сообщества, особенно жалобы и проблемы других людей и ответы на них (типа как тут или на stackoverflow).
    Ответ написан
    Комментировать
  • PDO - полный отладочный запрос?

    Stdit
    @Stdit
    Я на дев-машине обычно включаю логгинг всех запросов средствами SQL-сервера, и смотрю что там происходит.

    Вот пример (MySQL):
    $st = $pdo->prepare('SELECT * FROM user WHERE id=:id');
    $id = 2;
    $st->bindParam(':id', $id, PDO::PARAM_INT);
    $st->execute();
    $r = $st->fetchAll();
    
    Выдаёт в MySQL-лог строчку
     6 Query	SELECT * FROM user WHERE id=2
    

    При использовании PostgreSQL выглядит это несколько по-другому:
    LOG:  duration: 2.669 ms  parse pdo_stmt_00000af1: SELECT * FROM "item" LIMIT $1 OFFSET $2
    LOG:  duration: 0.126 ms  bind pdo_stmt_00000af1: SELECT * FROM "item" LIMIT $1 OFFSET $2
    DETAIL:  parameters: $1 = '20', $2 = '0'
    LOG:  duration: 0.118 ms  execute pdo_stmt_00000af1: SELECT * FROM "item" LIMIT $1 OFFSET $2
    DETAIL:  parameters: $1 = '20', $2 = '0'
    LOG:  duration: 0.172 ms  statement: DEALLOCATE pdo_stmt_00000af1
    

    При желании можно SQL-лог направить в тот же файл, что и дебаговый PHP-лог, чтобы не переключаться между окнами терминалов с «tail -f», которые следят за логами.
    Ответ написан
  • Как научится настраивать web-сервер под Linux?

    Stdit
    @Stdit
    hotfix: «yum install php-pecl-название»
    Ответ написан
    Комментировать