• Почему не работает автозавершение IDE NetBeans?

    Попробуйте PHPStorm
    Ответ написан
    Комментировать
  • С чего начать 17-ти летнему парню с головой на плечах?

    Само программирование для программиста приносит деньги только за разработку. Дядя дает Вам работу, вы согласовываете цену, делаете свою работу, получаете деньги. Все просто.
    Бывает, что вы работаете за процент с продаж, имеете долю в компании.
    Если же вы делаете свой проект, то тут большое количество способов монетизации проекта, доходы от рекламы, продажи.
    Ответ написан
    1 комментарий
  • Какие есть статьи про сессии на php которым можно доверять?

    Вот пара занимательных статей на эту тему:
    blgo.ru/blog/2014/07/18/regform
    blgo.ru/blog/2014/07/24/regform-112

    А вообще, алгоритм примерно такой:
    Врубаем https, при регистрации хэшируем пароль с солью и статичиским ключиком. Примерно так:
    $staticKey = "Your static key";
    $salt = %random string with diggits%; 
    $password = sha1($_POST['password'] . $staticKey . $salt);
    // save to db $salt and $password

    Для авторизации проверяем соответствие пароля:
    $staticKey = "Your static key";
    $salt = %salt from db%; 
    $password = sha1($_POST['password'] . $staticKey . $salt);
    return $password == $dbPassword; // Авторизация удалась

    Теперь можем создать сессию и записать в нее данные для авторизации. Если исользуем свой механизм сессий, то тут можно предусмотреть несколько вариантов для защиты:
    1. Повторный ввод пароля, если пользователь зашел из необычного места (определяем по ip/геолокации, например). Сегодня он в России, завтра он в Австралии, стоит проверить пароль еще раз. Проверку не проходит, скидываем сессию.
    2. Сессия была в одном браузере, затем, та же сессия, в другом. Странное поведение, просим ввести пасс.
    3. Можем раз в пол часа обновлять идентификатор сессии в куках у юзера.
    4. etc.
    Ответ написан
  • Как загрузить файл на другой сайт?

    Посылаем запрос site1 -> site2: "смотри, у меня появился новый файлик, а вот на него ссылочка и служебная информация, мне пофигу что ты с этим будешь делать, но я попозже постучусь спросить, все ли ок, если не пришлешь сам ответа что все ок".
    site2 такой: "о, site1 прислал мне ссылочку, дай-ка я себе скачаю этот файлик". Скачивает файлик себе.
    site2: "О! Я докачал файл. Расскажу-ка я об этом."
    site2->site1: "Чувак, я скчал себе этот файл, спасибо."

    Мораль сей басни такова: не можешь пихнуть, пускай он сам тянет.
    Ответ написан
    Комментировать
  • Как правильно спроектировать приложение?

    Почитайте про паттерны. Мне очень помогла книга "Чистый код" (www.ozon.ru/context/detail/id/21916535/).

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

    Разбиваем программу на сущности: User, News, Page.
    У каждой сущности есть свое хранилище: UserStorage, NewsStorage, PageStorage. Хранилище занимается только тем, что управляет сущностью в БД: save, load, delete, etc.
    При создании, хранилище прнимает соединение с БД и сохраняет его "в себе".
    Код при этом получается примерно такой:
    $Connection = ConnectionPool::getConnection('users');
    $UsersStorage = new UserStorage($Connection);
    
    $User = $UsersStorage->loadById(1);
    $User->set('name', 'Yakob');
    $User->get('name');
    $UserStorage->save($User);
    $UserStorage->delete($User);


    Аналогично другими сущностями.
    Сразу же прослеживается связь между сущностями и хранилящами между собой. Выделяем абстракцию, например AbstractStorage. Выносим в нее общие части хранилищ.
    Приведенный код создания хранилища можно скрыть, например за фасадом примерно так:
    class UserFacade {
        protected static $UserStorage = null;
    
        public static function getById($id) {
            return self::getUserStorage()->getById($id);
        }
    
        public static function save(User $User) {
            return self::getUserStorage()->save($User);
        }
    
        protected static function getUserStorage() {
            if (is_null(self::$UserStorage)) {
                $Connection =  ConnectionPool::getConnection('users');
                self::$UserStorage = new UserStorage($Connection);
            }
    
            return self::$UserStorage;
        }
    }


    Все остальное - разные укровни бизнес логики. Нужно получить новости юзера? Создаем класс например UsersNewsStorage, который наследуется от NewsStorage. Есть метод getFeed
    Код примерно такой получается:
    ....
    $User = $UserStorage->getById(1);
    $UsersNewsStorage = new UsersNewsStorage($Connection);
    $Feeds = $UsersNewsStorage->getFeed($User);


    Нужна валидация новостей? Хранилище (NewsStorage) мы не трогаем, оно занимается только тем, чем занимается. Остальное бизнес логика.
    Добавляем валидацию в UsersNewsStorage.
    $User = $UsersStorage->loadById(1);
    $News = new News(['title'=>'AAA', 'body'=>'bbbbbb']);
    $UsersNewsStorage = new UsersNewsStorage($Connection);
    try {
      $UsersNewsStorage->saveNews($User, $News); // Внутри валидация
    } catch (ValidationNewsErrorException $Ex) {
      // Валидация не прошла
    }


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

    Возьмите в вооружение xhprof
    Ответ написан
    Комментировать
  • Как убрать возможность перехода к экшенам, которые работают с помощью ajax + json, через строку браузера?

    Не знаю я рубей, но алгоритм очень простой.
    Перед выводом достаточно проверить, действительно ли запрос является ajax'ом.
    Похоже, что тут ваше решение: stackoverflow.com/questions/366311/how-do-you-hand...
    Ответ написан
    Комментировать
  • MySQL. Как обновлять данные по расписанию?

    Как вариант, выгрузить задачи в очередь и при разборе оной, смотреть время выдачи "бонуса".
    Выгрузили из базы -> положили в очередь <- берем головной элемент, время наступило - даем бонус. Нет - обратно в очередь.
    В очереди должна быть уже рассчитанное время выдачи, либо время когда начали отсчитывать время бонуса + через какое время отдаем бонус.
    Ответ написан
  • Как организовать проверку присутствия зарегистрированного пользователя на сайте?

    Запоминаем время последнего запроса юзера (last_request_time). Когда требуется узнать онлайн он или нет прибавляем к last_request_time, скажем, 10 минут.
    last_request_time + 10 мин > current_time === юзер онлайн

    Если этого не достаточно раз в N секунд/минут стучим с клиента для обновления last_request_time
    Ответ написан
    3 комментария
  • Почему место размещение серверов - техническая тайна?

    крупные IT компании

    Мне кажется, это ключ к ответу.
    Вероятнее всего, дабы избежать каких-либо проблем со стороны злоумышленников.
    Ответ написан
    Комментировать
  • Зачем используют ` в mySQL ?

    Ошибка:
    SELECT key FROM .....

    Не ошибка:
    SELECT `key` FROM .....
    Ответ написан
    Комментировать
  • Как снизить нагрузку на БД?

    Берем какой-нибудь memcached.
    У запроса в бд, есть какой-нибудь идентификатор для выборки.
    Алгоритм такой:
    1. Смотрим в кэш по этому идентификатору
    2. В кэше есть данные, отдаем сразу
    3. Если там пусто, делаем запрос к БД, сохраняем результат в кэш, указывая "время жизни ключа" и отдаем данные
    Ответ написан
    Комментировать
  • Чем подключиться к GIT репозитарию на собственном сервере?

    git remote add myserver git@localhost:group/project.git
    git add .
    git commit -m "First commit"
    git push myserver master
    Ответ написан
    Комментировать
  • Как запустить KPHP?

    Клонируем репозиторий KPHP
    В папке с репой делаем
    make kphp
    Не забываем поставить нужные библиотечки.
    Смотрим /kphp-kdb/objs/bin/kphp2cpp
    Там можно увидеть
    Запускаем:
    ./kphp2cpp ../test-kphp/index.php
    Результат выполнения

    File [kphp/index.src_index389dab75@u.h] changed
    File [kphp/xmain.cpp] changed
    File [kphp/init_scripts.cpp] changed
    File [kphp/init_scripts.h] changed
    File [kphp/index.src_index389dab75@u.cpp] changed
    File [kphp/dfs0.index.src_index389dab75@u.h] changed
    File [kphp/dfs0.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs1.index.src_index389dab75@u.h] changed
    File [kphp/dfs1.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs2.index.src_index389dab75@u.h] changed
    File [kphp/dfs2.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs3.index.src_index389dab75@u.h] changed
    File [kphp/dfs3.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs4.index.src_index389dab75@u.h] changed
    File [kphp/dfs4.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs5.index.src_index389dab75@u.h] changed
    File [kphp/dfs5.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs6.index.src_index389dab75@u.h] changed
    File [kphp/dfs6.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs7.index.src_index389dab75@u.h] changed
    File [kphp/dfs7.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs8.index.src_index389dab75@u.h] changed
    File [kphp/dfs8.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs9.index.src_index389dab75@u.h] changed
    File [kphp/dfs9.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs10.index.src_index389dab75@u.h] changed
    File [kphp/dfs10.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs11.index.src_index389dab75@u.h] changed
    File [kphp/dfs11.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs12.index.src_index389dab75@u.h] changed
    File [kphp/dfs12.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs13.index.src_index389dab75@u.h] changed
    File [kphp/dfs13.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs14.index.src_index389dab75@u.h] changed
    File [kphp/dfs14.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs15.index.src_index389dab75@u.h] changed
    File [kphp/dfs15.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs16.index.src_index389dab75@u.h] changed
    File [kphp/dfs16.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs17.index.src_index389dab75@u.h] changed
    File [kphp/dfs17.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs18.index.src_index389dab75@u.h] changed
    File [kphp/dfs18.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs19.index.src_index389dab75@u.h] changed
    File [kphp/dfs19.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs20.index.src_index389dab75@u.h] changed
    File [kphp/dfs20.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs21.index.src_index389dab75@u.h] changed
    File [kphp/dfs21.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs22.index.src_index389dab75@u.h] changed
    File [kphp/dfs22.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs23.index.src_index389dab75@u.h] changed
    File [kphp/dfs23.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs24.index.src_index389dab75@u.h] changed
    File [kphp/dfs24.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs25.index.src_index389dab75@u.h] changed
    File [kphp/dfs25.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs26.index.src_index389dab75@u.h] changed
    File [kphp/dfs26.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs27.index.src_index389dab75@u.h] changed
    File [kphp/dfs27.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs28.index.src_index389dab75@u.h] changed
    File [kphp/dfs28.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs29.index.src_index389dab75@u.h] changed
    File [kphp/dfs29.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs30.index.src_index389dab75@u.h] changed
    File [kphp/dfs30.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs31.index.src_index389dab75@u.h] changed
    File [kphp/dfs31.index.src_index389dab75@u.cpp] changed
    File [kphp/dfs.index.src_index389dab75@u.h] changed
    File [kphp/dfs.index.src_index389dab75@u.cpp] changed
    File [kphp/vars0.cpp] changed
    File [kphp/vars.cpp] changed
    Ответ написан
    1 комментарий