danforth

danforth
Рейтинг
153
Регистрация
18.12.2015

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 - за 200$-500$ можно получить следующее: посты, категории, SEO-поля, комменты, ЧПУ, регистрация + JWT-аутентификация, карта сайта со всеми полями (priority, changefreq, и т.д.) отсортированная по дате модификации (самые новые посты всегда будут вверху карты сайта). Туда же входит базовая верстка на одном из современных CSS фреймворков. Сравнение с PHP: Небольшой блог на чистом PHP: нагрузка на сервер, количество запросов в секунду - 1200 (все по одной странице), время ответа сервера - 80 мс. (исключая пинг), и аналогичный блог с тем-же контентом на странице, но написанный на Go: нагрузка на сервер почти такая-же, зато запросов в секунду - 6300-8700, а время ответа сервера - 12 мс., т.е. по факту сервер отвечает быстрее в 8 раз и выдерживает в 6-8 раз больше трафика при том же потреблении ресурсов. В логике приложения на Go используются некоторые хитрости (кеш внутри приложения), поэтому база не дергается лишний раз. На PHP такое можно реализовать с помощью Redis/Memcached, но производительность кода на Go все равно будет выше. Конфиг: 2 ядра, 2 гига, тест был на виртуалке и сделан ради интереса, версия PHP 7.0 + opcache. На синтетические тесты можете глянуть тут, смотрите колонку secs, чем ниже - тем лучше.
  • Аналогичный сайт на PHP по ценам выйдет также, единственные преимущества это: больше программистов знает PHP, есть возможность запустить на хостинге - не обязателен VPS. Недостатки перед аналогичным сайтом на Go вы уже знаете. Ну и внутренняя кухня программиста: проект на Go можно быстрее рефакторить из-за статической типизации и отсутствия многоуровневых абстракций.
  • Интернет-магазины на Shop-Script 7: скидки на лицензии от 15% до 30% в зависимости от заказа. По работам: развернуть на хостинге + базовая настройка от 12$ до 24$, миграция с другого магазина - зависит от того, что за магазин был до этого и как там хранилась инфа в базе, но в целом от 12$ если автоматизированным импортом, и до 100$ если там нужно писать скрипты по конвертации. Написание плагинов: тоже как вы понимаете цены могут быть разные. Для примера: писал плагин выводящий артикулы в категориях: вышло на 50$ где-то. Интегрировал партнерку: около 35$.

По примерам и портфолио: сейчас в работе три крупных проекта (стартапы) + мой персональный сайт, все делаю сам в одиночку и для себя, когда будут готовы - скину. Все четыре - на Go. Из магазинов - вот, владелец другого магазина сейчас в отпуске, поэтому ссылку без спроса дать не могу. Также делаю сейчас лендинг для одной крупной компании, тоже в процессе, уточню у них когда доделаю, сейчас все в отпусках и процесс завис на этапе интеграции, если они дадут добро и не против чтобы я опубликовал, то скину ссылку на обновленный сайт сюда в тему.

По поводу портфолио, это вообще хорошая фишка для веб-дизайнеров или верстальщиков, так как им есть что показать. Но ваше замечание понимаю и полностью поддерживаю, с этих пор буду делать мини-отчет о том, что клиенты заказывали, во сколько это обошлось и за сколько по срокам я это сделал.

Мне вообще сны очень редко снятся. Думал "вот жеж везет людям, которым снятся сны", пока не приснился мне сон, как я спускаюсь по подъезду и вижу человеческие останки, отрезанные головы, конечности и кучу кровищи. В жизни видел такую картину один раз (лет шесть назад проезжал ночью село и видел результат того как машина на большой скорости сбила алкаша), но сказать что я тогда был в шоке от увиденного, я бы не сказал. Когда проснулся, весь день ходил с отвратным ощущением, ещё и не выспался. Так что жрать батарейки это ещё ничего. Кстати, а что за привкус во рту? Не металлический случаем? Хоть его и нельзя назвать приятным, вдруг у вас с детства ассоциация какая-то с батарейками и медным привкусом во рту (или металлическим), может у вас десны кровоточат или внутри какие-то проблемы с желудком. Я бы все таки проверился, порой организм намекает нам очень разными вещами. Или может не хватает чего, витаминов каких.

Какой смысл выносить все по серверам? Если так, то на основном сервере генерируете запрос к файл-серверу на предоставление ссылки, файл сервер отвечает вам ссылкой с хешем (например srv1.failopomoika.com/file/8fa-226b0-035e50-a1bc52-bbd614-9e0783/), после перехода по ссылки начинается скачивание, а ссылка удаляется. Все файлы закрыты от прямого доступа. Всем пофиг где и на каком сервере хранится контент, они будут писать абузу на тот хост, где размещена информация с кнопкой. Если вы затеваете разнести по серверам только ради того, чтобы абузы по серверам размазать, а не из-за оптимизации (в принципе не нужной тут), тогда трюк того не стоит. Настоятельно рекомендую содействовать правообладателям, но сделать пометку, что файлы загружаются на сервер людьми, и вы не контролируете этот процесс, и что по требованию все удалите, после чего заново генерируйте URL с книгой и кнопкой. А жалобы пусть шлют почтовым голубем куда-то в деревню в Сибирь, и дайте координаты на избу на каком-то леднике, предупредив, что ледник двигается каждый день на метр в разных направлениях.

Я слушаю BBC Radio One. Там разная музыка, и рок, и клуб, и попса, и репчик. В целом получается разбавлено.

borisd, оперативка не должна простаивать. Тут так: либо будет съедено в 5 раз больше памяти, зато на обработку каждого запроса уйдет на n миллисекунд меньше, в итоге в сутки экономятся часы процессорного времени. Надо эксперементировать.

borisd:
Спасибо за инфу. Некоторые питоновские скрипты меня не устраивают по скорости и распараллеливанию, поэтому посмотрю и в сторону go.

На питон уже есть куча ускорителей, которые работают как go или быстрее. Тот же PyPy или Cython или CPython, uvloop, etc.. Но если строить код на каналах (буферизированных), то вряд ли получится в многопоточных задачах достичь той же скорости.

borisd:
Да в общем то и не важно. Важно то, что скорость демоверсии в разы тормозней, поэтому скорость можно будет оценить только сделав нормальную установку проекта.

Попробуйте перевести это на PyPy, его почти все поддерживают, та же джанга работает на Pypy вроде. Прирост ну значительный будет, если 120 запросов в секунду не базой ограничены, а самим медленным питоном.

borisd:
Кстати, как Go по скорости?

По скорости чуть быстрее не разогретой джавы. Все зависит от алгоритмов. Из минусов - регулярки написаны на самом Go, и чуть медленнее (на самом деле не чуть, если проект состоит из одних регулярок) чем они же на PHP или JavaScript.

http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=go&lang2=python3

Ну а так, это собственно, одна из причин, почему выбирают Go - скорость.

borisd:
составляет 17 к 120 запросам в сек., а при включении кэширования шаблонов 17 к 140

17 versus 120 значит 17 - с debug = true; и 120 - с debug = false; это не отношение 17 к 120. Или я вас не правильно понял.

borisd, ну, начнем с того, что xls и Word это те же XML файлы. Но если это опустить, то есть либы. Вот примерный синтаксис того, чтобы записать в файл экспорт товаров.


package main

import (
"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 main

import "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 main

import (
"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
}
]
}
]
Всего: 1540