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

    $table = [];
    foreach ($users as $user) {
    
        foreach ($users_mts as $user_mts) {
            if ($user_mts['id'] == $user['id']) {
                $user['sum_mts'] = $user_mts['sum_mts'];
                break;
            }
        }
    
        $table[] = $row;
    }


    В $table будет все, что нужно.

    Можно ускорить процесс. Индексируем $user_mts по id и ищем сразу.
    Ответ написан
  • Как реализовать многократную сортировку данных из редиса?

    Фишка в том, что сортедсеты не сортируются в момент запроса на получение данных. Они хранятся уже сортированными, а сортируется все в момент изменения данных.
    Когда мы запрашиваем данные, redis уже знает где они лежат.

    Как вариант, каким-то образом посчитать score в таком виде, что бы записи уже лежали отсортированными. Но тогда для каждого набора полей создавать по сортедсету.
    Для field1, field2 -- один
    Для field1, field2, field3 -- другой

    Еще можно хранить несколько сортированных множеств для каждого поля. А потом "налету" объединять их с помощью ZUNIONSTORE/ZINTERSTORE и искать уже в результате вычислений.
    Ответ написан
    Комментировать
  • Как вывести картинки в php?

    __DIR__ и $_SERVER['DOCUMENT_ROOT'] возвращают полный путь для файловой системы сервера, т.е. вместе с /var/www/...
    А Вам нужно указать путь до картинки относительно фронтенда web сервера, т.к. пользователь загружает картинку через браузер.
    Ответ написан
    Комментировать
  • Какова роль интерфейсов в ООП?

    Приведу пример на коленке. Хотим, например, написать абстрактную файловую систему. Для начала, определим интерфейс, для ФС:

    interface FileSystemInterface {
      public function write($file, $data);
      public function read($file);
    }


    Затем, хочу реализацию интерфейса ФС для работы с файликами:

    class OSFileSystem implements FileSystemInterface {
      public function write($file, $data) {
         // открываем файлик, пишем данные
      }
    
      public function read($file) {
        // открываем файлик, возвращаем данные
      }
    }


    Вдруг, кому-то захотелось файловую систему в облаке. Окей, не проблема, реализуем это:
    class CloudFileSystem implements FileSystemInterface {
      public function write($file, $data) {
         // открываем соединение с облаком, пишем данные
      }
    
      public function read($file) {
        // открываем соединение с облаком, возвращаем данные
      }
    }

    Пусть у нас есть кой-то код, работающий с файловой системой, назовем его "Хранилище файлов". Пусть он выглядит примерно так:

    class FileStorage {
      protected $Fs;
      
      public function __construct(FileSystemInterface $Fs) {
        $this->Fs = $Fs;
      }  
    
      public function saveFile() {
        $this->Fs->write('file.txt', 'file data');
      }
    
      public function getFile() {
        return $this->Fs->read('file.txt', 'file data');
      }
    }


    Отлично! Теперь мы можем хранилищу файлов отдать любой объект с реализованным интерфейсом FileSystemInterface. Пример:

    // Хранилище файлов работает с файловой системой ОС:
    $FS = new OSFileSystem();
    $FileStorage = new FileStorage($Fs);
    $FileStorage->getFile();
    
    // Хранилище файлов работает с файловой системой в облаке:
    $FS = new CloudFileSystem();
    $FileStorage = new FileStorage($Fs);
    $FileStorage->getFile();


    Использование интерфейса, в данном случае. позволяет нам писать только реализацию работы файловой системы, а бизнес-логика, работающая с файловой системой никак не меняется, она знает, что в любом случае файловая система реализует интерфейс FileSystemInterface и может без опаски использовать методы этого интерфейса.
    Ответ написан
    14 комментариев
  • Есть ли аналог Curl на PHP который не требует установки?

    Ну блин. Ровно один запрос в гугл дает отличные результаты, советую пользоваться им.

    https://www.google.ru/search?q=php+http+without+curl
    Ответ написан
    4 комментария
  • Почему не работает автозавершение IDE NetBeans?

    Попробуйте PHPStorm
    Ответ написан
    Комментировать
  • Какие есть статьи про сессии на 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
    Ответ написан
    Комментировать
  • Как организовать проверку присутствия зарегистрированного пользователя на сайте?

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

    Если этого не достаточно раз в N секунд/минут стучим с клиента для обновления last_request_time
    Ответ написан
    3 комментария
  • Как снизить нагрузку на БД?

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