Ответы пользователя по тегу PHP
  • Что выбирать: SQL vs NoSQL?

    Если вам надо только читать\писать используйте постгре. С этими задачами она справляется вполне неплохо.
    Ответ написан
    8 комментариев
  • PHP — стоит ли использовать кэширование результатов выполнения функций

    Кэширование вообще несет в себе одну главную проблему: поддержка актуальности.

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

    Меморизация функций (кэширование результатов в зависимости от аргументов) требует выполнение двух ограничений:
    1. Функция всегда возвращает одинаковый результат при одинаковых аргументах (не зависит от состояния системы или этими изменениями можно пренебречь)
    2. Функция никогда не изменяет внутренние состояние системы (если функция была меморизирована, т.е. результат работы был сохранен в словарь, ключем которого является список аргументов, то дальнейшего вызова этой функции происходить не будет)

    Если эти ограничения выполняются, то возможна меморизация функции.

    Ответьте самостоятельно можете ли вы использовать кэш и меморизацию исходя из этих критериев.
    Ответ написан
    1 комментарий
  • Стена соцсети: выборка данных

    UNION не так уж и плох. Особенно UNION ALL, где не требуется выбирать уникальные записи. По крайней мере он будет не медленнее чем выполнить каждый запрос по отдельности, за счет того, что может теоретически быть выполнен параллельно на нескольких ядрах.

    Но если не подходит, давайте от печки. Вы постулируете следующее «мы не можем выбирать все в одном запросе, чтобы не мешать модели».

    Значит минимальное количество запросов получается равным количеству_типов_данных. Для этого нужно выполнить по отдельности запросы которые у меня в UNION, но тогда вручную в коде сортировать эту кашу по датам и группировать по wall_id. Это плохой путь.

    Предлагаю такой вариант:
    SELECT
    	w.id,
    	w.description,
    	COUNT(i.id) i_cnt,
    	COUNT(bp.id) bp_cnt
    FROM wall w
    
    INNER JOIN wall_element we_i
            ON we_i.wall_id = w.id
    INNER JOIN image i
            ON i.id = we_i.element_id
    
    INNER JOIN wall_element we_bp
            ON we_bp.wall_id = w.id
    INNER JOIN blog_post bp
            ON bp.id = we_bp.element_id
    
    ORDER BY w.timestamp
    
    GROUP BY w.id, w.description
    


    Мы получаем список записей, и количество связанных с каждой записью единиц контента. Дальше разделяем ответственность в коде следущим образом:
    1. основной код выполняет этот запрос, и бежит по результатам. Смотрит, что есть в конкретной записи. Например видит что картинка, и товар из магазина
    2. основной код вызывает соответствующие рендереры, передавая им идентификатор записи wall_id.
    3. рендерер сам (своим запросом) достает уже те данные, которые ему нужны оттуда, откуда хочет, в ту модель, которая ему нравится. Это полностью развязывает рендереры друг от друга и от вызывающего кода.

    Итого имеем запросов: количество_записей_на_стене * среднее_количество_единиц_контента + 1. Думаю у вас в среднем 1 запись на стене будет иметь ссылку на 1 единицу контента (например пяток фоток, которые рендерер картинок сможет вытащить одним запросом).

    Имеем в среднем запросом количество_записей_на_стене + 1. Вполне приемлимо.
    Ответ написан
  • Стена соцсети: выборка данных

    Кстати простите за оффтопик, но я вот бегло посмотрел ваш сайт. Первой глянул на вот это:
    excalibur.com.ua/blog/php-c3/%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80-%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D0%B5%D0%B9-%D0%BD%D0%B0-php-i22.html

    Вы пытаетесь определить ту, что быстрее работает, и в обоих ВНУТРИ цикла делаете count($arr) и strlen($chars). Вы не думали, что если вынести подсчет длинны массива и длинны строки за цикл, то у вас функция ускорится примерно в $length раз? И вы еще после этого кого-то упрекаете в отсутствии опыта?
    Ответ написан
  • Стена соцсети: выборка данных

    Как можно втянуть «те 20 фото которые вы добавили на стену» если у вас нет идентификатора пользователя нигде.

    Если просто все фото на стене, то так:
    SELECT
    	w.id,
    	w.description,
    	we.*
    FROM
    	wall w
    INNER JOIN wall_element we
    	ON w.id = we.wall_id
    


    Это то, что вы хотели?
    Ответ написан
  • Как можно менять цвет от зеленого к красному, имея на входе только число 0-40?

    Почитайте про модель цвета не в RGB а в HSV.
    ru.wikipedia.org/wiki/HSV_(%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C)

    Если в кратце, то у вас будет
    0 -> H = 120 S = 100 V =100
    20 -> H = 60 S = 100 V =100
    40 -> H = 0 S = 100 V =100
    Ответ написан
    Комментировать
  • Сетевой диск из php-скрипта?

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

    Честно говоря, я уже немного подзабыл пхп, но если мне изменяет память при разрыве соединения апач\другой вэб сервер убьет поток с пхп скриптом. По крайней мере при настройках по-умолчанию. Я намекаю на то, что если вы и найдете способ убить соединение, то уверены ли вы что Апач не убьет ваш скрипт?

    Если вам нужно сделать асинхронную обработку, вставьте в конец страницы невидимый img, а src ему ссылку на скрипт. Страница будет загружена, пользователь доволен а обработка пойдет в фоне. Но тут нет гарантии, что пользователь не закроет браузер пока ваша обработка не кончится (картинка не «загрузится»). Можете ему прогресс бар какой аяксом показывать. (Один скрипт, на который ссылка в картинке, пилит что-то в фоне и пишет прогресс в базу, другой его пользователю по аяксу отдает). А вообще все эти серверные обработки на PHP вещь неблагодатная. Лучше всего заведите табличку, в которую пишите все что надо асинхронно выполнить, и пусть каждые 10 секунд по cron на сервере запускается тот же php (хотябы через wget специального урла) и делает все асинхронное. Последнее решение наиболее стабильное. И избавляет от необходимость держать открытым браузер.
    Ответ написан
    Комментировать
  • Новый сервис: код "с нуля" или php-фреймворк?

    помоему писать код с нуля не используя фреймворк стоит только в том случае если вы пишите фрэймворк. И то не всегда.
    Ответ написан
    2 комментария
  • Когда оправдано использование публичных полей в PHP?

    Тогда же когда и в любом другом языке. Чем php в этом выделяется?

    Тогда когда вам необходимо задавать какие-то параметры объекта извне. Или вопрос в том, что можно вместо публичных полей использовать публичные методы вида $myObj->GetName(); $myObj->SetName(«New Name»); или публичные __get и __set? Ну, если никакой немедленной реакции объекта на изменение значения не нужно, почему бы не использовать поля? Простое присваивание или чтение переменной будет быстрее чем вызов метода или темболее использование __get и __set внутри которых все тоже присваивание или чтение переменной.

    Или вы вообще от публичных полей предлагаете отказаться? А как объектом то тогда управлять? :)
    Ответ написан
    2 комментария
  • PHP библия

    Не в качестве библии, а просто как хорошую книгу по PHP могу посоветовать вот эту:
    www.kocby.ru/post/webmaster/php-mysql/welling/

    А библия для любого программиста, на мой взгляд это lib.mexmat.ru/books/77
    Ответ написан
    Комментировать