isick1, отправил в личку.
Можно, если сам код блоков вы не меняете (другой аккаунт и т.д.)
В вашем случае плагин кеширования не поможет (максимум - улучшит время ответа сервера).
Для улучшения баллов PageSpeed Insights нужно работать над фронтендом: сжимать css, js, картинки; перемещать в футер скрипты и стили; сжимать содержимое html, кешировать статику (js, css).
Самый лучший для WP - этот https://ru.wordpress.org/plugins/cache-enabler/
Пересжать статику и стили может этот - https://ru.wordpress.org/plugins/w3-total-cache/
или этот - https://ru.wordpress.org/plugins/wp-fastest-cache/
А вообще лучше взять VPS и нанять сисадмина который вам поставит nginx + fastcgi_cache + php7.0
И верстальщика, который отверстает заново и все пережмет
Thommy, все зависит от задания, и даже вилку цен порой назвать сложно без какого-либо ТЗ и просмотра кода. Но для сравнения и примера могу прикинуть по ценам и функционалу:
По примерам и портфолио: сейчас в работе три крупных проекта (стартапы) + мой персональный сайт, все делаю сам в одиночку и для себя, когда будут готовы - скину. Все четыре - на Go. Из магазинов - вот, владелец другого магазина сейчас в отпуске, поэтому ссылку без спроса дать не могу. Также делаю сейчас лендинг для одной крупной компании, тоже в процессе, уточню у них когда доделаю, сейчас все в отпусках и процесс завис на этапе интеграции, если они дадут добро и не против чтобы я опубликовал, то скину ссылку на обновленный сайт сюда в тему.
По поводу портфолио, это вообще хорошая фишка для веб-дизайнеров или верстальщиков, так как им есть что показать. Но ваше замечание понимаю и полностью поддерживаю, с этих пор буду делать мини-отчет о том, что клиенты заказывали, во сколько это обошлось и за сколько по срокам я это сделал.
Мне вообще сны очень редко снятся. Думал "вот жеж везет людям, которым снятся сны", пока не приснился мне сон, как я спускаюсь по подъезду и вижу человеческие останки, отрезанные головы, конечности и кучу кровищи. В жизни видел такую картину один раз (лет шесть назад проезжал ночью село и видел результат того как машина на большой скорости сбила алкаша), но сказать что я тогда был в шоке от увиденного, я бы не сказал. Когда проснулся, весь день ходил с отвратным ощущением, ещё и не выспался. Так что жрать батарейки это ещё ничего. Кстати, а что за привкус во рту? Не металлический случаем? Хоть его и нельзя назвать приятным, вдруг у вас с детства ассоциация какая-то с батарейками и медным привкусом во рту (или металлическим), может у вас десны кровоточат или внутри какие-то проблемы с желудком. Я бы все таки проверился, порой организм намекает нам очень разными вещами. Или может не хватает чего, витаминов каких.
Какой смысл выносить все по серверам? Если так, то на основном сервере генерируете запрос к файл-серверу на предоставление ссылки, файл сервер отвечает вам ссылкой с хешем (например srv1.failopomoika.com/file/8fa-226b0-035e50-a1bc52-bbd614-9e0783/), после перехода по ссылки начинается скачивание, а ссылка удаляется. Все файлы закрыты от прямого доступа. Всем пофиг где и на каком сервере хранится контент, они будут писать абузу на тот хост, где размещена информация с кнопкой. Если вы затеваете разнести по серверам только ради того, чтобы абузы по серверам размазать, а не из-за оптимизации (в принципе не нужной тут), тогда трюк того не стоит. Настоятельно рекомендую содействовать правообладателям, но сделать пометку, что файлы загружаются на сервер людьми, и вы не контролируете этот процесс, и что по требованию все удалите, после чего заново генерируйте URL с книгой и кнопкой. А жалобы пусть шлют почтовым голубем куда-то в деревню в Сибирь, и дайте координаты на избу на каком-то леднике, предупредив, что ледник двигается каждый день на метр в разных направлениях.
Я слушаю BBC Radio One. Там разная музыка, и рок, и клуб, и попса, и репчик. В целом получается разбавлено.
borisd, оперативка не должна простаивать. Тут так: либо будет съедено в 5 раз больше памяти, зато на обработку каждого запроса уйдет на n миллисекунд меньше, в итоге в сутки экономятся часы процессорного времени. Надо эксперементировать.
На питон уже есть куча ускорителей, которые работают как go или быстрее. Тот же PyPy или Cython или CPython, uvloop, etc.. Но если строить код на каналах (буферизированных), то вряд ли получится в многопоточных задачах достичь той же скорости.
Попробуйте перевести это на PyPy, его почти все поддерживают, та же джанга работает на Pypy вроде. Прирост ну значительный будет, если 120 запросов в секунду не базой ограничены, а самим медленным питоном.
По скорости чуть быстрее не разогретой джавы. Все зависит от алгоритмов. Из минусов - регулярки написаны на самом Go, и чуть медленнее (на самом деле не чуть, если проект состоит из одних регулярок) чем они же на PHP или JavaScript.
http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=go&lang2=python3
Ну а так, это собственно, одна из причин, почему выбирают Go - скорость.
17 versus 120 значит 17 - с debug = true; и 120 - с debug = false; это не отношение 17 к 120. Или я вас не правильно понял.
borisd, ну, начнем с того, что xls и Word это те же XML файлы. Но если это опустить, то есть либы. Вот примерный синтаксис того, чтобы записать в файл экспорт товаров.
package mainimport ( "fmt" "github.com/tealeg/xlsx")type Product struct { ID int Name string Skus []Sku}type Sku struct { ID int Name string Price float32}var products = make([]Product, 0)func init() { products = append(products, Product{ ID: 1, Name: "Чашка", Skus: []Sku{ {ID: 1, Name: "красная", Price: 7.99}, {ID: 2, Name: "зеленая", Price: 6.99}, }, })}func main() { file := xlsx.NewFile() sheet, _ := file.AddSheet("products") for _, product := range products { row := sheet.AddRow() row.AddCell().Value = fmt.Sprintf("%d", product.ID) row.AddCell().Value = product.Name row.AddCell().Value = fmt.Sprintf("%.2f", product.Skus[0].Price) } file.Save("./export.xlsx")}
Но такую муть как PDF, XLS, DOC я бы выносил на Python. Само ядро можно описать на Go, где потом рефакторинг не будет вызывать жопную боль. Тут есть кастомные типы, которые очень удобны, например:
package mainimport "fmt"type Money struct { Currency Amount float32}func (m Money) String() string { return m.Currency.Format(m.Amount)}type Currency struct { Code string Format func(amount float32) string}func main() { USD := Currency{ Code: "USD", Format: func(amount float32) string { return fmt.Sprintf("$%.2f", amount) }, } money := Money{USD, 7.99} fmt.Println(money) // $7.99 - уже отформатировано}
У структуры Money есть метод String() который возвращает строку. Данный метод используется повсюду, где есть поддержка интерфейса Stringer (собственно, чтобы удовлетворять этому интерфейсу, нужно всего лишь реализовать метод String() string с нужной сигнатурой, сама имплементация неявна, не нужно писать implements и т.д.). В итоге, достаточно везде пихать Money и они будут форматироваться в зависимости от currency, которые включают в себя. Если доллары форматируются по стандарту со знаком доллара спереди, то рубли наоборот (к примеру).
Есть ещё теги, которые определяют ORM зависимости и JSON, XML сущности. Можно сделать так:
package mainimport ( "encoding/json" "os")type Product struct { ID int `json:"id"` Name string `json:"name"` Skus []Sku `json:"skus"`}type Sku struct { ID int `json:"id"` Name string `json:"name"` Price float32 `json:"price"`}var products = make([]Product, 0)func init() { products = append(products, Product{ ID: 1, Name: "Чашка", Skus: []Sku{ {ID: 1, Name: "красная", Price: 7.99}, {ID: 2, Name: "зеленая", Price: 6.99}, }, })}func main() { enc := json.NewEncoder(os.Stdout) // пишем в stdout, можно и в http.Response, и в файл, и куда угодно enc.SetIndent("", " ") // красиво отформатируем enc.Encode(products)}
И получим
[ { "id": 1, "name": "Чашка", "skus": [ { "id": 1, "name": "красная", "price": 7.99 }, { "id": 2, "name": "зеленая", "price": 6.99 } ] }]