danforth

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

Посмотрите у меня в подписи хостинг-провайдер Fozzy, ссылка реферальная, можете прямо в гугле так и вбить если напрямик. У них есть VPS за 1899 рублей, за эти деньги получите это. Сам пользуюсь у них хостингом, и планирую скоро переехать на VPS.

Из того что нравится, очень быстрый и вежливый саппорт, который всегда помогает и объясняет, новое оборудование, аптайм на хостинге ещё ни разу сайт не падал за три месяца. Мои сайты разместил в ДЦ Webzilla NL. Можете попросить тест у них в онлайн-чате, вроде они предоставляют. Промокод внизу на скидку. Если будут вопросы - пишите, отвечу.

melkozaur:
mendel,
Если клиент/контент-менеджер идиот, то он точно не разберется, какие именно из 300 полей в 10 табах нужно заполнять для карточки товара.

я разок натыкался на такую штуку, в которой описание товара:

а) проверялось на уникальность

б) проверялось на ошибки через Yandex Spellchecker

Так вот, пока вся эта хрень не пройдет валидацию, товар добавить нельзя

Точно также можно повесить required на поля, которые отвечают за SEO, а ещё лучше - генерировать их динамически (placeholder), но давать возможность изменить вручную.

Табы - удобная штука, чтобы структурировать карточку.

Цены + Артикулы / Описание + SEO / Характеристики / Фото + Видео / Дополнительные страницы

Какую альтернативу предложите вы? Бесконечный скролл?

Крутой аппарат, я бы тоже если бы брал Cayenne, то дизельный бы взял. Оптика матричная что-ли?

Stek:
Теперь вопрос, где искать метод getPackageBarcodeByIdentifier ? Из за не явного вызова модели, IDE просто не может найти где в ней этот метод. Т.е. вручную конечно, открыл файлы и нашел. Но когда ты находишься на стадии знакомства с проектом - время на такой дебаг уходит куча.

Это проблема IDE (или Doctrine) но никак не ООП и абстракций.. нужно использовать type hinting PHPDoc для того, чтобы IDE подхватывал... более того, проблема есть даже если


<?php

class waRedisCacheAdapter extends waCacheAdapter
{
/**
* @var Redis
*/
protected static $redis;

protected function init()
{
if (!self::$redis) {
self::$redis = new Redis;
self::$redis->pconnect('127.0.0.1', 6379);
}
}

/* ... Methods ... */

public function delete($key)
{
return self::$redis->delete($key); // тут IDE без декларации PHPDoc в начале класса запутается, т.к. она не знает что лежит в self::$redis
}
}

Фиксится таким образом для методов возвращающих экземпляры классов


/**
@return YourClassName
*/

Или в начале класса


/**
* Users collection
* @var \Doctrine\ORM\ArrayCollection
*/
protected $users;

или вариант для PHP7+



public function getSomeClass(string $table) : TableModel
{
// ...
}

obius:
Разжую. Не просто функций. А функций уже загруженных. В ПХП нет автоподгрузки функций, как для классов. Вы можете никогда не использовать 1500 из этих 1900. И ваши плагины, и темы могут их всех никогда не использовать. Но при КАЖДОЙ странице этот код будет выполнен.

Почему выполнен-то? Они регистрируются на этапе Syntax Analysis, но не выполняются. Да, появляются зарегистрированные функции, но процессорного времени они не жрут особо. Да, мертвый код плохо, но мы говорим о CMS, а это всегда какое-то универсальное решение, а значит и функционал будет размазанный (кто-то будет все функции использовать, а кто-то 20% от всего списка). Именно поэтому крупные сайты пишут под себя с нуля или на микрофреймворках, чтобы не платить денежку за ресурсы, которые при Highload обходятся дорого.

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

Да, подключение класса обычно происходит autoload'ером, а значит то, что не используется, подключено не будет. В добавок ко всему, глобальное состояние - плохо, ну к примеру, если мы сделаем в нашем bootstrap файле что-то вроде

$app = new App();
$app->run();

То переменная $app попадает в global state. В случае, если кто-то во вьюхе (которое без template engine) напишет $app = "something"; то получится непредсказуемое поведение, и хоть function overloading в PHP запрещено (это я о глобальных функциях WP), то получаем нестабильное поведение. Любой может изменить глобальную переменную, от которой зависит работа вашего приложения.

Я сейчас пишу один проект на Go, так вот, там сам проект не компилируется при наличии функций или даже переменных, которые не используются, т.е. по факту dead code и unreachable code там не прокатят. А, к слову, PHP проекты просто усыпаны таким кодом. Там ещё куча фишек есть, как и минусов, которые мне, как программисту на PHP, не удобны, но я начинаю понимать, почему они так сделали.

Например, там нету Exception, зато есть multiple return (и кортежи), таким образом можно:

менять переменные местами


var a int = 1
var b int = 2

a, b = b, a

и разработчика, можно сказать, заставляют проверять все на ошибки, например


file, err := os.Open("file.go") // функция os.Open вернет два значения, "файл" и ошибку, если она есть, или nil, если её нет, т.е. по факту мы не можем просто взять, и не принять err (на самом деле можем, но только умышленно через переменную _, вот так file, _ := os.Open("file.go")
if err != nil {
log.Fatal(err) // тут мы пишем в лог и завершаем выполнение программы, если критически важный для нас файл не открылся по какой либо из причин (err содержит причину).
}

Конечно, это я уже отошел от темы, но тем не менее, захотелось поделится таким немного грубым подходом чтобы заставлять человека проверять ошибки...

Когда я только учился только писать на PHP, я часто писал mysql_connect($args... Args); и продолжал работать, даже не проверив что там вернулось, и тогда я ещё задумывался, был бы какой-то механизм, который заставлял бы меня все проверять, чтобы я не забывал и код стабильно работал. Потом я начал писать or die("Cannot connect to database");. Дело было давно, сейчас в PHP 7.1 нужно только один блок Catch на то, чтобы выловить все Exceptions.

Который раз убеждаюсь, что строгость = благо (не всегда сейчас и сразу, но всегда в будущем, в перспективе).

Wordpress, кстати, полностью нарушает SOLID, конечно, благодаря этому он такой гибкий, и такой... шаткий, уязвимый.

serval:
Естественно. Ещё за плагины к вордпрессу платить?

Проржал с этого поста)) в нем вся суть wordpress.

obius:
МВЦ в действие, любо-дорого
mendel:
я просто пример MVC привожу

Есть только одна проблема: при использовании MVC у вас должен быть шаблонизатор, потому как на данный момент ничто не мешает сайту отвалиться из-за Syntax Error, ну или какой-нибудь мудак сможет во View сделать eval или ещё какую-то хрень. Ну, то есть, само по себе решение с шаблонизацией в виде PHP нельзя назвать не правильным, но зависимость работы приложения от View все равно остается. Ещё, кстати, PSR немного глаз мазолит, но это уже такое)) хозяин - барин.

obius, может быть если тип булев, то радио (чекбокс)

borisd:
Ну дык, есть логика разделения содержимого и оформления, а есть инструментарий для этого. Это разные вещи. Использование ПХП в качестве шаблонизатора вполне нормально и логично. Мне например, нравится. Главное, на логическом уровне стремиться отделять оформление.

Да, PHP вообще сам по себе шаблонизатор))

Дело в том, что WP использует методологию ООП только наполовину, отсюда и полное несоблюдение SOLID, отсюда имеем темы, которые добавляют функционал в движок (несомненно, это гибкость), но когда мы попытаемся уехать на другую тему, мы поймем, что стали сами заложниками неправильной архитектуры, для чего и придумана концепция MVC (или любая другая хорошо зарекомендовавшая себя).

Популярность WP обусловлена тем фактом, что пока все создатели CMS делали продукт, удобный для программистов (ООП, MVC), WP делали продукт, удобный для конечного пользователя: репозиторий плагинов с установкой из админки, удобный интерфейс, черновики и прочее. Как результат: большой спрос среди пользователей, которые, в свою очередь, сделали спрос на программистов. Тут злую шутку сыграл PHP и его процедурный стиль: чрезвычайно низкий порог вхождения, и, как результат, куча плагинов, сделанных на коленке, что и дало вторую волну пользователей.

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

Так мы и получили блоговый движок, на котором делают интернет-магазины.

Оптимизайка:
Have you tried to run siege on different machine?

Нет, но, кстати, вполне возможно что проблема в этом, так как ранее fsockopen ошибка была у siege. Попробую долбануть по VPSке чуть позже, посмотрим что покажет.

---------- Добавлено 28.11.2016 в 18:08 ----------

Короче говоря, протестил на VPS, долбил с домашнего ПК, при максимально возможном concurrency установленным в 1000, получил следующее:

top - 10:48:59 up 9 days, 22:50,  1 user,  load average: 0.43, 0.20, 0.07
KiB Mem: 1048576 total, 333532 used, 715044 free, 0 buffers
KiB Swap: 0 total, 0 used, 0 free. 269852 cached Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20597 root 20 0 35080 21392 3108 R 37.6 2.0 1:21.13 main
1 root 20 0 35440 4812 1432 S 0.0 0.5 0:03.38 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd/11+
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper/1101
200 root 20 0 49212 1192 720 S 0.0 0.1 0:00.00 systemd-ude+
312 syslog 20 0 168088 18912 896 S 0.0 1.8 0:12.15 rsyslogd

А в siege получил следующее:

** SIEGE 3.0.8
** Preparing 1000 concurrent users for battle.
The server is now under siege...
Lifting the server siege... done.

Transactions: 100464 hits
Availability: 100.00 %
Elapsed time: 166.97 secs
Data transferred: 36.31 MB
Response time: 1.15 secs
Transaction rate: 601.69 trans/sec
Throughput: 0.22 MB/sec
Concurrency: 692.43
Successful transactions: 100466
Failed transactions: 0
Longest transaction: 32.33
Shortest transaction: 0.05

При этом Longest transaction чрезмерно высокий, хоть доступность и 100%. Изменил nofile до 40000 (на сервере он тоже был 1024). Увеличил trans/sec до 710 и Longest Transaction упало до 9~ секунд, при этом load average не поднялось выше 0.5, что для меня является приемлемым вариантом (никак не 200+ load average на четырех-то ядрах!) для VPS за 300 рублей. Всем спасибо. Думаю, что проблема решена, но если есть ещё предложения/догадки как ускорить - пишите.

Всего: 1540