Ответы пользователя по тегу PHP
  • Как реализовать очень быстрый REST API на php вкупе с фреймворком?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    1. Найди узкие места по производительности в коде через XHProf + исправь их.
    2. Пересмотри индексы в БД. Например FK могут быть слишком высокой платой за целостность.
    3. Все "тяжелые" обработки, не виляющие на вывод - выноси в очередь: RabbitMQ / ZeroMQ / Gearman / ...
    4. Если нет блокирующих зависимостей - попробуй на HHVM.
    5. Yii-шная валидация моделей занимает довольно много времени. + Генерация моделей при выборке (используй asArray).

    --

    По поводу NodeJS - он вас особо не спасет. Профит, который получишь - это не stateless система (общие данные в памяти можно хранить и дергать сессию / кэш / бд для них не надо). Под ноду еще надо уметь писать, по началу у будет callback на callback-е и callback-ом погонять.

    --

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

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Посмотри в сторону Symfony
    Боюсь за оставшиеся 2 года своего обучения так и не стать более-менее нормальным разработчиком, который уже может делать определенные вещи и зарабатывать.


    Срочно: либо устраивайся на работу, либо фриланс. Твоя задача - получить опыт и няшное резюме. Не иди в web-студию, отупеешь. Оптимальный срок работы в компании И для программиста И для компании - 2 года.

    18962034_moj-diplom-pozvolil-mne-nachat-
    Ответ написан
    5 комментариев
  • Проверка не правильная или регулярка?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Мда... Вы с govnokod.ru копи-пасту сделали?

    1. Не используйте супер глобальные переменные $_GET/$_POST/...
    Вместо этого - Request объект любого понравившегося вам фреймворка, например этот

    2. Не пишите транслитом, никогда

    3. Не пишите одно и тоже. Если вам нужна валидация - используйте либо самописную, либо возьмите готовую:
    моя реализация, symfony validation, respect validation

    4. Вместо того, что бы миллион раз писать вложенные, обверните в try/catch и бросайте исключение на то, что не нравится. Дальше логгируйте

    5. "date"?? REALLY???? Данные - "data", дата(время) - "date"

    6. Если хочешь проверить строку на цифры - есть ctype_digit

    7. Открой для себя мир autoload вместе с composer. По хорошему в современном проекте require и его производные пишутся 1 раз, в index.php.

    8. НЕ <?PHP, А <?php

    9. Рано, или поздно все равно придешь к MVC - посему лучше начинай раньше. Конкретно сейчас у тебя работа с БД (модели) пересекаются с работой контроллера (обработка входящих данных).

    10. Забудь за существование глобальных переменных, в смысле вообще.
    Ответ написан
  • Можно ли соединить phpBB и ядро Wordpress?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Я вам по секрету: это вам не нужно. Вы никогда не будете использовать 100% функционала ни первого, ни второго, хотя бы по той причине, что часть этого функционала - сугубо внутренняя.
    Ответ написан
  • Как писать правильный код (PHP) с точки зрения IDE?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    * PSR-0 - PSR-5 (последний еще не принят)
    * Не юзайте магию
    * Не юзайте массивы [string => anyType]
    * Не пишите в док блоках mixed, или object
    * eval не юзайте, в смысле никогда
    * жестко типизируйте аргументы (в док блоках И в начале проверяйте их)
    Ответ написан
    Комментировать
  • Самый оптимальный вариант для серверной части?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    1. Если будешь писать с нуля - года через 2 может быть и напишешь.
    2. WP - это блог, судя по тому, что ты хочешь, wp - не лучший вариант.
    3. Посмотри на готовые эл. магазины, например PrestaShop.
    Ответ написан
    9 комментариев
  • Реализация ЧПУ путем хранения связи "url"-"query" в базе данных. Ваши мнения?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Если это slug - в бд имеет смысл хранить, но обязательно кэшировать, как вариант - напрямую nginx-ом из memcached отдавать. Но это при условии, что у вас как минимум n-уровневый урл. Т.е. если в вашем примере
    `site.com/notebook-lenovob550-da02ua` выделенное - это контроллер NotebookController - тогда ок. Дело в том, что разбор ЧПУ - это часть работы любого запроса и если у вас он будет медленный - полярный лис уже подкрался и ждет))
    Ответ написан
    Комментировать
  • Как лучше всего реализовать мультиязычность?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    1. Просто php файлы:
    + С ними, таки да, просто работать
    - В случае, когда переводов реально много - будете вызалить по памяти
    - Правки обязан вносить прогер

    2. PO -> MO файлы:
    + Есть куча тулзовин для работы с ними
    + Работает с php довольно таки быстро и памяти кушает не так много
    - Обязательная перегенирация MO
    - В случае, если переводы делает 3-е лицо, мерджить бывает - не самое приятное занятие

    3. БД:
    + Переводы может делать вообще левый человек, не вторгаясь в процесс
    - Повышенные требования к миграциям
    - Обязательное разделение на части и кэширование

    З.Ы. Оригинальный язык для переводов НЕ рекомендую делать нейтивным. Лучше использовать специфические строки в стиле: '{moduleName}:{controllerName}:{actionName}:{blockName}:frase'. В противном случае есть вероятность склейки переводов и может возникнуть ситуация:

    В блоке удаления заменили текстовку "ОК" на "Удалить", и магически не постижимым образом на странице регистрации под формой ввода появится одноименная клавиша.
    Ответ написан
    1 комментарий
  • Где можно порешать задачки по PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Если вам для повышения скила: откройте нравящийся вам фреймворк, перепишите один из его компонентов так, что бы скорость выполнения была сравнима с нейтивным кодом на php, но при этом с тем же интерфейсом. Попробуйте протолкнуть вашу фичу в это фреймворк, если ее одобрят, плюс вам в карму, если не одобрят - получите стек ошибок, в чем вы ошибались))

    Вот вам пример: по соглашению в проекте принята обязательная валидация аргументов в каждом методе, хотя бы на тип, в противном случае - бросать исключение. На секундочку это туева хуча проверок, меня это дело запарило, решил под искать пакет, решающий эту задачу, их довольно много и архитектурно они вполне красивые, но есть нюанс: время и память. В проекте это реально критично, посему пришлось писать свое, увы с кучей дублирования (мне самому не нравится), но по бенчмаркам эта штука получилась быстрая))
    https://github.com/ko-ko-ko/php-assert

    Попробуйте реализовать подобный проект (не обязательно валидатор), это может быть например логгер(PSR-3) на udp порт, система аннотаций (как в доктрине, но более быстрая, пусть и менее функциональная), минималистичный роутер, работающий с http-message, система по сбору статистики в стиле piwik, пусть и без frontend, но более настраиваемая и т.д.

    Просто решение стандартных задач стандартными способами для стандартных результатов особо ничего не даст.

    upd: проект переехал))
    Ответ написан
    Комментировать
  • Как вытянуть зависимости подключаемого пакета через composer?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Если это dev-зависимости в стороннем пакете, загружайте с флагом --dev, но будьте осторожны - это рекурсивная загрузка зависимостей зависимостей. Если у вас require не маленький - это скорее может привести к двум исходам: возникновение конфликта версий пакетов, либо ОЧЕНЬ длительная загрузка.

    Если же пакеты в директиве suggest - их придется подтягивать руками.
    Ответ написан
  • Как правильно вставить данные в MySQL c помощью php?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    if (isset($_POST['name']) && isset($_POST['email'])){
    
    // ГДЕ ВАЛИДАЦИЯ ВХОДЯЩИХ ДАННЫХ???
    
                $userName = $_POST['name'];
                $email = $_POST['email'];
                $company = $_POST['company'];
    
    // 2015-ый на дворе, PSR-4!!!
    
                include '../template/sql-connect.php';
    
    // mysql_conneсt - устарел, го ОЧЕНЬ не рекомендуется использовать
    
                $db_server = mysql_connect($db_hostname, $db_username, $db_password);
    
    // Use PSR-2 Luke!
    // die - используй только в случае крайней необходимости во время дебага, в остальных ситуациях - это как правило хрень постная.
    // Если уже пишешь ошибку - пиши конкретно, что не так "Query error" это примерно тоже самое, что и "oops.."
    
                if(!$db_server) { die("Query error"); }
    
    // Возьму ка я и отправлю в $POST['company'] = "'); DROP TABLE users;"
    // И баляля будет
    // Входящие данные обязательно должны быть И провалидированы И экранированы.
    
              $query = "INSERT INTO users (name, email, company) VALUES" .
                     "('$userName', '$email', '$company')";
    
               if (!mysql_query($query, $db_server))
                     echo "INSERT failed: $query<br>" .
                     mysql_error() . "<br><br>";
    
                mysql_close($db_server);
            }


    Ну и общее: следует разделять вывод данных и бизнес логику приложения, почитайте про MVC
    Ответ написан
    6 комментариев
  • Производительность сайта по сдаче тестирования?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря на какую нагрузку вы рассчитываете. Для ~0,5 rps вам кэш даже может не понадобится.
    redis - чаще всего используется как кэш хранилище, и pub/sub. Как БД его использовать - не самая лучшая идея, хотя бы потому что:
    redis.io/commands/keys
    Warning: consider KEYS as a command that should only be used in production environments with extreme care. It may ruin performance when it is executed against large databases.
    Ответ написан
    3 комментария
  • Как лучше сравнивать переменную со значением в условии PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    == используйте только в случае, если уверены в типах данных с обоих сторон, в противном случае ===
    Ответ написан
    Комментировать
  • Является ли правильной конструкция?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    В случае, если шаблонизатор не используется - это вполне нормальная практика.
    Ответ написан
    Комментировать
  • Как задавать namespace динамически?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    А в чем проблема добавить еще один модуль с другим названием в конфигурации приложения?

    Просто динамический нейспейс - это признак явных архитектурных проблем.
    Ответ написан
    Комментировать
  • Можете что-то подсказать по-поводу кода?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    рекомендую посмотреть в сторону доктрины, да, по началу она кажется монструозной, но на практике все проще.

    конкретно по вашей теме:

    1. $where = '1 ; DROP DATABASE database_name'; И счастье радость, улыбки после анального секса))
    2. что будет, если я передам не строки входными аргументами?
    3. динамический $where... похоже вы делаете свою orm, я прав? Если да - не делайте, это уже есть и работает даже быстро и качественно))
    4. НЕ ИСПОЛЬЗУЙТЕ ТРАНСЛИТ!!! Не опускайтесь до уровня 1С
    5. if(, $table_name, function table_name(), $STH... Используйте PSR-2
    6. Конструкцию
    for($i = 0; $i < count($pole); $i++){
    $que .= $pole[$i]." = ?, ";

    }
    $que = substr($que, 0, -2);

    можно заменить на

    $que = implode(' = ?,', $pole) . '= ?';

    7. Если вам явно не нужен $i - используйте foreach
    8. Поля все же стоит экранировать
    9. Не нагружайте метод не нужной работой: если вам нужно работать со строкой - работайте, но в вашем случае нужен явно массив, так и принимайте только массив.
    10. Вместо таких конструкций лучше либо используйте регулярки, либо проход с trim
    $pole = explode(", ", $pole);
    Если передать туда
    $pole = 'a1, a2,\r a3';
    Вы получите не совсем то, что ожидается.
    preg_match_all('/[^\s\,]+/u', $pole, $matches);
    11. Не используйте именование переменных в единичном представлении, когда работаете с множествами.
    НЕ $pole, а $fieldList/$fields (в случае массива)
    12. PDO != mysqli, для начала все же почитайте, какое API предлагает PDO, а потом его используйте. Просто то, что у вас сейчас - это как вилкой хлебать борщ.
    13. И напоследок лучше - используйте ===, вместо ==
    Ответ написан
    Комментировать
  • Как правильнее организовать синхронизацию баз на PHP+Apc+Mongo?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Я правильно понимаю, вы пытаетесь использовать БД как кэш?
    Если вам нужен именно кэш - почему вы удивляетесь, что данные теряются? Это вполне нормальная ситуация, я бы рекомендовал посмотреть в сторону memcached/redis, apc все же лучше для хранения опкодов.

    Если же вам нужна БД - либо шардируйте, либо проводите оптимизации хранимых данных, либо прокачивайте кэш до уровня "на чтение бд вообще не трогается".

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

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Как парсерку логов можете использовать logstash, очень удобная штука. Обычно используется в связке с ElasticSearch и Kibana

    В принципе под ваш кейс еще посмотрите в сторону StatsD + Graphite И в сторону influxdb
    Ответ написан
    Комментировать
  • Как бороться с ошибкой 504?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Обычно такое дело выполняется через очереди, например rabbitmq. А сами обработки выполняются консольно. С браузера этот процесс только инициализируется.
    Ответ написан
    Комментировать
  • Как сделать картинку из текста, вписанного в прямоуголник на PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    1. Генерируешь картинку с текстом и прозраным фоном (получаешь ее размеры)
    2. Накладываешь [1] на прямоугольник. С ресайзом и позиционированием в случае необходимости
    Ответ написан