Посмотрите у меня в подписи хостинг-провайдер Fozzy, ссылка реферальная, можете прямо в гугле так и вбить если напрямик. У них есть VPS за 1899 рублей, за эти деньги получите это. Сам пользуюсь у них хостингом, и планирую скоро переехать на VPS.
Из того что нравится, очень быстрый и вежливый саппорт, который всегда помогает и объясняет, новое оборудование, аптайм на хостинге ещё ни разу сайт не падал за три месяца. Мои сайты разместил в ДЦ Webzilla NL. Можете попросить тест у них в онлайн-чате, вроде они предоставляют. Промокод внизу на скидку. Если будут вопросы - пишите, отвечу.
я разок натыкался на такую штуку, в которой описание товара:
а) проверялось на уникальность
б) проверялось на ошибки через Yandex Spellchecker
Так вот, пока вся эта хрень не пройдет валидацию, товар добавить нельзя
Точно также можно повесить required на поля, которые отвечают за SEO, а ещё лучше - генерировать их динамически (placeholder), но давать возможность изменить вручную.
Табы - удобная штука, чтобы структурировать карточку.
Цены + Артикулы / Описание + SEO / Характеристики / Фото + Видео / Дополнительные страницы
Какую альтернативу предложите вы? Бесконечный скролл?
Крутой аппарат, я бы тоже если бы брал Cayenne, то дизельный бы взял. Оптика матричная что-ли?
Это проблема 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 { // ... }
Почему выполнен-то? Они регистрируются на этапе Syntax Analysis, но не выполняются. Да, появляются зарегистрированные функции, но процессорного времени они не жрут особо. Да, мертвый код плохо, но мы говорим о CMS, а это всегда какое-то универсальное решение, а значит и функционал будет размазанный (кто-то будет все функции использовать, а кто-то 20% от всего списка). Именно поэтому крупные сайты пишут под себя с нуля или на микрофреймворках, чтобы не платить денежку за ресурсы, которые при Highload обходятся дорого.
Да, подключение класса обычно происходит 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 = 1var b int = 2a, 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, конечно, благодаря этому он такой гибкий, и такой... шаткий, уязвимый.
Проржал с этого поста)) в нем вся суть wordpress.
Есть только одна проблема: при использовании MVC у вас должен быть шаблонизатор, потому как на данный момент ничто не мешает сайту отвалиться из-за Syntax Error, ну или какой-нибудь мудак сможет во View сделать eval или ещё какую-то хрень. Ну, то есть, само по себе решение с шаблонизацией в виде PHP нельзя назвать не правильным, но зависимость работы приложения от View все равно остается. Ещё, кстати, PSR немного глаз мазолит, но это уже такое)) хозяин - барин.
obius, может быть если тип булев, то радио (чекбокс)
Да, PHP вообще сам по себе шаблонизатор))
Дело в том, что WP использует методологию ООП только наполовину, отсюда и полное несоблюдение SOLID, отсюда имеем темы, которые добавляют функционал в движок (несомненно, это гибкость), но когда мы попытаемся уехать на другую тему, мы поймем, что стали сами заложниками неправильной архитектуры, для чего и придумана концепция MVC (или любая другая хорошо зарекомендовавшая себя).
Популярность WP обусловлена тем фактом, что пока все создатели CMS делали продукт, удобный для программистов (ООП, MVC), WP делали продукт, удобный для конечного пользователя: репозиторий плагинов с установкой из админки, удобный интерфейс, черновики и прочее. Как результат: большой спрос среди пользователей, которые, в свою очередь, сделали спрос на программистов. Тут злую шутку сыграл PHP и его процедурный стиль: чрезвычайно низкий порог вхождения, и, как результат, куча плагинов, сделанных на коленке, что и дало вторую волну пользователей.
На данный момент, Wordpress держится за счет стоимости разработки сайта на нем, т.к. на него придумали уже все что можно, и даже больше, и под любую задачу (кеш, поиск, похожие посты) есть как минимум один плагин и альтернатива к нему, и все это бесплатно! Вот и получаем, кризис, недостаток денег в кармане у заказчика, выбор подходящего варианта падает на WordPress.
Так мы и получили блоговый движок, на котором делают интернет-магазины.
Нет, но, кстати, вполне возможно что проблема в этом, так как ранее 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.07KiB Mem: 1048576 total, 333532 used, 715044 free, 0 buffersKiB Swap: 0 total, 0 used, 0 free. 269852 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND20597 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 hitsAvailability: 100.00 %Elapsed time: 166.97 secsData transferred: 36.31 MBResponse time: 1.15 secsTransaction rate: 601.69 trans/secThroughput: 0.22 MB/secConcurrency: 692.43Successful transactions: 100466Failed transactions: 0Longest transaction: 32.33Shortest transaction: 0.05
При этом Longest transaction чрезмерно высокий, хоть доступность и 100%. Изменил nofile до 40000 (на сервере он тоже был 1024). Увеличил trans/sec до 710 и Longest Transaction упало до 9~ секунд, при этом load average не поднялось выше 0.5, что для меня является приемлемым вариантом (никак не 200+ load average на четырех-то ядрах!) для VPS за 300 рублей. Всем спасибо. Думаю, что проблема решена, но если есть ещё предложения/догадки как ускорить - пишите.