Это копия, сохраненная 27 сентября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
В нашем треде отвечают почти на все вопросы, только бампайте каждые 5 дней. И не разводите флуд, если вам скучно, лучше сходите погрейте голову на улице, например.
Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Предыдущий тред был тут: >>1415604 (OP) . Все старые треды есть в архиве: https://phpclub.tech/ (там есть поиск, так что можно легко найти обсуждение какой-то задачи или ответы на свой старый пост) или ищутся в гугле по словам "клуб изучающих php" и в архиваче.
Мейлач лежит? Есть запасной тред на доброчане: /s/res/23225.xhtml#i46467
Форматируй свой код, если хочешь, чтобы его читали (как, написано во втором посте).
Правила: ведем себя воспитанно, помогаем новичкам, читаем учебники, решаем задачки, постим ссылки на решения, ОП их проверяет и дает советы и замечания. ОП заходит редко, где-то раз в 2-3 дня, у него мало времени, не жди его, решай задачки дальше. ОП отвечает на все вопросы по его задачкам и учебнику, а вот насчет каких-то других вещей - только если останется время. Но в треде немало анонимных экспертов разного уровня, так что вряд ли вопрос останется без ответа.
С чего начать
У нас есть свои уроки по основам PHP, они собраны и выложены по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не читайте, не сохраняйте, не запоминайте его, он временный). Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то можно начать с него. Он простой и понятный. Там есть задачи, их нужно решать (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению. С другой стороны, если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.
Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Visual Studio Code, Netbeans PHP или PhpStorm (с ним будет удобнее).
Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.
Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP, этого недостаточно. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование.
Надо переходить к более серьезным задачкам, которые научат тебя всему этому.
- для начала прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- установи Апач + PHP (советы выше и ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, PDO, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony 3/Doctrine 2
- Почитать про паттерны http://designpatternsphp.readthedocs.org/ru/latest/README.html (если ты не изучил ни одного фреймворка, то это будет рановато), тут с примерами кода http://designpatternsphp.readthedocs.org/ru/latest/README.html . Имей в виду что без примеров использования их учить бесполезно - не поймешь, хочешь увидеть примеры использования паттернов - ковыряй исходники Симфони, например Symfony Forms. Не заучивай паттерны - смотри код и думай, зачем тут они использованы.
Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:
https://github.com/codedokode/pasta/blob/master/soft/php-install.md
https://github.com/codedokode/pasta/blob/master/soft/apache-install.md
Может тебе понадобится пользоваться командной строкой, вот гайд https://github.com/codedokode/pasta/blob/master/soft/cli.md
Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.
Параллельно стоит подучивать английский, на первых порах можно без него, но по мере развития придется все чаще сталкиваться с англоязычными статьями, так что лучше не откладывать. Читать можно news.ycombinator.com - это что-то вроде их хабра. Также можно начинать смотреть фильмы и видео на английском.
Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.
- HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://github.com/codedokode/pasta/blob/master/db/databases.md
Что почитать
- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
- Новости IT на англ. https://news.ycombinator.com/
- какой-то древний, устаревший, но большой и на русском справочник по веб-разработке, посоветованный аноном: https://starcat.dp.ua/doc/wdh/
Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492
У ОПа нет аккаунтов и групп вконтакте, в фейсбуке, в твиттере, все "пхп-треды" там поддельные.
Платиновые вопросы
- Почему PHP? Потому что вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета)
- Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery. У нас в треде были люди, которые практически с нуля учились и смогли найти работу.
- Что будут спрашивать на собеседовании если 0 опыта - гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись
- Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.
Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:
PSR-1: https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-2-coding-style-guide.md
Да хранят тебя и всех остальных аношек треда Небеса, вы заняты богоугодным делом
Как ни странно, такой элементарной хуйни там до сих пор не завезли.
Все поля валидируются одновременно всегда.
Эта кружка кофе была за твое здоровье, анон.
Одновременно это как? Можно пример валидаторов?
Хуеил. Это в рамках проверки ОДНОГО параметра запроса.
Если первое правило провалилось, остальные не проверяются.
А мне надо то же самое, только чтобы если валидация предыдущего ПАРАМЕТРА провалилась, то текущий проверяться вообще не будет.
Анон ты тупой?
if (если валидация предыдущего ПАРАМЕТРА провалилась) {
текущий проверяться вообще не будет
};
>А зачем тебе так нужно сделать вообще?
Ну как же, это ведь ЭКОНОМИЯ ПАМЯТИ ДЖУНИОР ПРИШЕЛ УСТРАИВАТЬСЯ НЕ СМОГ ПОМЕНЯТЬ ДВЕ ПЕРЕМЕННЫЕ БЕЗ ТРЕТЬЕЙ ПОВЕСИЛИ В ДВЕРНОМ ПРОХОДЕ ЭКОНОМИМ НА ПАМЯТИ УБИВАЕМ ЗА ЛИШНИЙ IF НА РАБОТЕ ОБЩАЕМСЯ ПОЛУ-СЛОВАМИ СРЕМ В ОДНО ВЕДРО В ЦЕНТРЕ КОМНАТЫ ЧТОБЫ ОПТИМИЗИРОВАТЬ ПОХОДЫ ПО ТУАЛЕТАМ ПРИВЯЗАЛ К ЛОКТЮ ШВАБРУ - ВПЕРЕД - ПЕЧАТАЮ КОД, НАЗАД - ВКЛЮЧАЮ КОФЕ-МАШИНУ ЗА СПИНОЙ ЭКОНОМИЯ МЫШЕЧНОЙ АКТИВНОСТИ 2% ВСЕ ОПТИМИЗИРУЕМ ЧТО МОЖНО ОТРЕЗАЕМ СОТРУДНИКОВ ПО ПОЯС ЧТОБЫ СЫКАНОМИТЬ НА ШТАНАХ РЯЯЯ МЫ СМАЯ АПТИМАЛЬНАЯ КОНТОРА В ВОРОНЕЖЕ
Истерика на ровном месте. Отлично.
В поле1 указывается токен от соц-сети, но он может быть хуевым.
С помощью этого токена делается запрос в соц-сеть, чтобы проверить поле2.
Поле2 не имеет смысла проверять, если токен в поле1 говно
Да попизди мне тут еще, получше тебя знаю
Пиздец блять. Что в манямирок не вписывается - так нинужно или невозможно.
йо, товарищи, есть некий проект, в котором нужно реализовать комментирование контента без регистрации и использования сторонних систем комментирования ибо не везжает в концепцию и не хочется приплетать стороннюю верстку по тем же причинам . Так вот, делаю я такое впервые, и вопрос - как это дело контролить модерировать и банить сквернословных залетных, как это происходит, например, на имиджбордах? Алсо целевая аудитория не сильно широкая и плебейская, так что вряд ли будет много грязи, адмитить-модерировать будет от силы пара человек, но какие-то минимальные инструменты контроля нужны
у валидатора есть метод sometimes
$v->sometimes('reason', 'required|max:500', function ($input) {
return $input->games >= 100;
});
так же у валидатора есть метод after, и то и другое можно вызывать в withValidator в FormRequest например, короче я к тому что способов сделать как тебе надо много, это будет канеш не так K P A C U B O но это похуй
Ты расскажи нормально что за задача
>Пиздец нахуй пятый год в погромировании
я тоже пять лет со скейтерами из двора тусовался и думал что я типа продвинутый и могу оли-оли крутить
делай матерный словарик. Или вообще премодерацию забубень, пусть каждое сообщение отображается только когда твой модер галочку поставит. Они правда офигеют там все читать
Проверь mod_rewrite, если apache на openсервере используешь
Бизнесу насрать на экономию памяти - ему важнее скорость разработки и стоимость поддержки. А вот если васянить постоянно, то именно эти два фактора страдают.
Наблюдение такое.
Ты как партизан не афишируешь, нахуй тебе это надо.
С лаварелем я не знаком, работаю на симфони.
Аргументирую. В чистом виде такой хуйни нет, так как в принципе нет порядка валидации. Хуй его знает, как и в каком порядке ты будешь передавать поля. А привязывать логику валидации к тому, в каком порядке педрила с фронта расставил поля в формочке - это пиздос.
Я мог бы понять, если бы тебе требовалась кастомная валидация одних полей в зависимости от значения других, но ты упорно пиздел именно про порядок.
А, нет, я ебусь в глаза. Ты ответил.
Но ты всё равно хуй, так как сформулировал вопрос ты максимально некорректно.
вот тут ты сам себе противоречишь. Если бы ты не заморачивался надуманной проблемой из разряда "а чому у меня ифы в уже готовой конструкции не такие как я хочу! Надо бы переделоть!", то сыканомил бы уйму времени. По факту соглашусь, заказчику наплевать что там внутри, лишь бы работало. Это ты чистоплюй и перфекционист. Небось еще и моешься чаще чем раз в неделю, педота
У меня есть соединение на одной библиотеке NotORM и я на её основе хочу сделать Data Mapper. И у меня такой вопрос - мне этот маппер биндить в зависимости или просто вызывать в контроллере, передав ему соединение?
>мне этот маппер биндить в зависимости
Я бы сбиндил. Он же наверняка и в других контроллерах мелькнет?
Да наверняка мелькнёт. В той же админке должен ещё быть.
>Список абитуриентов — выводит имя, фамилию, номер группы, число баллов. Выводятся по 50 человек на страницу, сортировка по любому полю делается кликом на заголовок колонки таблицы
а как вообще это реализуется? Мне это делать джаваСкриптом/джиКверри, типа перестраивать ячейки таблицы по клику, или силами пшп-скрипта - по клику отправлять новую ссылку на эту же страницу с новыми параметрами сортировки и перезагружать результат?
Как обычно это делается? Я с аяксом пока не очень знаком
Cап, анусы. Значит пытаюсь тут запилить себе учебно-портфольный проект и завис на таком моменте - по легенде мне надо сделать простой сайт на php + sql, с регистрацией, логином и сессией, что я уже сделал, но теперь самое важное - как дать возможность залогиненному болванчику загружать изображения на сервер и желательно, чтобы он еще видел только свои хотя уже не суть. Простой аплоад с галереей уж делал без привязки, но тут прям завис в ступоре уже третий час. Хочется уже дропнуть и просто воткнуть на залогиненную страницу форму с аплоадом и кидать картинки так.
инб4 приходи через год
Создай ещё одну таблицу с полями ид картинки и ид соответствующего пользователя. Потом выгружай оттуда все картинки конкретного пользователя.
На этом задании джаваскрипт вообще не нужен. Только вёрстка и бэкенд. Сортировка делается по ссылке.
Просто посмотри как у других сделано.
Заголовок таблицы делается ссылкой, содержащей нужные параметры. Вот старый пост, где это обсуждалось: https://phpclub.tech/pr/res/1331378.html#1351739
Еще можно поискать в архиве по словам "ссылка сортировка", может что-то полезное найдешь? https://phpclub.tech/search/?q=ссылка+сортировка
Аякс ту не нужен, хотя с ним можно было бы сделать сортировку без перезагрузки страницы. Аякс желательно прикручивать поверх обычных ссылок (по принципу progressive enhancement), чтобы по-прежнему можно было скопировать и сохранить ссылку на страницу в определенном состоянии. Есть (была) библиотека pajax , которая большую часть работы берет на себя.
Задавай уточняющие вопросы, если что-то непонятно.
Спасибо, попробую разобраться
Без использования функций пхп.
Например:
Пользователь регистрируется и вводит пароль - "pass"
Я хеширую его - хэш("pass") и склеиваю с некоей уникальной каждый раз рандомной строкой random(str)
И все это пишу в базу - хэш("pass").random(str)
Но как потом ручками проверить когда пользователь снова зайдет на сайт? Он ведет "pass", но откуда к этому pass прицепить соль, если соль у меня получается из функции которая каждый раз рандомную строку возвращает?
Или соль берем из какой нибудь связки id+login+фамилия?
Соль в бд сохраняй и все
Не уверен что ты верно понял то о чем я спрашиваю.
В базе у меня хэш + рандомная соль.
Когда пользователь авторизуется и вводит свой пароль - от этого пароля вычисляется хэш, но как вычислится рандомная соль которая у меня хранится в базе?
Тоесть по факту я должен сравнить хэш от пароля что передал пользователь, с хэшем который у меня в базе. Но в базе у меня хэш + соль из рандомной строки. Как происходит сравнение.
Вот из доки инфа по password_hash()
Если не задано, то password_hash() будет генерировать случайную соль для каждого хешируемого пароля. Это предпочтительный режим работы.
Как эту случайная соль появляется в пароле который вводит пользователь.
Если что сорр за мою тупость.
Не говори:(
из мануала:
password_hash()
Использованный алгоритм, стоимость и соль будут возвращены как часть хеша. Таким образом, информация, необходимая для проверки хеша будет в него включена. Это позволит функции password_verify() проверять хеш без необходимости отдельного хранения информации о соли и алгоритме.
У меня есть парочка. Но я не скажу.
Соль это не часть пароля. Это случайно сгенерированная посл-ть символов. Ее назначение описано в моем уроке: https://github.com/codedokode/pasta/blob/master/security/password-hashing.md
В случае с password_hash она сама генерирует соль, потом получает хеш от пары (соль + пароль), и возвращает строку, содержащую и хеш, и использованную соль. Они используются в дальнейшем для проверки введенного пароля.
Задавай уточняющиевопросы, если что.
У меня был опыт общения, еще плоховато понимаю. А вообще уже все переписал и теперь все удаляется. Магия - стоит сюда написать, как все само собой решается.
>код
Я будто помолодел на 15 лет.
>>49258
>стоит сюда написать, как все само собой решается
https://en.wikipedia.org/wiki/Rubber_duck_debugging
>Теперь надо разобраться с удалением - оно не работает
Анон, есть хороший способ проверять запрос на работоспособность - просто берешь и выполняешь его в phpмайадмине. Тупо копируешь запрос из кода и вставляешь в поле/вкладку "запрос" пшпмайадмина. Если ошибка в запросе, то майадмин сразу тебе это напишет. Так ты хотя бы будешь знать где проблема - в коде пшп или в коде sql
>Тупо копируешь запрос из кода
Лучше включить логирование запросов в mysql и брать из лога. Особенно если пользуешься каким-нибудь фреймворком который запрос сам формирует.
Я поначалу вообще все запросы из пхпмайадмина тянул, только условия менял. Так и научился.
Есть библиотка https://github.com/Bogdaan/viber-bot-php
Если просто использовать её по инструкции, то всё работает: клиент пишет в вайбер сообщение, оно парсится ботом и если есть совпадение, то выдаётся стандартный ответ. А мне нужно, чтобы этот процесс разился на две фазы: приём сообщения из вайбера и отправка сообщения в вайбер. И чтобы и то и то были простыми функциями. С приёмом проблем нет, просто разбираем, что там пришло в webhook. А вот отправку я не понимаю, как сделать. Я засунул это всё в метод, метод в класс, но ничего не работает. И не пишет никаких ошибок, просто умирает, как только достигает команды $botSender = new Sender .
Честно говоря, я запутался в этих методах, вызовах, пространствах имён и прочем ооп. Посмотрите пожалуйста на код, что именно я там организовал не так? И как ловить и отлаживать такие ошибки? Даже когда я оборачиваю всё (вообще всё) в try, никаких эксепшенов не ловится.
https://pastebin.com/bMxDPt0y
Можешь зарегатьться на ютубе и вести блок обучающий пхп
Уточнение: я таки отловил ошибку Class 'Viber\Api\Sender' not found, но WTF? При подключении иде не ругается, значит видит этот класс. А если убрать use Viber\Api\Sender; или подключать левый класс Sender2, то сразу предупреждает, что такого нет. А на сервере не работает.
Создай бота который будет скачивать видео из webm тредов и переделывать их под void. А затем автоматически постить пока капча не заебет.
Закинул. Если просто сделать, как в примере и расположить этот код в webhook, на который приходит сообщение из вайбера, то всё отлично работает.
Есть уже живущий проект - архив PHP тредов по годам: https://phpclub.tech/
У него открытый код и есть issues, которые любой желающий может попытаться исправить: https://github.com/richBlueElephant/phpClub/issues
Отлично если работали с поисковым движком Sphinx, там 3 задачи только по нему одному.
Сап котаны. Закончил шарагу, проходил практику в ВУЗе там изучил Symfony и сделал проект на нем. Не потому что хотел, а потому что это в программе практики у них было.
В общем суть проблемы в том что у меня нет опыта работы, а вакансии где требуется Symfony большинство с опытом. Что делать?
Стоит ли вкатиться в laravel?
Город ДС2
Просто времени изучать еще 1 фреймворк нет, мне нужно срочно найти работу для того чтобы платить обучение на заочке.
Если интересен мой проект: http://relevantsearch.ru/
Алсо реквестирую специалиста Symfony знакомого с компонентом Messenger. Воркеры создаются, но асинхронность не работает.
Гуглил проблему, там все пишут, что: "Я просто обновил Symfony и все заработало)))))))))". НО блять У меня версия НОВЕЕ чем у тебя дебил и всеравно ничего не работает.
Кароче доработка проекта встала только из-за этого. Пробовал еще с другими бандлами поддерживающими очередь работать, но вечно лажа происходила.
за тем что бы при установки доп пакетов , библиотек и тд , классы с 1 и тем же именем не переопределяли друг друга.
в рф как и в всём пост совке (СНГ) весма мало продуктовых контор , потому симфони не нужно , а для средне малых подделок хорошо заходят RAD фреймы типа лары , потому их и юзают , так что да в неё вкатываться есть смысл
Ща звонили с собеседования про битрикс и Yii2. Что расскажешь по поводу него? Какие подводные?
Решил проблему добавлением такого заголовка: header("Access-Control-Allow-Origin: *");
>про битрикс
даже если будешь с голоду умирать даже не думай , прям вот совсем , лучше уже сдохнуть.
>Yii2
не плох как RAD фрейм , но монолитен прям от слова совсем , хорошо генерит код ля админок всяких (так нормальной альтернативы для лары и не нашёл) , довольно популярен в СНГ (скорее всего и только тут) , можно стартануть на нём.
Поиск проблемы был максимально непонятным. Как написано на вики - "браузер поддерживающий технологию CORS, передаст ошибку вместо данных." Chrome - выдавал ошибку, просто ошибку на этот запрос. Firefox - дал ответ с кодом 200.
извиняюсь и иду нахуй, если в шапке всё написано
вполне реально ибо у них разные двежки очевидно правила CORS по умолчанию по разному ставят
Попробуй вместо звездочки перечислить методы, в одном проекте у меня так решилось проблема
Это не я ебанутый, а тот инцел, который решил сделать передачу значения в функцию settype по ссылке.
В передыдущем треде пережёвывали - посмотри архив.
>>1445583
> Какие минимальные требования нужны чтоб взяли на работу ?
Открой hh.ru, поищи вакансии без опыта и сделай выводы.
>>1445953
> Вопрос про трейты.
> Есть приложение на фреймворке, зависимости подключаются через IoC.
> Есть набор классов, которые использовать надо в разных других классах.
> Я делаю трейт вида HuiDepenendencies, там подключаю зависимости и делаю геттеры.
> Далее в других разных классах включаю этот трейд
Вообще, для этого обычно используют DI контейнер. Смысла делать трейт на каждую зависимость я не вижу, плюс в таком варианте легко создать объект, не передав зависимость, и словить ошибку.
> Еще ты можешь использовать трейты, чтобы "разгружать" жирные классы и выносить связанные блоки логики в кирпичики-трейты.
> Например, я так разгрузил класс в 1000 строк, раскидав по трейтам связанные методы.
Сомнительный подход, по моему мнению, так как затрудняет изучение устройства класса.
>>1446336
> Делаю задачку по Slim, возник такой вопрос по фреймворкам - нужно ли абсолютно все зависимости пихать в контейнер, или некоторые классы можно подключать по ходу работы контроллера (т.е зависимости зависимостей не обязательно в контейнере держать)?
Удобнее все сервисы описывать к контейнере. И брать их из контейнера, чтобы не копипастить код создания объекта. Для контроллеров есть два подхода:
- описываем контроллер и его зависимости в контейнере
- не описываем контролллер в контейнере, но передаем ему контейнер в конструктор или метод. И уже там берем из контейнера нужные нам классы
>>1445583
> Какие минимальные требования нужны чтоб взяли на работу ?
Открой hh.ru, поищи вакансии без опыта и сделай выводы.
>>1445953
> Вопрос про трейты.
> Есть приложение на фреймворке, зависимости подключаются через IoC.
> Есть набор классов, которые использовать надо в разных других классах.
> Я делаю трейт вида HuiDepenendencies, там подключаю зависимости и делаю геттеры.
> Далее в других разных классах включаю этот трейд
Вообще, для этого обычно используют DI контейнер. Смысла делать трейт на каждую зависимость я не вижу, плюс в таком варианте легко создать объект, не передав зависимость, и словить ошибку.
> Еще ты можешь использовать трейты, чтобы "разгружать" жирные классы и выносить связанные блоки логики в кирпичики-трейты.
> Например, я так разгрузил класс в 1000 строк, раскидав по трейтам связанные методы.
Сомнительный подход, по моему мнению, так как затрудняет изучение устройства класса.
>>1446336
> Делаю задачку по Slim, возник такой вопрос по фреймворкам - нужно ли абсолютно все зависимости пихать в контейнер, или некоторые классы можно подключать по ходу работы контроллера (т.е зависимости зависимостей не обязательно в контейнере держать)?
Удобнее все сервисы описывать к контейнере. И брать их из контейнера, чтобы не копипастить код создания объекта. Для контроллеров есть два подхода:
- описываем контроллер и его зависимости в контейнере
- не описываем контролллер в контейнере, но передаем ему контейнер в конструктор или метод. И уже там берем из контейнера нужные нам классы
>>1446397
> Решил я тут посмотреть уроки по VueJS. ... Шоб оно все работало, надо написать в терминале: npm run dev
> Как это автоматизируется на практике? Например на линуксовом сервере?
Команда npm run dev скорее всего запускает сервер для разработки, который не годится для продакшена. Скорее всего она запускает какой-нибудь webpack в режиме отслеживания изменений в файлах, это нужно только на время разработки. В продакшене это не нужно, потому эта команда тоже не нужна.
Если ты написал фронтенд на JS, то ты какой-то командой делаешь сборку для продакшена. Некоторые собирают все в один огромный файл, который замедляет загрузку сайта, некоторые делают по-умному, набор из нескольких файлов. Если у тебя только фронтенд, и нет бекенда, то дальше тебе надо только выгрузить собранные файлы на продакшен. Это называется деплой.
Я не знаю, как именно у тебя настроен конфиг npm и вебпака, это по идее должен ты разобраться, какие файлы ты хочешь получить на выходе и что с ними надо сделать.
Для деплоя есть разные варианты: деплой через гит - ты просто пушишь коммит на сервер, а он уже делает сборку и помещает файлы в каталог веб-сервера. Некоторые пишут скрипты, которые копируют данные на сервер с помощью того же rsync. Некоторые пишут скрипты и запускают их через Jenkins или Gitlab.
Если у твоего приложения еще есть бекенд, то конечно, тебе надо как-то запустить на сервере программу-сервер. Сейчас почти все на systemd, потому логично сделать для этого systemd-юнит. Раньше, во времена syvinit, добавляли скрипт запуска сервера в /etc/init.d/, сервер запускали под супервизором, который перезапускает его в случае падения, а также ведет логи.
>>1446608
> пытаюсь заюзать get_browser(),
> но выдает ошибку "browscap.ini directive not set in <путь>"
> Прописал путь до нее в php.ini следующим образом
> [browscap]
> browscap = "F:\OpenServer\new_edition\OSPanel\modules\php\PHP_7.3-x64\browscap.ini" (без ковычек тоже пробовал)
> сохранил. Перезапустил openserver. обновляю страницу - опять та же самая ошибка.
Сделай файл с кодом <?php phpinfo(); и открой его через веб-сервер и браузер. Откроется большая синяя таблица, в ней найди browscap и посмотри, какое реально значение там выводится. Также в начале таблицы изучи список прочитанных ini-файлов. Есть несколько вариантов:
- ты неправильно назвал файл или поместил не в ту папку, и он не прочелся
- надо было использовать прямые слеши, а не обратные
>>1446397
> Решил я тут посмотреть уроки по VueJS. ... Шоб оно все работало, надо написать в терминале: npm run dev
> Как это автоматизируется на практике? Например на линуксовом сервере?
Команда npm run dev скорее всего запускает сервер для разработки, который не годится для продакшена. Скорее всего она запускает какой-нибудь webpack в режиме отслеживания изменений в файлах, это нужно только на время разработки. В продакшене это не нужно, потому эта команда тоже не нужна.
Если ты написал фронтенд на JS, то ты какой-то командой делаешь сборку для продакшена. Некоторые собирают все в один огромный файл, который замедляет загрузку сайта, некоторые делают по-умному, набор из нескольких файлов. Если у тебя только фронтенд, и нет бекенда, то дальше тебе надо только выгрузить собранные файлы на продакшен. Это называется деплой.
Я не знаю, как именно у тебя настроен конфиг npm и вебпака, это по идее должен ты разобраться, какие файлы ты хочешь получить на выходе и что с ними надо сделать.
Для деплоя есть разные варианты: деплой через гит - ты просто пушишь коммит на сервер, а он уже делает сборку и помещает файлы в каталог веб-сервера. Некоторые пишут скрипты, которые копируют данные на сервер с помощью того же rsync. Некоторые пишут скрипты и запускают их через Jenkins или Gitlab.
Если у твоего приложения еще есть бекенд, то конечно, тебе надо как-то запустить на сервере программу-сервер. Сейчас почти все на systemd, потому логично сделать для этого systemd-юнит. Раньше, во времена syvinit, добавляли скрипт запуска сервера в /etc/init.d/, сервер запускали под супервизором, который перезапускает его в случае падения, а также ведет логи.
>>1446608
> пытаюсь заюзать get_browser(),
> но выдает ошибку "browscap.ini directive not set in <путь>"
> Прописал путь до нее в php.ini следующим образом
> [browscap]
> browscap = "F:\OpenServer\new_edition\OSPanel\modules\php\PHP_7.3-x64\browscap.ini" (без ковычек тоже пробовал)
> сохранил. Перезапустил openserver. обновляю страницу - опять та же самая ошибка.
Сделай файл с кодом <?php phpinfo(); и открой его через веб-сервер и браузер. Откроется большая синяя таблица, в ней найди browscap и посмотри, какое реально значение там выводится. Также в начале таблицы изучи список прочитанных ini-файлов. Есть несколько вариантов:
- ты неправильно назвал файл или поместил не в ту папку, и он не прочелся
- надо было использовать прямые слеши, а не обратные
>>1446666
>>47478
> public function __construct($rate, $litresOfCoffee, $pgsOfDocs, $rank, $boss = false){
Это мы не проходили, но стоит использовать тайп-хинты, они защищают от ошибок и делают код читабельнее: https://www.php.net/manual/ru/functions.arguments.php#functions.arguments.type-declaration
>private function setRateWithRank(){
> if ($this->rank == 2) {
> $this->rate = $this->rate * 1.25;
> }
Это неудачное решение, так как ты в одном поле rate хранишь два разных значения: базовая ставка, и ставка, пересчитанная с учетом ранга. Ты затираешь базовую ставку, а это значит, если надо будет поменять ранг, то ты не сможешь легко вычислить новую ставку. Логичнее не хранить в одном поле два разных значения, а сделать два поля. Либо одно поле с базовой ставкой, а текущую ставку вычислять методом без сохранения в поле.
> private function setBossPrivelege(){
Тут та же проблема: начальные данные затираются.
> foreach ($this->employees as list($num, $position)) {
Этот способ хранения списка работников не очень-то ООП. С точки зрения ООП, наверно было бы правильнее сделать класс EmployeeGroup с полями "образец работника" и "кол-во". Но и такой подход будет плохо работать во второй части задачи, где надо менять зарплату и ранги людям.
Также, этот формат хранения не описан и трудно догадаться, глядя на конструктор класса Department, какой массив в него надо передать.
В общем, пока неплохо, делай тогда вторую часть про кризис, там недостатки кода, если они есть, вылезут наружу.
>>1447890
>>- зачем нужна таблица participant, если есть conference_reference? Я не понимаю, чем таблица participant отличается от conference_reference.
> Это денормализация чтобы получить конференцию по собеседнику, в случае приватных конференций
Тут мне кажется, непонимание. Я вижу, что в таблице conference_reference есть поля-ссылки:
- "user" -> на таблицу users
- "participant" -> на таблицу users
- conference -> на таблицу conference
А еще есть таблица participant с такими полями:
- user -> на таблицу users
- conference -> на таблицу conference
Соответственно вопрос, чем таблица participant отличается от conference_reference? Они обе содержат поля user и conference, и не хранят ли они одно и то же?
В моем понимании диалог выглядит так: есть conference, есть 2 ссылающихся на него conference_reference (вид на диалог со стороны каждого собеседника). Что тут делает таблица participant? На нее нет внешних ключей, то есть никто на нее не ссылается.
Вот определение этой таблицы: https://github.com/someApprentice/Crypter/blob/master/schema.sql#L152
Что касается денормализации для поиска существующего диалога, то поля user + participant в таблице conference_reference вполне решают эту проблему, как я понимаю.
> Да, id не как не используются для этих сущностный и не нужны. Вроде есть такой шаблон проектирования, когда создаются вспомогательные таблицы, которые ссылаются на основные, как бы соединяя их, и там нету поля id. Как он называется? Чтобы быть уверенным что я делаю.
Может быть, связь многие-ко-многим? Составной первичный ключ?
>> И еще, не отдаем ли мы тут детали ошибки на сервере пользователю
> Об этом нужно выдать ошибку пользователю. А вот ниже там действительно обрабатывается любая ошибка, но это только потому что я не знаю как обработать отдельные ошибки
По идее должно быть так: если происходит неожиданная ошибка, то это баг в программе. И мы логгируем ее в лог + отдаем пользователю общее сообщение об ошибке в программе без подробностей (в режиме отладки, если такой режим есть, можно с подробностями). В идеале, мы вообще не должны их ловить, а вебсокет-сервер должен их корректно обрабатывать сам. Но если он вместо этого падает, закрывая все соединения, то тогда ради стабильности можно их ловить самим.
Логгировать можно выводом в stderr, или попробовать разобраться с модулем logging: https://docs.python.org/3/library/logging.html
У тебя в коде есть комментарий:
> builtins.TypeError: catching classes that do not inherit from BaseException is not allowed
> except (InvalidSignatureError, UserNotFoundError, WrongTokenError, Exception) as e:
Это скорее всего из-за того, что классы не импортированы или импортированы неправильно и Питон путает их с какими-то другими классами. Для надежности можно отркыть исходный код, где они определены, и проверить, что они действительно наследуются от базового класса исключений.
> Тогда пришлось бы генерировать токен так как он генерируется в функции регистрации/логина. Не будет ли это положением теста на знание о том как генерируется токен?
Здесь вопрос в том, что именно мы хотим протестировать? Как звучат требования к модулю authenticator.py?
- "аутентификатор принимает валидный JWT токен, имеющий такую структуру: ...."
- или же "аутентификатор принимает токен неизвестного типа и структуры, выданный данной командой/функцией/методом API в PHP-приложении"
В первом случае, очевидно, мы должны получить этот токен с помощью функции генерации JWT токена или же сгенерировать его вручную какой-то командой и в комментариях описать эту команду. Чтобы другой разработчик мог сгенерировать токен сам и убедиться, что все верно.
Во втором - нам нужен интеграционный тест, который вызовет метод регистрации или логина в PHP-приложении, получит токен и передаст Питоновскому коду для проверки. Либо опять же, сгенерировать токен вручную и описать процедуру его получения в комментарии. Заметим, что в этом случае тест свалится при изменении структуры токена или приватного ключа.
Еще один вариант - попробовать "мокнуть" для тестов функцию декодирования токена (jwt.decode), заменив ее на свою функцию, возвращающую заранее известный результат для данного токена, вроде такого:
def mock_jwt_decode(token):
if token == 'token_for_alice':
return {"name": "Alice", "email": "
...
То есть убрать из теста JWT. Но в этом случае мы полагаемся на знание того, что токен является JWT токеном, знаем его структуру и знаем, что тестируемый код использует jwt.decode.
Проблема с вписанным вручную токеном в том, что непонятно, откуда он взят. Как мне проверить вручную, что он корректен? Как поменять что-то в нем? Код теста должен быть читабелен, и проверяем, а тут я не могу разобраться в нем. Та же проблема, кстати, с прописанными хешами паролей пользователей вот тут: https://github.com/someApprentice/Crypter/blob/57b4ce3025053507a6b65aeac81fdd07149445fc/wamp/tests/conftest.py#L19 - непонятно, как они получены. Такой тест трудно будет отлаживать другому разработчику. Может, в тестируемом коде ошибка, а может ты просто опечатался при копировании токена - как понять?
Какой из вариантов лучше - надо выбирать, взвесив плюсы и минусы. Намекну, что вариант с комментарием самый простой в реализации.
>>Что касается исключений при авторизации, мне кажется, их правильнее ловить в обработчике авторизации, а не тут:
> Делать блок try/catch?
Да. Чем мне нравится этот вариант - тем, что мы ловим исключение только в определенном месте кода. И код обработки исключения находится рядом с остальным кодом авторизации. ExceptionListener же ловит исключения со всего кода, плюс, нелегко догадаться о его существовании и о том, что в нем есть код, относящийся к авторизации.
Вот, например, у тебя есть код в ExceptionListener:
> if ($exception instanceof UniqueConstraintViolationException) {
> $response = new Response('Bad Request', Response::HTTP_BAD_REQUEST);
Как я должен понять, к какому контроллеру относится этот код? Наверно можно попробовать поискать по коду, где используется ограничение на уникальность, но это какой-то очень странный подход. Также, этот код ловит исключения отовсюду. Ты писал его для какого-то своего контроллера, но исключения ловятся и со всех других контроллеров, что может быть неожиданно для их авторов, которые этого не хотели.
>>1447890
>>- зачем нужна таблица participant, если есть conference_reference? Я не понимаю, чем таблица participant отличается от conference_reference.
> Это денормализация чтобы получить конференцию по собеседнику, в случае приватных конференций
Тут мне кажется, непонимание. Я вижу, что в таблице conference_reference есть поля-ссылки:
- "user" -> на таблицу users
- "participant" -> на таблицу users
- conference -> на таблицу conference
А еще есть таблица participant с такими полями:
- user -> на таблицу users
- conference -> на таблицу conference
Соответственно вопрос, чем таблица participant отличается от conference_reference? Они обе содержат поля user и conference, и не хранят ли они одно и то же?
В моем понимании диалог выглядит так: есть conference, есть 2 ссылающихся на него conference_reference (вид на диалог со стороны каждого собеседника). Что тут делает таблица participant? На нее нет внешних ключей, то есть никто на нее не ссылается.
Вот определение этой таблицы: https://github.com/someApprentice/Crypter/blob/master/schema.sql#L152
Что касается денормализации для поиска существующего диалога, то поля user + participant в таблице conference_reference вполне решают эту проблему, как я понимаю.
> Да, id не как не используются для этих сущностный и не нужны. Вроде есть такой шаблон проектирования, когда создаются вспомогательные таблицы, которые ссылаются на основные, как бы соединяя их, и там нету поля id. Как он называется? Чтобы быть уверенным что я делаю.
Может быть, связь многие-ко-многим? Составной первичный ключ?
>> И еще, не отдаем ли мы тут детали ошибки на сервере пользователю
> Об этом нужно выдать ошибку пользователю. А вот ниже там действительно обрабатывается любая ошибка, но это только потому что я не знаю как обработать отдельные ошибки
По идее должно быть так: если происходит неожиданная ошибка, то это баг в программе. И мы логгируем ее в лог + отдаем пользователю общее сообщение об ошибке в программе без подробностей (в режиме отладки, если такой режим есть, можно с подробностями). В идеале, мы вообще не должны их ловить, а вебсокет-сервер должен их корректно обрабатывать сам. Но если он вместо этого падает, закрывая все соединения, то тогда ради стабильности можно их ловить самим.
Логгировать можно выводом в stderr, или попробовать разобраться с модулем logging: https://docs.python.org/3/library/logging.html
У тебя в коде есть комментарий:
> builtins.TypeError: catching classes that do not inherit from BaseException is not allowed
> except (InvalidSignatureError, UserNotFoundError, WrongTokenError, Exception) as e:
Это скорее всего из-за того, что классы не импортированы или импортированы неправильно и Питон путает их с какими-то другими классами. Для надежности можно отркыть исходный код, где они определены, и проверить, что они действительно наследуются от базового класса исключений.
> Тогда пришлось бы генерировать токен так как он генерируется в функции регистрации/логина. Не будет ли это положением теста на знание о том как генерируется токен?
Здесь вопрос в том, что именно мы хотим протестировать? Как звучат требования к модулю authenticator.py?
- "аутентификатор принимает валидный JWT токен, имеющий такую структуру: ...."
- или же "аутентификатор принимает токен неизвестного типа и структуры, выданный данной командой/функцией/методом API в PHP-приложении"
В первом случае, очевидно, мы должны получить этот токен с помощью функции генерации JWT токена или же сгенерировать его вручную какой-то командой и в комментариях описать эту команду. Чтобы другой разработчик мог сгенерировать токен сам и убедиться, что все верно.
Во втором - нам нужен интеграционный тест, который вызовет метод регистрации или логина в PHP-приложении, получит токен и передаст Питоновскому коду для проверки. Либо опять же, сгенерировать токен вручную и описать процедуру его получения в комментарии. Заметим, что в этом случае тест свалится при изменении структуры токена или приватного ключа.
Еще один вариант - попробовать "мокнуть" для тестов функцию декодирования токена (jwt.decode), заменив ее на свою функцию, возвращающую заранее известный результат для данного токена, вроде такого:
def mock_jwt_decode(token):
if token == 'token_for_alice':
return {"name": "Alice", "email": "
...
То есть убрать из теста JWT. Но в этом случае мы полагаемся на знание того, что токен является JWT токеном, знаем его структуру и знаем, что тестируемый код использует jwt.decode.
Проблема с вписанным вручную токеном в том, что непонятно, откуда он взят. Как мне проверить вручную, что он корректен? Как поменять что-то в нем? Код теста должен быть читабелен, и проверяем, а тут я не могу разобраться в нем. Та же проблема, кстати, с прописанными хешами паролей пользователей вот тут: https://github.com/someApprentice/Crypter/blob/57b4ce3025053507a6b65aeac81fdd07149445fc/wamp/tests/conftest.py#L19 - непонятно, как они получены. Такой тест трудно будет отлаживать другому разработчику. Может, в тестируемом коде ошибка, а может ты просто опечатался при копировании токена - как понять?
Какой из вариантов лучше - надо выбирать, взвесив плюсы и минусы. Намекну, что вариант с комментарием самый простой в реализации.
>>Что касается исключений при авторизации, мне кажется, их правильнее ловить в обработчике авторизации, а не тут:
> Делать блок try/catch?
Да. Чем мне нравится этот вариант - тем, что мы ловим исключение только в определенном месте кода. И код обработки исключения находится рядом с остальным кодом авторизации. ExceptionListener же ловит исключения со всего кода, плюс, нелегко догадаться о его существовании и о том, что в нем есть код, относящийся к авторизации.
Вот, например, у тебя есть код в ExceptionListener:
> if ($exception instanceof UniqueConstraintViolationException) {
> $response = new Response('Bad Request', Response::HTTP_BAD_REQUEST);
Как я должен понять, к какому контроллеру относится этот код? Наверно можно попробовать поискать по коду, где используется ограничение на уникальность, но это какой-то очень странный подход. Также, этот код ловит исключения отовсюду. Ты писал его для какого-то своего контроллера, но исключения ловятся и со всех других контроллеров, что может быть неожиданно для их авторов, которые этого не хотели.
>>1447890
>>Так писать не стоит, это не keyword arguments из Питона и имена переменных не учитываются никак.
> А как понимать что за аргумент был передан?
Можно было бы добавить комментарий, но я думаю, лучше ничего не писать. Так как при рефакторинге ты можешь поменять имена аргументов, но забыть поменять комментарий и он начнет запутывать. Подсказывать должна IDE или переход к функции и просмотр ее заголовка глазами.
> Нужно тогда заранее определять переменные и передавать их?
Можно и так.
> Разве не нужно проверить что выдаются кукисы? Они ведь нужно для правильной работы приложения.
Можно проверить, что какая-то кука выдается, но ее наличие не равносильно авторизации, так как код может выдавать куку с некорректным значением, которая не пройдет проверку позже. Или это может быть кука для учета статистики, которая выдается всем подряд. А у тебя проверяется наличие 4 определенных кук. При изменении алгоритма авторизации, имен кук твои тесты сломаются. Потому я бы их вообще не проверял. То есть лучше не полагаться тут на знание механизма авторизации.
> Проверка авторизации выполняется тестом проверки доступа к разлогиниванию
Можно так, но я боюсь, что кто-то потом сделает этот метод доступным для всех и тест начнет врать.
>>Также, не надо копипастить огромные полотна кода, можно было сделать вспомогательную функцию для отправки запросов.
> Я как раз хотел спросить где хранить вспомогательные для тестов функции делать класс tests/Utils.php?
Можно сделать папку tests/Support/ или tests/Helper/
>>Соответственно тесты будут вида canLoginWithValidPassword, cannotLoginWithWrongPassword.
> Нужно разбить одну функцию на две?
Да, можно сделать два теста.
>>Далее, это ненадежный способ проверки, ведь речь тут о безопасности:
>>> if 'private.message.to.' in uri:
> Почему тот метод не надёжный?
Я немного ошибся, в данном случае уязвимости не возникает. Она бы могла возникнуть в таком случае:
if 'private.message.to.' in uri and is_anonymous:
return True
так как тут аноним мог бы получить доступ к методам вроде admin.view.private.message.to...
Потому лучше не использовать in вместо starts_with.
>>Микрооптимизация: регулярку можно скомпилировать один раз в начале скрипта и использовать скомпилированную версию.
> Зачем компилировать регулярку в начале скрипта?
Компиляция и разбор регулярки занимает крошечное, но время. Делая ее один раз в начале программы, мы экономим процессорное время. В PHP, например, есть кеш компилированных регулярок для оптимизации. Если ты вызовешь функцию preg_match() с одной регуляркой несколько раз, компиляция делается только один раз.
> М да, для группового чата так и нужно сделать. Вообще отправка 1000 уведомлений сделано, потому что, представим, пользователь очень популярен и каждый день получает 100 а может и 1000 новых сообщений от уникальных пользователей, и в итоге ему на всех нужно подписываться, что перенагрузит клиентское приложение. Гораздо лучше перенести эту нагрузку на серверную часть.
Да, тут надо подумать. Допустим, у нас есть 10 больших конференций, в каждой 1М пользователей:
- когда мы шлем уведомления каждому участнику, мы имеем 1М коннектов к wamp серверу и 1М подписок, а при обновлении в одной конференции шлем с PHP-приложения WAMP-демону 1М сообщений, которые он передает пользователям.
- когда мы используем свой канал обновлений для каждой конференции, мы имеем 1М коннектов и 10М подписок, а при обновлении в конференции PHP-код шлет единственное сообщение, которое демон разошлет 1М подписчиков
Но теперь представим, что из 1М участников онлайн только 100K:
- в первой схеме мы имеем 100k коннектов и 100k подписок, но при обновлении PHP-код по прежнему шлет 1М сообщений демону, так как PHP код не знает число подключенных пользователей
- во второй схеме PHP-код шлет одно сообщение демону, а тот рассылает его в 100K копий.
То есть, на мой взгляд, вторая схема работает лучше, позволяя убрать нагрузку с PHP-приложения. Конечно, нагрузка на демон получается неслабая, но он простой и легко масштабируется на несколько машин.
Есть еще вариант: поллинг. Для огромных чатов, клиент может периодически спрашивать у сервера про наличие обновлений в чате. Но это создает большую нагрузку на PHP код и базу, лучше наверно грузить WAMP-демон, он легко масштабируется, в отличие от базы.
Кстати, я как-то читал про протокол Телеграма, там сделано чуть интереснее. Там есть соединение с сервером, и клиент может слать API запросы (например: получить информацию о контакте, получить N сообщений из чата), и получать ответы. Но также сервер может слать клиенту уведомления по своей инициативе. Там нет явной подписки, так как сервер и так знает, какие у пользователя контакты и в каких группах он состоит. То есть по сути там пользователь, вступая в группу, автоматически подписывается на обновления в ней, и эта подписка не пропадает при отсоединении и переподсоединении. Аналогично сервер шлет информацию об обновлении информации в профиле контакта.
Но у Телеграма полностью самописный сервер.
> Только мне кажется что менять ключ не обязательно, потому что пользователь всё равно не сможет ни получить ни отправить сообщения, потому что API/WAMP его не авторизует для этого.
Речь о ситуации, когда пользователь авторизовался, вступил в чат, подписался на обновления в нем. Затем его выгоняют из чата, но авторизация на WAMP-сервере пройдена и подписка на обновления чата осталась.
> Да, об этой проблеме я уже осведомлён. Например, пользователь отсоединился на долгое время (несколько месяцев или год) и какой-то его собеседник или многие собеседники решили отредактировать или прочесть большое количество сообщений. И когда пользователь вновь откроет клиент, нужно обновить все эти сообщения. Очевидно, что нельзя подхватывать всё это большое количество сообщений сразу, и нужно подгружать их sequential, т.е. стримить.
Мне кажется, это не очень большая проблема. Сколько будет таких непрочтенных сообщений на практике? Ну тысячу, вряд ли больше. Тысячу записей можно легко передать в одном ответе API. Плюс, клиент может действовать по-умному, запрашивая обновления только когда пользователь попробует открыть чат.
> Да, это неудобно когда что-то редиректиться или выдается пустая страница.
Ну, этот редирект идет внутри JS-приложения и не виден пользователю. Под "пустой страницей" я имел в виду пустой чат с полем ввода сообщений.
> и если её ещё не существует, то мы просто не запрашиваем сообщения, а после отправки сообщения и её создания нас уведомит об этом WAMP и мы её реактивно подхватим.
Это на медленном соединении или в офлайне будет плохо работать: ты шлешь сообщение и оно появляется в диалоге с большой задержкой. Лучше было бы конечно локально его сохранить, отобразить, а затем пытаться отправлять в фоновом режиме.
>>Единственное, я не советую привязываться к текущей директории, чтобы ничего не ломалось, ...
> Текущая директория это какая?
Это та, что возвращается вызовом os.getcwd(), текущая директория процесса. В linux/win с каждым процессом связана "текущая" директория.
> Чтобы зашифровать голосовое/видео сообщение и сохранить его на сервер. Или не только сам контент сообщения, но и приложения к нему, например фотографию. Любая информация должна быть зашифрована.
Так можно делать это без сохранения в файл. Открываем исходный файл, читаем начало, шифруем, шлем на сервер. Берем следующий блок, шифруем, шлем на сервер. И так далее.
> Зашифрованные файлы весят больше?
Если мы отправляем файл с локального диска на сервер, то нам незачем создавать на диске зашифрованную копию этого же файла. Так как он у нас есть в расшифрованном виде.
>>1447890
>>Так писать не стоит, это не keyword arguments из Питона и имена переменных не учитываются никак.
> А как понимать что за аргумент был передан?
Можно было бы добавить комментарий, но я думаю, лучше ничего не писать. Так как при рефакторинге ты можешь поменять имена аргументов, но забыть поменять комментарий и он начнет запутывать. Подсказывать должна IDE или переход к функции и просмотр ее заголовка глазами.
> Нужно тогда заранее определять переменные и передавать их?
Можно и так.
> Разве не нужно проверить что выдаются кукисы? Они ведь нужно для правильной работы приложения.
Можно проверить, что какая-то кука выдается, но ее наличие не равносильно авторизации, так как код может выдавать куку с некорректным значением, которая не пройдет проверку позже. Или это может быть кука для учета статистики, которая выдается всем подряд. А у тебя проверяется наличие 4 определенных кук. При изменении алгоритма авторизации, имен кук твои тесты сломаются. Потому я бы их вообще не проверял. То есть лучше не полагаться тут на знание механизма авторизации.
> Проверка авторизации выполняется тестом проверки доступа к разлогиниванию
Можно так, но я боюсь, что кто-то потом сделает этот метод доступным для всех и тест начнет врать.
>>Также, не надо копипастить огромные полотна кода, можно было сделать вспомогательную функцию для отправки запросов.
> Я как раз хотел спросить где хранить вспомогательные для тестов функции делать класс tests/Utils.php?
Можно сделать папку tests/Support/ или tests/Helper/
>>Соответственно тесты будут вида canLoginWithValidPassword, cannotLoginWithWrongPassword.
> Нужно разбить одну функцию на две?
Да, можно сделать два теста.
>>Далее, это ненадежный способ проверки, ведь речь тут о безопасности:
>>> if 'private.message.to.' in uri:
> Почему тот метод не надёжный?
Я немного ошибся, в данном случае уязвимости не возникает. Она бы могла возникнуть в таком случае:
if 'private.message.to.' in uri and is_anonymous:
return True
так как тут аноним мог бы получить доступ к методам вроде admin.view.private.message.to...
Потому лучше не использовать in вместо starts_with.
>>Микрооптимизация: регулярку можно скомпилировать один раз в начале скрипта и использовать скомпилированную версию.
> Зачем компилировать регулярку в начале скрипта?
Компиляция и разбор регулярки занимает крошечное, но время. Делая ее один раз в начале программы, мы экономим процессорное время. В PHP, например, есть кеш компилированных регулярок для оптимизации. Если ты вызовешь функцию preg_match() с одной регуляркой несколько раз, компиляция делается только один раз.
> М да, для группового чата так и нужно сделать. Вообще отправка 1000 уведомлений сделано, потому что, представим, пользователь очень популярен и каждый день получает 100 а может и 1000 новых сообщений от уникальных пользователей, и в итоге ему на всех нужно подписываться, что перенагрузит клиентское приложение. Гораздо лучше перенести эту нагрузку на серверную часть.
Да, тут надо подумать. Допустим, у нас есть 10 больших конференций, в каждой 1М пользователей:
- когда мы шлем уведомления каждому участнику, мы имеем 1М коннектов к wamp серверу и 1М подписок, а при обновлении в одной конференции шлем с PHP-приложения WAMP-демону 1М сообщений, которые он передает пользователям.
- когда мы используем свой канал обновлений для каждой конференции, мы имеем 1М коннектов и 10М подписок, а при обновлении в конференции PHP-код шлет единственное сообщение, которое демон разошлет 1М подписчиков
Но теперь представим, что из 1М участников онлайн только 100K:
- в первой схеме мы имеем 100k коннектов и 100k подписок, но при обновлении PHP-код по прежнему шлет 1М сообщений демону, так как PHP код не знает число подключенных пользователей
- во второй схеме PHP-код шлет одно сообщение демону, а тот рассылает его в 100K копий.
То есть, на мой взгляд, вторая схема работает лучше, позволяя убрать нагрузку с PHP-приложения. Конечно, нагрузка на демон получается неслабая, но он простой и легко масштабируется на несколько машин.
Есть еще вариант: поллинг. Для огромных чатов, клиент может периодически спрашивать у сервера про наличие обновлений в чате. Но это создает большую нагрузку на PHP код и базу, лучше наверно грузить WAMP-демон, он легко масштабируется, в отличие от базы.
Кстати, я как-то читал про протокол Телеграма, там сделано чуть интереснее. Там есть соединение с сервером, и клиент может слать API запросы (например: получить информацию о контакте, получить N сообщений из чата), и получать ответы. Но также сервер может слать клиенту уведомления по своей инициативе. Там нет явной подписки, так как сервер и так знает, какие у пользователя контакты и в каких группах он состоит. То есть по сути там пользователь, вступая в группу, автоматически подписывается на обновления в ней, и эта подписка не пропадает при отсоединении и переподсоединении. Аналогично сервер шлет информацию об обновлении информации в профиле контакта.
Но у Телеграма полностью самописный сервер.
> Только мне кажется что менять ключ не обязательно, потому что пользователь всё равно не сможет ни получить ни отправить сообщения, потому что API/WAMP его не авторизует для этого.
Речь о ситуации, когда пользователь авторизовался, вступил в чат, подписался на обновления в нем. Затем его выгоняют из чата, но авторизация на WAMP-сервере пройдена и подписка на обновления чата осталась.
> Да, об этой проблеме я уже осведомлён. Например, пользователь отсоединился на долгое время (несколько месяцев или год) и какой-то его собеседник или многие собеседники решили отредактировать или прочесть большое количество сообщений. И когда пользователь вновь откроет клиент, нужно обновить все эти сообщения. Очевидно, что нельзя подхватывать всё это большое количество сообщений сразу, и нужно подгружать их sequential, т.е. стримить.
Мне кажется, это не очень большая проблема. Сколько будет таких непрочтенных сообщений на практике? Ну тысячу, вряд ли больше. Тысячу записей можно легко передать в одном ответе API. Плюс, клиент может действовать по-умному, запрашивая обновления только когда пользователь попробует открыть чат.
> Да, это неудобно когда что-то редиректиться или выдается пустая страница.
Ну, этот редирект идет внутри JS-приложения и не виден пользователю. Под "пустой страницей" я имел в виду пустой чат с полем ввода сообщений.
> и если её ещё не существует, то мы просто не запрашиваем сообщения, а после отправки сообщения и её создания нас уведомит об этом WAMP и мы её реактивно подхватим.
Это на медленном соединении или в офлайне будет плохо работать: ты шлешь сообщение и оно появляется в диалоге с большой задержкой. Лучше было бы конечно локально его сохранить, отобразить, а затем пытаться отправлять в фоновом режиме.
>>Единственное, я не советую привязываться к текущей директории, чтобы ничего не ломалось, ...
> Текущая директория это какая?
Это та, что возвращается вызовом os.getcwd(), текущая директория процесса. В linux/win с каждым процессом связана "текущая" директория.
> Чтобы зашифровать голосовое/видео сообщение и сохранить его на сервер. Или не только сам контент сообщения, но и приложения к нему, например фотографию. Любая информация должна быть зашифрована.
Так можно делать это без сохранения в файл. Открываем исходный файл, читаем начало, шифруем, шлем на сервер. Берем следующий блок, шифруем, шлем на сервер. И так далее.
> Зашифрованные файлы весят больше?
Если мы отправляем файл с локального диска на сервер, то нам незачем создавать на диске зашифрованную копию этого же файла. Так как он у нас есть в расшифрованном виде.
Чтобы изолировать код, который в него входит, от другого кода.
Как же хорошо, что я вовремя одумался и не покатился в пиздон наслушавшись советов с двача
Да я уже посмотрел вакансии, требования уровня php/js/sql/html/css, знаю все кроме пхп, вот и спрашиваю за сколько можно дойти до уровня, что могу работать.и вакансий в 10 раз больше чем на питониста
Скажи мне скажи мне
в чем годнота?
Ладно если у тебя контейнер - весь проект - Изи - но я так же могу и в xampp сунуть его и не пизди мне что у тебя клиент по сто раз на дню меняет окружение. Это редкость редкая когда тебе надо скакать между на столько рознящимися окружениями
Я не тот анон, но суть же не столько в вопросе смены окружения, сколько в лёгкости деплоя (используя Swarm или Kubernetes). Представь, что ты собрал какой-то проект у себя на сервере, и теперь тебе его нужно перенести на сервер заказчика. Без контейнеров тебе придётся поднимать сервер дважды - у себя и у него. А так - просто воткнул контейнер и всё сразу работает.
1) ЕОБ (есть одна борда), в процессе написания. Пользователь может загружать файлы картинок. Обработчик формы присваивает имена файлам с помощью microtime() или time() (какую функцию выбрать кстати?). Эти значения будут уникальными? Что будет, если два или более пользователя одновременно запостят картинки? Не существует шанса распидорасить сервер?
2) Есть исходные коды блога и форума, и два sql-файла к ним. Как правильно объединить базы для одного сайта? Слить sql-файлы в один (и это будет одна база, имена таблиц у блога и форума не совпадают), или подключаться одновременно к двум разным базам (это нормально?)? Как делают опытные люди?
>1
У тебя же есть посты с айдишниками - вот и прикрепляй к ним эти картинки.
>2
Неебу. Может миграции помогут.
Я только разобрался и поэтому не юзал. Но по опыту было не раз например так: мне дается сервер, на котором стоит сайт писаный под пыху 7.0. Повышать ее версию мне нельзя, но в тоже время имеется мой бот, написанный на 7.3. Обычно перепиливал бота под 7.0, сейчас бы мог использовать докер.
Но мне больше нравится не это, а то, что я могу по щелчку пальцев менять составляющие, локально, при разработке. Например быстро сменить мускуль на мариюдб и т.д.
Прикрепляю. Но мой вопрос про имена файлов. Вот как тут:
https://2ch.hk/pr/src/1446969/15647696144140.png (М)
microtime() или time() генерируют уникальные значения при использовании в обработчике формы?
есть скрипт который должен мне на почту через форму письмо отправлять
а он ничего не отправляет
даже в спам
https://ideone.com/RLlKiz
Как вариант делать хэш из микротайма и айдишника поста - коллизии будут минимальны.
К тому же никто не мешает те же айдишники и к файлам делать, которые с автоинкрементом. И не городить огород.
>// Email address verification, do not edit.
function isEmail($email) {
return(preg_match("/^[-_.[:alnum:]]+@((([[:alnum:]]|[[:alnum:]][[:alnum:]-]*[[:alnum:]])\.)+(ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|info|int|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)$|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.){3}([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$/i",$email));
}Аж обои отклеиваться стали. У пхп есть функция filter_var($email, FILTER_VALIDATE_EMAIL) для таких вещей.
Я тоже так подумал и радовался что не придется ебаться. Но админ на тесте каждый из микросервисов собрал в отдельные контейнеры тоесть уже различие с локалью где каждый сервис в контейнере. А у заказчика на серверах Винда.
Опиши проблему подробнее. Как ты устанавливал этот компонент, какой код добавил, что запускаешь, что ожидаешь, что получается. Какая ОС и веб-сервер.
Есть урок про пространства имен и автозагрузку: https://github.com/codedokode/pasta/blob/master/php/autoload.md
Вообще, держать 2 базы выглядит более здравой и бехзопасной идеей. Это, например, позволит разнести приложения на разные машины. Но это же потребует небольшого усложнения кода, чтобы в приложении была поддержка нескольких соединений с БД.
И, кстати, ты можешь сделать поддержку в коде для 2 баз, но использовать одну и ту же.
Зависит от целого ряда факторов, в первую очередь от умения пиздеть с умным видом и быстро как понос учиться.
Голый ПХП на самом деле нужен либо совсем ньюфагам, которым важнее на данном этапе пощелкать, как работает веб, либо матерым олдфагам пишущим какую-нибудь экзотику.
Реально все работают на фреймфорках-CMS. И у каждого фреймворка есть своя логика, в рамках которой и следует ебашить. Поищи, знания каких фреймворков требуются у тебя. Это у питона по факту один Джанго, у пыха цветущих и пахнущих (в разных смыслах) штук 20. Один из вариантов - сделать за неделю задачу со студентами и устроиться стажером за еду, уча то, что используется в конторе.
Главный совет - избегай БИТРИКСА. Он сука популярен в рашке и его использует куча студий. Данная хуйня представляет из себя достаточно мощный, но извращенный как половая ориентация Слаанеш фреймворк/CMS, который не научит тебя ничему хорошему. Связывайся, только если альтернативы ну совсем нет а жрат хочется.
А вот смотри, такой пример.
Я знаю все основы языка, включая ООП, понимаю, как работать с базами данных, умею писать базовые запросы и составлять структуру БД. Но при этом у меня совершенно нет опыта в создании каких-то рабочих проектов на пыхе, потому что, как ты и говоришь, я всегда пилил все на CMS/CMF (преимущественно MODX). Но сейчас я хочу свои навыки поднять на рыночный уровень, чтобы найти нормальную работу, возможно даже завести трактор в перспективе. Нужно ли мне для этого пробовать реализовывать какие-то либо проекты на чистой пыхе, так сказать, для опыта и набивания скиллов? Или сразу сосредоточиться на каком-нибудь Ларавеле, попутно восполняя пробелы в знании самого языка?
Возможно, меня сейчас обоссут, но это
>Или сразу сосредоточиться на каком-нибудь Ларавеле, попутно восполняя пробелы в знании самого языка?
лучше.
Поясняю. Делая что-то на чистой пыхе, ты получаешь абстрактный некоммерческий опыт. В силу твоей неопытности - негативный, на своей жопе путем ошибок выясняя откуда растут ноги у современных паттернов проектирования. Я бы сделал задачу про студентов (она содержит необходимый минимум для ознакомления), посмотрел какой фреймворк используется в твоем города и устроился туда джуном, подтягивая недостающее.
Спасибо за ответ, сейчас проштудировал вакансии, в одних нужен ларавел, в других yii в третьих битрикс, в четвертых еще какие-то но самые популярные первые 2, битрикс я так понял сразу отпадает и что тогда учить лучше laravel или yii?
laravel. он сейчас самый популярный.
По нему советовали "Дмитрий Елисеев Сайт объявлений на Laravel". Сам не проверял, там 70 часов видео.
И от того же Елисеева есть интернет магазин на yii2, у него можешь еще и симфони посмотреть =)
>В силу твоей неопытности - негативный
Зато увереннее себя чувствуешь с инструментом. когда пальцы им поотшибаешь
Слыхал про совсем тупых макак, которые задрочили один фреймворк и не могут ни налево, ни направо.
>2019
>просить совета у двача
Какой посоветуете хостинг для домашнего проекта? Какой сами используете?
Они одинаковые все по-большому счёту. Можешь ещё на облачные платформы посмотреть.
Разрабатывал используя OPEN SERVER докер не преподавали.
На хостинге используется юбунта 16.04 и LAMP.
Устанавливал composer require messenger
В качестве шины была Doctrine MESSENGER_TRANSPORT_DSN=doctrine://default
Все настройки выставил по дефолту как в документации.
При попытке запустить воркера командой php bin/console messenger:consume async -vv
Не дописал:
Нихуя не работает, то одна ошибка вылетает, то другая. Почему другая? Потому что умники на гитхабе посоветовали редактрировать сам компонент. В итоге одну ошибку исправил, сразу появлялась другая. В конечном итоге проблема с сериалайзером была. Он почему то не работал. И вот я оказался тут.
Самое интересное что БЕЗ ШИНЫ и без настроек месенджера. Тоесть как показано в самом начале документации https://symfony.com/doc/current/messenger.html
Все сообщения хендлятся и воркер запускается.
Хотя по сути это уже не воркер, а обычный сервис. Потому что он выполняется синхронно.
Хочу вам вкинуть задачку и посмотреть, как быстро аноны додумаются до того, до чего я додумался за 1 час.
Как только прозвучит решение, до которого я дошел, или же близкое к нему - я сообщу, как сделал я.
Чисто для интереса, может я гораздо более тупой, чем думаю я до этого додумаются все за 5 мин или вовсе предложат лучшее, чем у меня.
Если будете постить решения хуже, чем у меня - я скажу, в чем минусы каждого решения.
Задача:
Юзеры могут создавать задания, которые запускаются по времени на сервере.
Формат - любой, который поддерживает CRON, но с точностью не более минуты.
Ориентируемся на то, что заданий может быть много, в районе 10к. (но не миллионы, это уже йоба-хайлоад, туда лезть не будем).
Задание - некий процесс, который может длиться от 0 до 1 секунды.
Дело происходит на пыхе. Задания хранятся в БД в отдельной таблице (в каком формате хранить - тоже подумай, хуле. Это может быть тупо cron-строка или же какие-то столбцы, смотри сам).
Как организовать запуск заданий, чтобы это жрало минимум ресурсов (оперативка, проц, время)?
Код никакой не нужен, просто описать словами, как бы вы что сделали
Лень долго думать (к тому же ты не описал возможную структуру задач).
В БД хранятся: строчка, описывающая задание (это может быть хоть eval код хоть ссылка на php скрипт), галочка выполнено/нет и время следующего выполнения.
Отдельный процесс (самое простое - крон) обходит базу, выбирает процессы, которые необходимо выполнить, и отрабатывает их. Самое простое - обходить их в цикле, если проблемы со скоростью - заводить подпроцессы на отдельные задачи (или группировать по 10 штук в процессе).
>время следующего выполнения
Бинго, ты понял самое главное. Надо хранить время следующего запуска.
Какие были еще варианты:
1. Добавлять пользовательские задания прямо в crontab. Можно с модификатором "&", чтобы они запустились одновременно. Минус в том, что каждое задание будет заново загружать все зависимости приложения, все классы фреймворка, вся эта хуйня будет происходить для каждого задания. Очень скоро тупо оперативки начнет не хватать, плюс эти манипуляции будут жрать процессор. Плюс - не надо дрочить всю таблицу заданий.
2. Хранить в базе задание крон в виде строки, каждый раз обходить всю таблицу и смотреть, надо ли выполнить это задание в данную минуту. Минус - надо дрочить КАЖДОЕ задание КАЖДУЮ минуту, очень долго и жрет процессор.
А если хранить в таблице время следующего запуска задания, то можно тупо sql-запросом выбрать сразу те задания, что нужно запустить в данный момент, не обдрачивая cron-строку каждого задания.
После выполнения обновляем время следующего выполнения.
Таким образом, всегда загружаются только те задания, которые действительно должны быть выполнены + зависимости загружаются только 1 раз.
Ну и да, можно всегда прикрутить, чтобы они в мультитрединге запускались, если есть такая необходимость.
Например, в моем случае это будет даже минус, ибо хоть задания и будут выполнены "более одновременно", но это увеличит нагрузку на сторонние сервисы.
А когда они выполняются последовательно, хоть точность и меньше, но и нагрузка на сервисы меньше.
Вообще, правильный URL - это вот этот: https://github.com/richBlueElephant/phpClub
Я подозреваю, никто не тестировал работу под виндой. Ты можешь попрбовать стать первопроходцем, и выявить (а может и исправить) баги под винду.
- php, composer под виндой работают
- cp - команда копирования, можно скопировать файл вручную через Проводник или командой copy, если ты предпочитаешь командную строку
- что касается make - эта команда выполняет команды, записанные в файле Makefile (почитать на русском про команду make можно тут: https://www.google.com/search?client=firefox-b-d&q=описание+команды+make)
Makefile - это вот этот файл: https://github.com/richBlueElephant/phpClub/blob/master/Makefile
Из него видно, что make migrate выполняет команду vendor/bin/doctrine-migrations migrations:migrate --no-interaction
Я думаю, что под винду там надо немного подправить ее вид, вроде vendor/bin/doctrine-migrations.cmd или может быть php vendor/doctrine/doctrine/something.php или как-то так
- sphinx под винду работает
- разрешения на папки ставить не требуется
В качестве сервера ты можешь использовать встроенный в PHP веб-сервер.
------
Также, есть еще 3 варианта:
- в Windows 10 есть WSL, WSL2 - это поддержка запуска линуксовых приложений в консоли. Ставим ubuntu и запускаем все, что надо
- в более ранних Windows можно установить msys или cygwin . Это линуксовые утилиты (bash, ls, cp, make итд), портированные под Windows. С ними, конечно, надо разбираться, и может придется немного подправить команды, но они позволяют в том числе запускать команду make.
- использовать виртуальную машину с линуксом. Придется немного повозиться с настройкой, а также, в ней программа будет работать немного медленнее
------
В помощь тебе - набор минимальных знаний о командной строке: https://github.com/codedokode/pasta/blob/master/soft/cli.md
------
Если что-то еще непонятно, задавай уточняющие вопросы.
Вообще, правильный URL - это вот этот: https://github.com/richBlueElephant/phpClub
Я подозреваю, никто не тестировал работу под виндой. Ты можешь попрбовать стать первопроходцем, и выявить (а может и исправить) баги под винду.
- php, composer под виндой работают
- cp - команда копирования, можно скопировать файл вручную через Проводник или командой copy, если ты предпочитаешь командную строку
- что касается make - эта команда выполняет команды, записанные в файле Makefile (почитать на русском про команду make можно тут: https://www.google.com/search?client=firefox-b-d&q=описание+команды+make)
Makefile - это вот этот файл: https://github.com/richBlueElephant/phpClub/blob/master/Makefile
Из него видно, что make migrate выполняет команду vendor/bin/doctrine-migrations migrations:migrate --no-interaction
Я думаю, что под винду там надо немного подправить ее вид, вроде vendor/bin/doctrine-migrations.cmd или может быть php vendor/doctrine/doctrine/something.php или как-то так
- sphinx под винду работает
- разрешения на папки ставить не требуется
В качестве сервера ты можешь использовать встроенный в PHP веб-сервер.
------
Также, есть еще 3 варианта:
- в Windows 10 есть WSL, WSL2 - это поддержка запуска линуксовых приложений в консоли. Ставим ubuntu и запускаем все, что надо
- в более ранних Windows можно установить msys или cygwin . Это линуксовые утилиты (bash, ls, cp, make итд), портированные под Windows. С ними, конечно, надо разбираться, и может придется немного подправить команды, но они позволяют в том числе запускать команду make.
- использовать виртуальную машину с линуксом. Придется немного повозиться с настройкой, а также, в ней программа будет работать немного медленнее
------
В помощь тебе - набор минимальных знаний о командной строке: https://github.com/codedokode/pasta/blob/master/soft/cli.md
------
Если что-то еще непонятно, задавай уточняющие вопросы.
Я лучше сдохну в мучениях чему буду пытаться запустить Makefile на Windows. Спасибо за ответ.
Спасибо, поправил URL репозитория (хотя гитхаб умеет редиректить со старого URL на новый). Добавил в README больше словесных описаний, объясняющих что делают консольные команды. К сожалению, нет возможности проверить как проект работает под виндой.
>>50808
У AWS есть EC2, первый год пользования бесплатно. Только это не хостинг, а VPS, что даёт больше свободы. Нужно привязать данные кредитной карты, откуда снимут 1 доллар для проверки.
>>51448
Использование утилиты make не обязательно, в Makefile просто сокращения для консольных команд, которые можно выполнить и без make.
Подскажите ньюфагу, где можно почитать или посмотреть на проект, идеально было бы пхп-sql-js, где реализовано разделение юзеров на разные сессии и аккаунты, т.е каждый работает в своем аккаунте и сессии. Если там еще будет crud, то я помру от счастья.
Спасибо, но я еще во фреймворках понимаю чуть более, чем нихуя. Насколько по сравнению с ванильным пхп там сложнее восприятие кода?
Если тебе сделать нужно то намного проще, потому что все готово. Если если разобраться как сделано то все хуево, нужно разгребти кучи магии. С опытом там становится понятно как все работает внутри, но со старта разобраться это пиздец.
>если если разобраться как сделано то все хуево, нужно разгребти кучи магии
Зис, к сожалению. Гуглить\копипастить типовые решения я уже хорошо научился и так, но мой вкат сейчас застопорился именно на понимании работы в глубину процесса. Блядь, дошел до стадии, когда надо либо на практике учиться, либо искать наставника, но на работу не берут никуда, требований какой-то вагон, ну а наставники сами уже все заебались.
Ну если у тебя есть время, то самый простой способ: ставить себе задачу вроде той, что ты обрисовал, и садиться ее реализовывать. То, что непонятно - гуглишь, и потихоньку по кирпичикам собираешь решение своей задачи и получаешь знания.
Когда я начинал, я умел только верстать и натягивать верстку на MODX - там пэхэпэ вообще не нужен для базовых задач. А потом однажды получил заказ на кастомное решение, и сел писать, при том, что из PHP знал только echo(). В общем, когда я эту задачу решил, я уже знал все основы языка. После ещё нескольких таких задач я разобрался достаточно для того, чтобы сесть за документацию и изучить все нормально.
Раз у тебя есть хостинг не проще ли туда задеплоить проект свой через админку или ssh? Гит это не про то, что тобой описано.
Я не совсем понимаю конечную процедуру. Вот я доделал проект на локальном комьютере. Раньше я думал, что теперь мне надо сделать клон через гит и отправить его на сервер. Выходит, тут гит мне не поможет, и все тупо копировать вручную? А гит - это просто аз изменениями следить?
https://www.youtube.com/watch?v=qGYNbrT9P6Y
Вот, я кажется понял, что ты хотел. Но и про деплой на хостинги посмотри отделано и изучи.
Большое спасибо, анончик
Тебе понадобилось новое поле в таблице, ты написал в коде вывод этого поля во вьюхе (например) и написал миграцию с добавлением этого поля. Закомитил и отправил в репозиторий. Скрипт делоя увидел новый коммит спулил его и запустил миграцию. Конец истории.
Я немного про другое, например я добавил новое поле, но по логике приложения это поле computed из каких-то других полей, и нужно старые записи обновить каким-то масс апдейтом. Я вот и спрашиваю где лучше писать код этого масс апдейта, прямо в файле с миграциями?
Логически - да в файле миграций.
Пример: Ты ведешь разработку с кем то в команде, у каждого своя локальная база соответственно. Ты решил привнести свое сложное изменение базы - для других локально надо будет так же только запустить миграцию.
Но есть нюанс если у тебя на бою Большие данные и обработка всей базы по твоим новым правилам не влезет в 10 минут (или сколько там живет cli) то естественно тут будет другое решение.
Вот код: https://pastebin.com/VYB6rxjP
Там токен = 666666666. Но мне нужно, чтобы этот токен брался вообще не из кода, а из конфига, который в базе (достаётся из неё через getToken() ). Но если написать вместо protected $token = "666666666"; что-то типа protected $token =$this->getToken();, то пхп на меня смотрит очень укоризненно.
Суть в чем: тайпскрипт хорошая штука, но меня вымораживает, что любые внешние данные творят что хотят в моих строго типизированных для компиляции скриптах. Пришел null вместо числа? Ну все пизда тебе.
Как?! Как это всё правильно отрабатывать? Где проверять, преобразовывать, надо ли вообще. Как это делается в PHP? Опушка, помоги! SomeApprentice, ты нырнул глубоко в это дерьмо, может сможешь помочь?
Там в исходном классе уже есть конструктор (я просто его не показал). И когда вставляю в него $token =$this->getToken();, код не работает. Получается, это у меня где-то там косяк и так и надо было делать?
>$token =$this->getToken()
может всё такие $this->token?
или вообще сделай метод initToken() и вызывай его в конструкторе. Если ты наследуешь то не забывай про parent::__construct()
Тайпскрипт не занимается валидацией в рантайме и никогда не будет, так как это повлечёт изменение скомпилированного JS. Валидировать пришедшие данные из внешнего мира нужно вручную, однако есть библиотеки, облегчающие эту задачу. Ты описываешь правила валидации, а библиотека выведет TS тип, чтобы в коде не делать 2 раза похожую работу: описывать тип, а потом дублировать его правилами валидации. Примеры:
- https://github.com/pelotom/runtypes#example
- https://medium.com/@ottoki/runtime-type-checking-with-io-ts-in-typescript-14465169fb02
Вот тут на хабре люди рассказывают как борятся с проблемой:
- https://habr.com/ru/post/453502/
- https://habr.com/ru/post/450238/
У нас есть проект, где для рантайм валидации используется typestack/class-validator + typestack/class-transformer. Проблему решает, но код на декораторах получается перегруженным.
Если доступ к полю происходит через метод-геттер (в твоем примере aa() ) то просто переопределяешь этот метод в наследуемом классе чтобы он возвращал то что нужно (это одна из причин почему желательно использовать геттеры а не напрямую поля дергать). Если поле используется напрямую $this->token тогда нужно добавлять магии __get https://ideone.com/TPS1f7
>может всё такие $this->token?
Да, точно. Вызываю в конструкторе вот так:
$this->token = $this->getToken();
И в тестовом примере оно работает. А вот в коде, который модифицирую - нет. Завтра буду много думать.
Спасибо, завтра попробую.
Понял что у меня $symbol1 выводит что нужно, а $symbol2 весь текст так как выборка подстроки от 0 до -1, ну получается надо переписывать это по другому совсем, хули тут это ебка с этими кодировками, в питоне в одну строчку простейшую решается этот палиндром, какой же сложный язык.
Вообщем я сделал, но выглядит страшно, мне кажется очень всратое решение, если есть лаконичней и проще, прошу скинуть, вот мой:
https://ideone.com/tmn3Fh
Так.. Решил я значит прочитать в учебнике анона про задачу. Написано что земля пухом, если через strrev решать. Поэтому держи другой вариант =) http://ideone.com/PUpD1t
>Скрипт деплоя увидел новый коммит спулил его и запустил миграцию.
А можно об этом чуть подробнее? Что почитать, чтобы разобраться в этой теме?
мой код
@какая-то штучка
Я понимаю, что это дает подсказки для эклипсов и нетбинов и позволяет проще писать документацию, но это общепринятый стандарт или что? И нужно ли соблюдать табуляцию, чтобы звездочка на второй строчке шла обязательно ниже второй звездочки с первой строки? Или просто две звезды, одна, одна и две?
Извините, облажался. Там звездочки и камменты к коду
>А можно об этом чуть подробнее? Что почитать, чтобы разобраться в этой теме?
Тут разные варианты.
Например ваш админ повесил на крон скрипт который каждые 10 минут делает
git pull origin develop
php artisan migrate
Или другой вариант через gitlab ci
https://m.habr.com/ru/company/softmart/blog/309380/
Это phpDoc (вдохновлен и скопирован с JavaDoc). Это стандарт документирования, который позволяет автоматически парсить комментарии и создавать из них текстовую документацию, ну и как бонус, подсказки в IDE.
Хрень с @ в начале называется аннотация. Это тоже скопированы из Явы. В Симфони аннотации применяются и для других целей, например, задания правил проверок значений в формах.
Описание стандарта:
- кратко - https://ru.wikipedia.org/wiki/PhpDocumentor
- полный мануал со всеми аннотациями на англ: https://docs.phpdoc.org/
Вот какая документация получается на выходе: https://devdocs.io/symfony~2.8/symfony/component/filesystem/filesystem
Только не дублируй в комментариях то, что уже есть в коде. Если у тебя указан тип возврата функции:
function x(): string
То не надо писать в документации второй раз @return string.
Благодарю аноний
http://ideone.com/FFFpnc#stdin
Уже всё там прочесал, ошибок вроде нет, руководство тоже не помогает да, я тупенький в таких делах
Кажется, понял, спасибо. Я в коде указал "как бы очевидное"
https://ideone.com/r10PWb
Не могу понять как мне без 3-х инструкций echo сделать адекватный код. Всегда получается через 3 строки, даже если брать обычное умножение переменной на себя.
Ага, все дело в точках, которые я вижу впервые. Либо я читал как раздолбай, либо по гайдам еще рано для этого. Но в любом случае, спасибо
О, анон с моей проблемой. Думал минут 40 над этим, точек в гайде тоже не видел это который от ОПа. Решил отдохнуть, пока голова остынет
Не разрешение, мне вообще похуй на его разрешение.
Тип.
Есть какой аналог линухового file?
Она есть под любую ось.
Устанавливает пакеты по конфигурации composer.json
Основная идея в указании зависимостей:
Например пакет а версии 1.1 работает только с пакетом б версии 2.3 это указано в конфигурации пакетов по сему композер скачает тебе только совместимые версии.
Композер - это менеджер пакетов для PHP-библиотек. Библиотека - это один или несколько PHP-файлов с готовыми функциями, классами, константами, которые ты можешь подключить и использовать в своей программе, чтобы не писать с нуля то, что уже кто-то написал.
Ты создаешь файл composer.json, описываешь в нем названия и примерные версии нужных для работы твоего проекта библиотек. Затем ты запускаешь композер.
Он подбирает совместимые версии библиотек, записывает их в файл composer.lock, скачивает, установливает в папку vendor. Также, если этим библиотекам нужны другие библиотеки (зависимости), он подбирает их версии и тоже устанавливает. Затем он настраивает автозагрузку (автоматическое подключение файлов) для этих библиотек так, что тебе достаточно в своем коде подключить единственный файл (vendor/autoload.php).
Также, ты можешь прописать в composer.json правила автозагрузки для твоего кода, и он сделает автозагрузчик и для него тоже.
Все это можно делать вручную, но уйдет больше времени. Представь, если у тебя подключено 20-30 библиотек. Также, обновление потребует кучу времени, ведь тебе надо проверить их вручную для каждой библиотеки.
Композер работает в командной строке, потому, чтобы им пользоваться, надо сначала освоить её. У меня есть урок для начинающих: https://github.com/codedokode/pasta/blob/master/soft/cli.md
Не умно. Если в пакете A зависимость от пакета B с версией 1.0.0, тогда установив пакет A ты хуй установишь пакет B другой версии
О вот за это спасибо, очень красивое решение.
Делаю тупейшую вещь, просто ридерекчу любой запрос на один конкретный php-файл. Сервер - openserver.
Такое правило
RewriteEngine On
RewriteRule ^.$ /public/test.php приводит к ошибке 500
а такое
RewriteRule ^[a-z0-9]$ /public/test.php редиректит на test.php который и запускается.
Почему так?
бля, звездочки сожрались
Надо смотреть лог ошибок вебсервера (если под виндой, то в папке Апача logs, если в Линуксе. то /var/log/httpd или /var/log/apache2).
Под линусом для чтения файла надо быть админом или входить в группу adm.
Посмотри лог и поищи там ошибки, заодно нам расскажешь, в чем была проблема.
Зачастую бывают такие участки кода:
if (\file_exists($mediafile)) {
unlink($mediafile);
}
Можно писать их в одну строку гораздо короче:
\file_exists($mediafile) && unlink($mediafile);
Охуенная тема, примерно как с аннигиляцией скобочек с помощью return;
Если точку обернуть в квадратные скобки то перестает падать в ошибку 500.
Но
Из корня редиректит на нужный файл. Но стоит добавить хоть один символ и пишет ошибку "Объект не найден".
>>53296
На этой же версии опенсервера у меня крутится по кускам содранный из разных мест фреймворк
https://ideone.com/LK3A5l
и там все работает
Я решил получше разобраться в .htaccess и сразу обосрался
пс
а если такое правило написать :
RewriteRule ^([a-zA-Z0-9/-]"тут звездочка")$ /public/test.php?id=$1 - то норм редиректит и $_GET заполняет
И что за мода у некоторых разработчиков этих библиотек делать классы через статик?
Композер это годнота, базарю. Один раз попробуешь - больше не сможешь без него.
zend_extension = C:\php\ext\php_xdebug-2.7.2-7.3-vc15-x86_64.dll
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.profiler_enable=1
xdebug.profiler_output_dir="c:\php\tmp"
extension=php_mbstring.dll
Итог! Половина задач работает нормально, половина 502 Bad Gateway, хотя в самом phpstorm в консоли снизу ни одного замечания и решение выдается так как и нужно. Причем если задачи раскидать по файлам аля одна задача один файл - работать начинает практически все шо не работало за исключением некоторых, но у меня то все в одном файлике лежит одна задача под другой. Вроде бы разницы не должно быть, но нет. Вопрос ШО ЗА НАХ?!??!?! КАК ИСПРАИТЬ?!?!!?!?1
Например мне надо поставить пакет A и B. Оба зависят от пакета С, но разных версий. Из-за этого я не смогу одновременно поставить A и B.
Это специально сделано?
то есть в .htaccesse правилами не отсеиваешь файлы и папки.
А как тогда подгружаются стили и прочее барахло из public?
Не занимайся херней. Пиши на Sublime Text 3 и запускай локалку на OpenServer.
https://www.sublimetext.com/3
https://ospanel.io/
Ты вьелся в частный случай. Хочешь пакет каждый в свою среду окружения и тд и все это ради одного частного случая. Цель именно в строгости зависимости а ты хочешь все усложнить
Квадратные скобки выводят байт, а не символ. Из-за этого возникает проблема, потому что utf это многобайтовая кодировка. Используй mb_substr()
Спасибо, теперь разобрался.
Много ли профита от разных опенсерверов?
Вкину еще гайд хороший. Предлагаю в шапку добавить на перекатном
https://www.youtube.com/watch?v=a6xtQQqx1tg
(У него еще 2 части-продолжения есть)
Я с помощью js разбиваю файл на части по 5мб (chunks), а потом собираю их все вместе уже на сервере. У меня возникла проблема с авторизацией. Доступ к загрузчику файлов должен быть только у админа, поэтому перед загрузкой каждой части я проверяю куки пользователя и делаю запрос в бд перед отправкой файла, чтобы убедиться, что загрузку осуществляет админ.
Это нормальное решение в плане нагрузки на сервер? Меня очень смущает, что на каждую часть файла приходится sql запрос, можно как-то иначе решить этот вопрос? Как можно осуществить контроль к загрузчику без использования sql каждый раз? надеюсь понятно расписал
Возьми tus как готовое решение загрузки файлов по частям. Каждый блок там подписан хэшем. Так что кинешь проверку кук только на самый первый запрос загрузки дальше у тебя в очередь кусков уже никто не сможет влезть так что можно не проверять
На пикриле и задал значение Джонни синтаксу нейм.
Далее по условиям понятно, что если имя равно Пидар, то выводится хуидар и т.д. Почему вывелся хуидар, если имя не Пидор?
Поставь phpmd глобально и пакет для sublime соответствующий. Он будет тебе подсвечивать такие косяки
Когда более-менее разберёшься, то поймёшь, что этих ютубных хайпожоров лучше обходить стороной, а их уроки и подавно - это не программисты.
Понял. Ну, я не разобрался еще хорошо в этой теме, смотрю, т.к. более-менее рассасывает всё. Со мной ничего не случится плохого?
Да смотри что хочешь, только другим не рекомендуй ничего, тем более если мало опыта.
>Со мной ничего не случится плохого?
Ничего. Там же совсем ясли показывают.
Но я бы поискал что-то менее гнилое.
Поначалу вполне норм, но потом слишком медленно уже - читать быстрее. Сейчас только статьи всякие читаю интересные да доки посматриваю.
Понял
Я нагуглил. Если кто-то не знает пароль от этого, то просто в логине пишите root и можно логиниться
Пасиба
Сальный в треде
Вот получаю я информацию из БД, мне нужно её занести в массив экземпляров класса и потом уже передавать в контроллер?
Аналогично и с внесение данных в БД?
Зачем нужен класс Абитуриент, если можно сразу использовать данные полученные в классе таблицы?
Ты можешь из бд сразу экземпляры класса получать, это очень удобно. Гугли pdo fetch class
Попробовал на imgur грузить - без проблем, любые страницы (и сам файл) получаю тоже. А на телеграфе проблема. Что делать?
Не, там почти 4 выходит
Тебе надо разобраться, в чем может быть проблема. Цепочка тут довольно сложная: твоя программа использует расширение php_curl, а это расширение является прокладкой между php и сишной библиотекой curl (файл libcurl.dll или libcurl.so).
Соответственно, один из способов диагностировать проблему - это попробовать отправить тот же запрос утилитой командной строки curl, которая обычно идет в комплекте с библиотекой curl. У утилиты есть флаг -v, который заставляет ее писать подробности, например, вот команда для выполнения GET запроса:
curl -v https://example.com
Она выводит в том числе подробности установки зашифрованного SSL-соединения, и этап, на котором произошла ошибка.
Если ты используешь Линукс, то утилита curl может быть уже установлена, или ее надо будет установить менеджером пакетов. Если WIndows, то она скорее всего есть в том архиве, в котором была библиотека libcurl.dll.
Также, попробуй открыть https://telegra.ph из браузера - если он не открывается, то возможно, поработал Роскомнадзор, можешь обратиться к ним за решением.
Если сайт открывается в браузере, с большой вероятностью дело в том, что библиотека curl не содержит корневого сертификата для проверки сертификата telegra.ph. Некоторые в таких случаях отключают проверку сертификатов, но гораздо правильнее скачать/установить набор корневых сертификатов и в опциях curl в твоей программе указать путь к ним. В композере, например, есть библиотека https://packagist.org/packages/composer/ca-bundle которая автоматически скачивает набор сертификатов от Мозиллы, а в ридми написано, как ее подключить.
Ты мог бы тут заметить, что в той же Windows уже есть корневые сертификаты, почему curl их не использует? В мануале написано, что для этого нужна сборка curl с поддержкой библиотеки schannel: https://curl.haxx.se/docs/sslcerts.html
Он не про это вовсе
>библиотека https://packagist.org/packages/composer/ca-bundle
Установил, подключил, результат тот же.
>Роскомнадзор
Прокси есть.
api.telegra.ph и api.telegram.org открываются. telegram.org/ открывается, telegra.ph/ - SSL ошибка.
>Некоторые в таких случаях отключают проверку сертификатов
CURLOPT_SSL_VERIFYPEER, 0 cтавил - всё равно Failure when receiving data from the peer или SSL connect error. Откуда вообще SSL error, если я отключил проверку? Снова пробовал telegram.org/ и telegra.ph/ открывать - всё так же.
>используешь Линукс
Винда.
Что делать дальше, мастер? Думал на imgur перейти, разобрался с api, а там, оказывается, ограничение на кол-во загрузок.
Нужно проверять утилитой curl. Как ты устанавливал библиотеку curl? Если скачивал какой-то архив, то там наверняка есть утилита curl.exe. Ее надо поместить в одну папку с libcurl.dll и выполнить команду
curl -v https://telegra.ph/
Вот гайд по использованию консоли: https://github.com/codedokode/pasta/blob/master/soft/cli.md
Также, в PHP можно попробовать включить опцию для отладки:
curl_setopt($curlhandle, CURLOPT_VERBOSE, true);
Она пишет данные в поток ошибок (stderr), потому PHP скрипт надо запускать из консоли (командой вроде php myscript.php), а не через веб-сервер. Если запускать из-под веб-сервера, это либо пойдет в лог ошибок, либо неизвестно куда.
Если вдруг она ничего не выведет, то ты можешь попробовать перенаправить отладочную информацию в файл:
$verbose = fopen('c:/tmp/debug.txt', 'w+');
curl_setopt($handle, CURLOPT_STDERR, $verbose);
В общем, сделай минимальный PHP скрипт, который содержит только единственный запрос к серверу. И включи в нем опции для отладки, запусти его из консоли и посмотри, что получится.
Это же браузер сохраняет. Погуглил - решается редиректом. Там чел еще ссылку приложил - https://en.wikipedia.org/wiki/Post/Redirect/Get
Я тебе дал всю инфу, остальное уже ты проверяй пока не получится =) И эта кнопка тебя не спасет от сохраненных данных при обновлении. На неё же еще нажать надо.
Дополню еще. Если ты никак не можешь найти curl.exe (что плохо), просто скачай архив отсюда https://curl.haxx.se/windows/ , распакуй в отдельную папку, зайди в нее из консоли и запускай curl.exe из нее.
Если ты хочешь заставить курл использовать прокси, добавь опцию -proxy, например:
curl.exe -v -proxy http://1.2.3.4:12345 https://telegra.ph
Если что, полный список опций доступен при выполнении curl --help, или описан тут: https://curl.haxx.se/docs/manpage.html
Возможно, что курл не выведет особых подробностей, а просто напишет что не удалось установить SSL-соединение. Тогда нам нужен инструмент для тестирования SSL соединений, он тебе может пригодиться и в других случаях. Иди сюда https://indy.fulgan.com/SSL/ и скачай там один из архивов, например, openssl-1.0.2s-i386-win32.zip
Раскакуй его в новую папку, зайди в нее из консоли. Далее набери команду тестирования SSL соединения:
openssl.exe s_client -debug -connect telegra.ph:443
Заметь, что openssl просто проверяет установку SSL соединения, он не будет слать HTTP запрос. Если соединение успешно установилось, то набери что-нибудь, например,
GET / HTTP/1.0 (Enter)
Host: telegra.ph (Enter)
(Enter)
(Ctrl + Z, Enter чтобы завершить ввод)
Если что-то непонятно, то скидывай, что выведут эти утилиты. Увы, openssl прокси не использует.
Что ты имеешь в виду? Данные, введенные в форму, снова показывают после перезагрузки страницы? Или при вводе появляется список с ранее введенными данными?
Также, в любом случае тебе надо использовать паттерн Post/Redirect/Get. Про этот паттерн и другие вещи я написал в уроке про обработку данных форм: https://github.com/codedokode/pasta/blob/master/forms.md
Я устроился на 35к, щас 55 (полгода опыта)
>>55024
Вот вывод после как я понял авторизации проксей.
И вывод openssl s_client -connect telegra.ph:443 -msg
>>55010
Тут немного иначе:
successfully set certificate verify locations:
CAfile: D:\------------------\composer\ca-bundle\src/../res/cacert.pem
CApath: none
Unknown SSL protocol error in connection to telegra.ph:443
Curl_http_done: called premature == 1
* Closing connection 0
Скорее всего дело в РКН. Вот как у меня выглядит соединение без VPN:
wine /d/tmp/openssl.exe s_client -debug -connect telegra.ph:443
CONNECTED(00000048)
write to 0x4afff0 [0x4b0778] (307 bytes => 307 (0x133))
0000 - 16 03 01 01 2e 01 00 01-2a 03 03 cc 01 5a f5 0d ........*....Z..
....
read from 0x4afff0 [0x4b5cd8] (7 bytes => 7 (0x7))
0000 - 48 54 54 50 2f 31 2e HTTP/1.
9:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:.\ssl\s23_clnt.c:827:
Видно, что в ответ на HTTPS соединение вместо блока ServerHello приходит кусок HTTP-данных (скорее всего редирект на заглушку), то есть соединение перехватывается.
А с VPN - соединение устанавливается.
У тебя curl успевает отправить один пакет (ClientHello), после чего получает, что соединение было закрыто. Тут может быть несколько причин:
- серверу telegra.ph ты не нравишься и он тебя банит (хотя тогда он бы наверно не давал даже установить соединение)
- прокси прочитал твой пакет ClientHello и решил закрыть соединение
- DPI прочитал пакет ClientHello и решил закрыть соединение
То, что соединение сначала устанавливается и дается возможность отправить ClientHello, указывает на то, что вероятнее всего 2 или 3 вариант. Если банят, то обычно не дают даже соединиться с сервером.
На дампе видны байты 74 65 6C 65. Это коды символов "tele" (таблица http://www.asciitable.com/ ), у тебя в пакете ClientHello указано имя telegra.ph (видимо это поле SNI - Server name indication), и это позволяет блокировать соединение. Надо переходить на TLS1.3 и ESNI, где имя сервера шифруется. Правда, для ESNI нужна поддержка со стороны сервера.
Что касается прокси - если это HTTP-прокси, то в нем обмен идет в открытом виде (примеры есть тут https://stackoverflow.com/questions/7577917/how-does-a-http-proxy-utilize-the-http-protocol-a-proxy-rfc). Клиент посылает к прокси HTTP-запрос вроде CONNECT 1.2.3.4:1234 или даже CONNECT telegra.ph:1234 и DPI может его перехватить, как и пересылаемый через прокси пакет ClientHello.
Ты можешь попробовать соединиться с другим сервером, например, https://example.com, и увидишь, как должен выглядеть трафик при успешном соединении.
Вообще, я тут вспомнил, что есть более удобное средство просмотра трафика - wireshark. Его освоить тоже полезно на случай анализа каких-то сетевых проблем. Он дампит весь трафик с сетевой карты и представляет его в удобном разноцветном виде. Это уже не консольная, а GUI программа. Правда, кроме нужного тебе трафика там будет еще куча мусора от других программ и соседей по локалке.
Отфильтровать лишний трафик можно, указав фильтр, вроде такого ip.addr == 1.2.3.4 (адрес прокси), про фильтры написано тут: https://wiki.wireshark.org/DisplayFilters
Также, DPI может перехватывать твои DNS запросы, когда ты делаешь запрос на разрешение адреса telegra.ph, он может подменять ответ и присылать IP сервера-заглушки (в твоем случае это не происходит, IP правильный).
Если я прав, то Wireshark должен тебе показать, как твоя программа соединяется с прокси, как она щлет запрос CONNECT, и что в ответ присылает DPI. Можешь глянуть, если интересно. Ты можешь так убедиться, что моя версия правильная и проблема не в твоем коде, а в сетевых проблемах.
Скорее всего дело в РКН. Вот как у меня выглядит соединение без VPN:
wine /d/tmp/openssl.exe s_client -debug -connect telegra.ph:443
CONNECTED(00000048)
write to 0x4afff0 [0x4b0778] (307 bytes => 307 (0x133))
0000 - 16 03 01 01 2e 01 00 01-2a 03 03 cc 01 5a f5 0d ........*....Z..
....
read from 0x4afff0 [0x4b5cd8] (7 bytes => 7 (0x7))
0000 - 48 54 54 50 2f 31 2e HTTP/1.
9:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:.\ssl\s23_clnt.c:827:
Видно, что в ответ на HTTPS соединение вместо блока ServerHello приходит кусок HTTP-данных (скорее всего редирект на заглушку), то есть соединение перехватывается.
А с VPN - соединение устанавливается.
У тебя curl успевает отправить один пакет (ClientHello), после чего получает, что соединение было закрыто. Тут может быть несколько причин:
- серверу telegra.ph ты не нравишься и он тебя банит (хотя тогда он бы наверно не давал даже установить соединение)
- прокси прочитал твой пакет ClientHello и решил закрыть соединение
- DPI прочитал пакет ClientHello и решил закрыть соединение
То, что соединение сначала устанавливается и дается возможность отправить ClientHello, указывает на то, что вероятнее всего 2 или 3 вариант. Если банят, то обычно не дают даже соединиться с сервером.
На дампе видны байты 74 65 6C 65. Это коды символов "tele" (таблица http://www.asciitable.com/ ), у тебя в пакете ClientHello указано имя telegra.ph (видимо это поле SNI - Server name indication), и это позволяет блокировать соединение. Надо переходить на TLS1.3 и ESNI, где имя сервера шифруется. Правда, для ESNI нужна поддержка со стороны сервера.
Что касается прокси - если это HTTP-прокси, то в нем обмен идет в открытом виде (примеры есть тут https://stackoverflow.com/questions/7577917/how-does-a-http-proxy-utilize-the-http-protocol-a-proxy-rfc). Клиент посылает к прокси HTTP-запрос вроде CONNECT 1.2.3.4:1234 или даже CONNECT telegra.ph:1234 и DPI может его перехватить, как и пересылаемый через прокси пакет ClientHello.
Ты можешь попробовать соединиться с другим сервером, например, https://example.com, и увидишь, как должен выглядеть трафик при успешном соединении.
Вообще, я тут вспомнил, что есть более удобное средство просмотра трафика - wireshark. Его освоить тоже полезно на случай анализа каких-то сетевых проблем. Он дампит весь трафик с сетевой карты и представляет его в удобном разноцветном виде. Это уже не консольная, а GUI программа. Правда, кроме нужного тебе трафика там будет еще куча мусора от других программ и соседей по локалке.
Отфильтровать лишний трафик можно, указав фильтр, вроде такого ip.addr == 1.2.3.4 (адрес прокси), про фильтры написано тут: https://wiki.wireshark.org/DisplayFilters
Также, DPI может перехватывать твои DNS запросы, когда ты делаешь запрос на разрешение адреса telegra.ph, он может подменять ответ и присылать IP сервера-заглушки (в твоем случае это не происходит, IP правильный).
Если я прав, то Wireshark должен тебе показать, как твоя программа соединяется с прокси, как она щлет запрос CONNECT, и что в ответ присылает DPI. Можешь глянуть, если интересно. Ты можешь так убедиться, что моя версия правильная и проблема не в твоем коде, а в сетевых проблемах.
У нас посты про этот сайт появляются почти в каждом треде:
https://phpclub.tech/search/?q=hexlet
https://phpclub.tech/search/?q=хекслет
Появляются сомнения, а так ли эти курсы хороши или же их пишут в расчете на вознаграждение?
Если появляются, зарегистрируйся, пройди бесплатные уроки. Я же не кидаю реф. ссылку, а делюсь годнотой.
>Скорее всего дело в РКН.
Но почему любые другие заблокированные сайты открываются без проблем? Через эти же прокси. Вот сейчас для теста рутрекер открыл.
>Wireshark
Понятнее не становится.
Попробовал установить curl_setopt($curl, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1_3'); - Wireshark всё еще показывает соединение по TLSv1. Открыл опять рутрекер - там уже TLSv1.2. Кажется, ничего не меняется от этой опции.
Зачем ты платишь за бесплатную информацию?
Попробовал через бесплатные прокси коннектиться к заблокированным сайтам - все редиректит на сайт провайдера. Хм.
А вот через socks5 прокси получается. Какой вывод делать-то? Мой провайдер настроил DPI исключительно на telegra.ph?
Попробовал зайти через браузер, использую эту проксю. Не заходит. Блядь, а я еще и деньги за неё платил, чтобы получать вот это вот.
Спасибо, ОП! Без тебя бы не справился.
В Wireshark ты можешь нажать на пакет, и внизу будет выведено его содержимое. У тебя явно видно, что происходит:
- программа устанавливает TCP-соединение с HTTP-прокси (пакеты SYN/ACK)
- программа шлет запрос CONNECT, прося прокси соединиться с сервером, сервер отвечает 200 Ok
- программа шлет пакет ClientHello для установки соединения
- приходит в ответ TCP-пакет ACK (подтверждение), а затем FIN (закрытие соединения)
Следовательно это либо прокси (но странно что он отправил 200 Ok), либо DPI работает. Причем заметь, что для DPI тут нет разницы, используешь ты прокси или нет, так как в любом случае пакет ClientHello шлется одинаковый.
Что касается браузера - браузер и рутрекер могут использовать другие протоколы. Например. может они используют TLS1.3 и ESNI, что позволяет скрыть имя сервера. Или какой-то трюк для обхода блокировки, а telegra.ph не использует это.
TLS1.3 должен поддерживаться с обоих сторон, для ESNI тоже нужна поддержка с обоих сторон.
> А вот через socks5 прокси получается. Какой вывод делать-то?
А ты посмотри трафик. В socks5 по идее нет шифрования.
Тебе нужен либо VPN, либо прокси, к которому ты подключаешься по HTTPS.
Это можно попробовать понять по характеристикам пакетов. Например, если прокси далеко от тебя, то пакет от DPI придет гораздо быстрее. Также, можно попробовать посмотреть поля IP-протокола вроде TTL. TTL - это время жизни пакета, при проходе через маршрутизатор оно уменьшается на один. И пакеты от DPI и от прокси будут иметь ращный TTL (хотя DPI может подделать TTL, но с большой вероятностью провайдеру лень этим заниматься).
То есть попробуй в WireShark посмотреть содержимое пакетов, точное время их прихода, и разные заголовки IP/TCP - есть ли там какие-то различия между первым пакетом SYN от прокси, пакетом с 200 Ok от прокси и пакетом с FIN.
Можешь также сюда запостить их содержимое из WireShark.
Если у тебя платный прокси, то можно также обратиться в поддержку, или почитать правила и спросить, на каком основании блокируется доступ и почему это не отражено в правилах.
Но в общем тебе нужен если и прокси, то не HTTP, а HTTPS, к которому ты подключаешься по SSL, с шифрованием. Иначе он ничего не скрывает.
Но прокси вроде https. Вон, зашифровано же, нет? Я в это разбираюсь еще меньше, чем во всем остальном.
Ну если ты такой умный и прошел все курсы мира на торрентах, то покажи свой охуенный код на гитхабе
>прошел все курсы мира
Нахрен мне все курсы мира проходить?
Но да - я учился по курсам с торрентов. Поначалу. Потом уже самому пора уметь.
>покажи свой охуенный код
Зачем?
Чтобы сэкономить время людей, которые хотят войтивайти самым безболезненным способом (через Хекслет).
Ведь если ты макакер уровня подписчиков Марлина, то тебе нельзя верить
>войтивайти самым безболезненным способом
Заплатив вам за ваши говнокурсы, делающие говокодеров.
Если нет технического бэкграунда и мозгов, то никакие курсы не помогут, а тем у кого это всё есть - никакие курсы не нужны.
>если ты макакер уровня
А ты что за хуй важный чтобы мой уровень оценивать?
Протоколы, конечно, стоило бы тоже немного подучить.
Протокол IP - он определяет понятия вроде IP-адресов и передачу пакетов через промежуточные узлы-маршрутизации. В википедии есть формат IP-пакета
В IP пакет мы кладем в качестве нагрузки TCP-пакет. Этот протокол добавляет номера портов для различения приложений, повторную отправку при ошибке и понятие "соединения" с процессом установки и разрыва.
HTTP протокол - работает поверх TCP в открытом виде. HTTPS - это HTTP внутри SSL-канала. То сеть клиент делает TCP-соединение, поверх него устанавливает SSL/TLS соединение (там клиент и сервер обмениваются списком поддерживаемых шифров, генерируют ключи, проверяют сертификаты друг друга и наконец устанавливают зашифрованный канал).
У тебя HTTP-прокси. Ты по протоколу HTTP (в отрытую) соединяешься с прокси, шлешь ему в открытую запрос CONNECT с открытым именем сервера и портом, он устанавливает TCP-соединение с запрошенным сервером и ты шлешь по нему что хочешь (в данном случае - пакеты SSL, внутри которых спрятан HTTP).
Так как прокси использует HTTP, данные передаются в открытом виде и начальный SSL-пакет ClientHello, содержащий имя сервера telegraph, передается в открытую. Так как на этом этапе SSL-канал еще не установлен. На твоем дампе это имя сервера видно.
Тебе надо HTTPS-прокси, то есть прокси, к которому ты подключаешься по HTTPS (SSL), делаешь не видимый снаружи запрос CONNECT, и внутри SSL-канала устанавливаешь второе SSL-соединение к telegraph.
- Какой смысл в семантических тегах (section, article, menu) для закрытых SPA, которые не будут индексироваться? Почему иногда в статьях по-прежнему используют ul/li для меню, а потом перекрывают дефолтные padding/margin у этих тегов, вместо того, чтобы просто сверстать на div/span и flexbox? Вёрстка проще, поддержку IE просят очень редко.
- Для ретины рекомендуется использовать изображения с более высоким расширением. Я не очень понимаю как это работает на уровне железа. Что значит "повышенная плотность пикселей". Если на ретине с разрешением 1920x1200 и обычном дисплее 1920x1200 открыть одну и ту же картинку, то она будет отображена одинаково? Как-то можно эмулировать ретину на обычном дисплее, чтобы видеть вёрстку на маке, не имея мака?
- Что порекомендуешь для pixel perfect вёрстки, может есть расширения для браузера или удобные линейки под линукс?
есть задача, исходные:
знаю базовые вещи вроде html, css, javascript, sql, ооп, очень поверхностно mvс, на php писал скрипты к всяким вордпрессам и джумлам и ковырялся в плагинах
собственно нужно сделать что-то вроде облачного хранилища фоток: юзеры грузят фотки на сервер, в личном кабинете могут просматривать их, создавать "альбомы" и раскидывать по ним фотки, делиться ссылкой с кем-попало или давать доступ к альбомам другим юзерам
стоит ли с такой задачей влезать в php фреймворки (если да, то какой?) или проще лепить код самому? быстрее ли будет разобраться с функционалом фреймворка или же писать и собирать phpные куски?
в приоритете время разработки, защищенность и правильная архитектура не интересует
> Какой смысл в семантических тегах (section, article, menu)
Смысл в том, что если у тебя есть меню, то ты его размечаешь тегом menu, а не каким-то другим. Логчино же, когда все используют одинаковые теги для одинаковых целей, а не придумывают каждый свой вариант. При этом ты не обязан их использовать, если у тебя нет меню, статьи или секции документа или нет нужны их размечать. Но если тебе хочется разметить меню или разбить документ на секции - бери существующие теги, а не изобретай велосипед.
Точный смысл тегов и примеры использования ты можешь прочесть в стандарте HTML.
> Почему иногда в статьях по-прежнему используют ul/li для меню,
Потому что в HTML4 не было тега menu, а список вполне подходит.
> а потом перекрывают дефолтные padding/margin у этих тегов
Это не так сложно, а верстка из одних дивов смотрится очень скучно. flexbox, кстати, тогда тоже не было.
> Что значит "повышенная плотность пикселей".
Плотность пикселей = число пикселей поделить на ширину экрана в дюймах. Типичная плотность обычного монитора - это порядка 72-96 DPI (точек на дюйм). Это очень крупные пиксели, например, я на своем экране, приблизившись, вижу сетку между пикселями. Из-за крупных пикселей изображение с мелкими детялями, например, текст, смотрится размытым или искаженным.
В новых экранах стараются делать пиксели мельче. Например, у меня смартфон имеет такое же разрешение (число пикселей), как экран ноутбука, но при этом размеры экрана намного меньше, за счет чего пиксели на смартфоне крошечные и менее различимые. Благодаря этому буквы на нем смотрятся красивее.
Ретина - это двойная плотность пикселей, в смартфонах бывают и экраны с тройной плотностью в сравнении с классическим монитором.
Если мы на экран с 2-й плотностью пикселей попробуем вывести обычный HTML документ, то он будет слишком мелкий, в 2 раза мельче привычного. Потому браузеры делают адаптацию таким образом: один CSS-пиксель занимает 2 реальных пикселя. Квадрат с width: 50px занимает 100 реальных пикселей, текст размером 16px рендерится высотой в 32 пикселя. То есть по сути браузер ставит масштаб 200% для такого экрана.
Если мы на таком сайте используем картинку размером 300x300, то браузер тоже ее увеличит до 600x600, при этом картинка будет слегка размытой, так как в ней нет лишних пикселей и браузеру приходится их получать интерполяцией (взятием среднего). Пользователь, привыкший к тонким четким линиям букв, будет разочарован "мыльностью" картинки.
(еще одна проблема таких экранов - так как на них в 4 раза больше пикселей, нужна более мощная видеокарта)
Чтобы решить эту проблему, ты можешь поставить на сайт картинку 600x600, но задать ей размер для вывода как 300x300:
<img width="300" height="300" src="image600x600.jpeg">
Но это огорчит владельцев обычных экранов, которые будут грузить огромную картинку зря. А также тех, у кого медленный интернет. Потому используют специальный синтаксис для того, чтобы указать все имеющиеся картинки и позволить браузеру выбрать оптимальную, в том числе с учетом качества канала связи:
https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images
Разумеется, варианты картинок надо как-то автоматически генерировать, а также хранить информацию о них в БД, чтобы не сканировать диск при выводе страницы.
> нием 1920x1200 и обычном дисплее 1920x1200 открыть одну и ту же картинку, то она будет отображена одинаково? Как-то можно эмулировать ретину на обычном дисплее, чтобы видеть вёрстку на маке, не имея мака?
Можно попробовать сделать масштаб 200%. Тогда ты увидишь то же, что владелец Мака, приблизивший лицо к экрану.
В Firefox (и наверно в Хроме) в инструментах разработчика есть опции для имитации другой плотности пикселей: https://developer.mozilla.org/en-US/docs/Tools/Responsive_Design_Mode
Также, если у тебя есть смартфон с большим разрешением, можно смотреть на нем.
> Что порекомендуешь для pixel perfect вёрстки, может есть расширения для браузера или удобные линейки под линукс?
Не знаю, есть какие-то расширения, которые позволяют поверх сайта наложить полупрозрачную картинку-образец.
> Какой смысл в семантических тегах (section, article, menu)
Смысл в том, что если у тебя есть меню, то ты его размечаешь тегом menu, а не каким-то другим. Логчино же, когда все используют одинаковые теги для одинаковых целей, а не придумывают каждый свой вариант. При этом ты не обязан их использовать, если у тебя нет меню, статьи или секции документа или нет нужны их размечать. Но если тебе хочется разметить меню или разбить документ на секции - бери существующие теги, а не изобретай велосипед.
Точный смысл тегов и примеры использования ты можешь прочесть в стандарте HTML.
> Почему иногда в статьях по-прежнему используют ul/li для меню,
Потому что в HTML4 не было тега menu, а список вполне подходит.
> а потом перекрывают дефолтные padding/margin у этих тегов
Это не так сложно, а верстка из одних дивов смотрится очень скучно. flexbox, кстати, тогда тоже не было.
> Что значит "повышенная плотность пикселей".
Плотность пикселей = число пикселей поделить на ширину экрана в дюймах. Типичная плотность обычного монитора - это порядка 72-96 DPI (точек на дюйм). Это очень крупные пиксели, например, я на своем экране, приблизившись, вижу сетку между пикселями. Из-за крупных пикселей изображение с мелкими детялями, например, текст, смотрится размытым или искаженным.
В новых экранах стараются делать пиксели мельче. Например, у меня смартфон имеет такое же разрешение (число пикселей), как экран ноутбука, но при этом размеры экрана намного меньше, за счет чего пиксели на смартфоне крошечные и менее различимые. Благодаря этому буквы на нем смотрятся красивее.
Ретина - это двойная плотность пикселей, в смартфонах бывают и экраны с тройной плотностью в сравнении с классическим монитором.
Если мы на экран с 2-й плотностью пикселей попробуем вывести обычный HTML документ, то он будет слишком мелкий, в 2 раза мельче привычного. Потому браузеры делают адаптацию таким образом: один CSS-пиксель занимает 2 реальных пикселя. Квадрат с width: 50px занимает 100 реальных пикселей, текст размером 16px рендерится высотой в 32 пикселя. То есть по сути браузер ставит масштаб 200% для такого экрана.
Если мы на таком сайте используем картинку размером 300x300, то браузер тоже ее увеличит до 600x600, при этом картинка будет слегка размытой, так как в ней нет лишних пикселей и браузеру приходится их получать интерполяцией (взятием среднего). Пользователь, привыкший к тонким четким линиям букв, будет разочарован "мыльностью" картинки.
(еще одна проблема таких экранов - так как на них в 4 раза больше пикселей, нужна более мощная видеокарта)
Чтобы решить эту проблему, ты можешь поставить на сайт картинку 600x600, но задать ей размер для вывода как 300x300:
<img width="300" height="300" src="image600x600.jpeg">
Но это огорчит владельцев обычных экранов, которые будут грузить огромную картинку зря. А также тех, у кого медленный интернет. Потому используют специальный синтаксис для того, чтобы указать все имеющиеся картинки и позволить браузеру выбрать оптимальную, в том числе с учетом качества канала связи:
https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images
Разумеется, варианты картинок надо как-то автоматически генерировать, а также хранить информацию о них в БД, чтобы не сканировать диск при выводе страницы.
> нием 1920x1200 и обычном дисплее 1920x1200 открыть одну и ту же картинку, то она будет отображена одинаково? Как-то можно эмулировать ретину на обычном дисплее, чтобы видеть вёрстку на маке, не имея мака?
Можно попробовать сделать масштаб 200%. Тогда ты увидишь то же, что владелец Мака, приблизивший лицо к экрану.
В Firefox (и наверно в Хроме) в инструментах разработчика есть опции для имитации другой плотности пикселей: https://developer.mozilla.org/en-US/docs/Tools/Responsive_Design_Mode
Также, если у тебя есть смартфон с большим разрешением, можно смотреть на нем.
> Что порекомендуешь для pixel perfect вёрстки, может есть расширения для браузера или удобные линейки под линукс?
Не знаю, есть какие-то расширения, которые позволяют поверх сайта наложить полупрозрачную картинку-образец.
> делиться ссылкой с кем-попало или давать доступ к альбомам другим юзерам
> защищенность ... не интересует
Твои требования противоречивы. Если тебя не интересует защищенность, просто сделай все фото публично доступными.
Также, посмотри owncloud, не подходит?
>>55459
Есть пруфы, что течет? Апач не используют по другой причине. Статику лучше раздает нгинкс, потому его ставят впереди. PHP запускают под php-fpm, так как это удобнее. В такой ситуации Апач просто становится лишним промежуточным звеном.
Раньше же Апач и отдавал статику, и запускал PHP код с помощью mod_php.
>>55079
Ты утверждаешь, что без платных курсов от одной конкретной компании получить знания нельзя? Извини, но это выглядит как агрессивная и недостоверная реклама. Уверен, что другие компании возразят на это, что именно их курсы лучшие, а не те, что ты рекламируешь.
>>55029
Показ выпадающего списка можно отключить HTML-атрибутом autocomplete. Это стоит делать для полей, содержащих приватные данные (вроде номера карты или паспорта), чтобы браузер их не сохранял.
Работать с формой регистрации/обновления данных будет в разы удобнее при наличии объекта. Ты хочешь хранить данные в массиве, но давай сравним эти 2 подхода:
- структура объекта, какие у него есть поля, описаны в коде, к ним можно писать комментарии, а структура массива - нет
- в объекте могут быть методы
- в объекте можно использовать приватные поля и инкапсуляцию
- на объект можно поставить тайп-хинт с указанием класса, на массив - только хинт array без описания структуры
Таким образом, код будет удобнее читать.
>>54326
Если запрос выбирает одну строку по ключу, то это не проблема. Сделай тест - скорее всего MySQL может делать тысячи таких запросов за секунду.
Можно кешировать данные в редисе, но это неоправданно если у тебя этим пользуется один админ, а не тысячи пользователей.
Не гадай насчет производительности, а делай замеры. Интуиция тут сильно подводит, часто на практике медленной оказывается та часть, которую ты считал быстрой.
>>54210
Вот на всякий случай урок по строкам и utf-8: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md
>>53649
Да, такая проблема есть, но она не в менеджере пакетов. Например, ты можешь вручную скачать библиотеки версий 1.4 и 1.5, но ты не сможешь их подключить из-за одинаковых имен классов. В JS эта проблема решается тем, что там есть модули и нет требования к уникальности имен классов.
>>53656
Сделать каталог public корневым (DocumentRoot). Это самый надежный способ.
Работать с формой регистрации/обновления данных будет в разы удобнее при наличии объекта. Ты хочешь хранить данные в массиве, но давай сравним эти 2 подхода:
- структура объекта, какие у него есть поля, описаны в коде, к ним можно писать комментарии, а структура массива - нет
- в объекте могут быть методы
- в объекте можно использовать приватные поля и инкапсуляцию
- на объект можно поставить тайп-хинт с указанием класса, на массив - только хинт array без описания структуры
Таким образом, код будет удобнее читать.
>>54326
Если запрос выбирает одну строку по ключу, то это не проблема. Сделай тест - скорее всего MySQL может делать тысячи таких запросов за секунду.
Можно кешировать данные в редисе, но это неоправданно если у тебя этим пользуется один админ, а не тысячи пользователей.
Не гадай насчет производительности, а делай замеры. Интуиция тут сильно подводит, часто на практике медленной оказывается та часть, которую ты считал быстрой.
>>54210
Вот на всякий случай урок по строкам и utf-8: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md
>>53649
Да, такая проблема есть, но она не в менеджере пакетов. Например, ты можешь вручную скачать библиотеки версий 1.4 и 1.5, но ты не сможешь их подключить из-за одинаковых имен классов. В JS эта проблема решается тем, что там есть модули и нет требования к уникальности имен классов.
>>53656
Сделать каталог public корневым (DocumentRoot). Это самый надежный способ.
Сделать каталог public корневым (DocumentRoot). Это самый надежный способ.
>>53615
Увы, подробностей в посте мало. По поводу ошибок - они по идее должны писаться в какой-то лог, и надо там смотреть подробности. Также, ты можешь запустить тот же скрипт из консоли (командой вроде c:\php\php.exe d:\tmp\script.php) и там выведутся ошибки, если они есть.
Ну или напиши подробнее: какой скрипт, как ты его запускаешь, что выдается.
Также, в конфигах PHP лучше писать прямые слеши, c:/tmp/php/.
>>53317
Нет это плохо с точки зрения читабельности кода, так как в случае с if код визуально выделается, и ты по первому слову понимаешь, что тут if. Не делай так.
почему?
Помогите решить тестовые задания (одно из тестовых на собеседовании кстать):
Нужно сверстать календарь используя списки
Дан исходный код нужно его немножко изменить(как правило прописать имя классов соответствующим тегам, добавить свойства селекторам и тп) что бы получился результат (Pic related)
Если кому интересно покидаю другие
Это не троллинг, я серьёзно спрашиваю, и точно не хочу начинать срач. Я вроде бы понимаю, что язык - это просто инструмент, и сам по себе он не должен быть мерилом профессионализма. Мне хотелось бы услышать какие-то аргументы не для спора с кем-то, а для самого себя, чтобы избавиться от некоторых комплексов.
Полное право имеют. Потому что даже самый высоконагруженгый сайтик с гиганстким стеком технологий не сравнится с написанием приложения для, например, банковской сферы.
Всё зависит от того, какой у тебя уровень и какими технологиями ты владеешь.
В джаву и шарп высокий уровень вхождения, там чтобы начать работать, надо много понимать и знать, кучу разных техник, технологий и практик. Для старта в ПХП ничего не надо. Поэтому смотрят свысока, обосновано. Они легко вкатятся в ПХП, если с вебом работали, а вот ты к ним вряд ли.
В ПХП тоже есть, где развернуться и что изучить. Но обычно это уже дополнительные сервисы и коммуникация с ними.
Энтерпрайз в целом сложнее, чем веб. В веб у тебя обычно короткий жизненный цикл программы, особенно на ПХП, один запрос, один вызов. Долгая логика выносится в БД и внешние сервисы. В энтерпрайзе всё сложнее, очень сложные приложения могут быть.
Хотя многие реально клепают круд-говно, просто на других языках, шлёпают какие-нибудь формы к БД, которую даже и не они проектируют.
Хмм, а в этом есть логика, ведь если платят, то видимо не просто так платят.
И кстати, на Хабре в какой-то теме про ПХП я читал, что работа на Симфони в целом по сложности и приятности не многим отличается от работы на той же Джаве, это правда так?
> В ПХП тоже есть, где развернуться и что изучить. Но обычно это уже дополнительные сервисы и коммуникация с ними.
Вот это спорный тезис. Какие-то +/- серьёзные проекты на чистом рнр не напишут. Как прослойка для чего-то ещё может быть. Вся разработка на рнр в 95% сводится к оптимизации запросов к БД и обработке данных полученных из форм. Написание плагинов для WP/1C-Битрикс. Серьёзный проект не написать.
Я как-то взял observium для мониторинга устройств по snmp и как же прибалдел от кривизны. Но ещё больше прибалдел от увиденного под капотом. Код на рнр запускал питон, который выполнял свою часть работы и возвращал в рнр... и это так криво работало, что пораждало кучу процессов в системе, что в окончании приводило к нехватке памяти и свопом, ну короче со всеми вытекающими.
Коли уж заговорил про WP, то это адская говнина, которую 24/7 надо мониторить на предмет уязвимостей. Короче тезис таков, что у рнр были шансы, но ребята всё пребали. Сейчас с 0 писать какой-то высоконагруженный проект не имеет смысла.
На голой джаве так-то тоже не пишут. Spring и иже с ним. Понятное дело, что либа навороченная и в неё надо вникать.
Много есть каких-то больших проектов на PHP, не только мелочь. Если годами пишешь на ПХП и хорошо владеешь всеми инструментами, то почему бы и для нового проекта не взять привычный инструмент? Точно ли альтернативы плюсы дадут?
Всё-таки ПХП как-то развивается. Я давно с ним серьёзно дела не имел, не в курсе, но что-то там есть. Там сам язык мощный, и поддержка мультитредов-процессов, что-то мутят с асинхронностью.
Я не знаю, возможно ли сейчас сделать веб-сервис на ПХП, чтобы он один раз запустился, принимал последовательно, а лучше параллельно очень много соединений, и не требовал регулярного перезапуска, чтобы мог неделю проработать, обслужив многие тысячи подключений за это время?
Это для меня критерий полноценного инструмента. Я думаю это возможно.
Но я уже к другим инструментам привык, у меня такой потребности нет.
Точно так же можно найти лапшу и на других языках. Ну например, в упоминаемых вами банках часто держат какие-то древние компьютеры (или эмулируют их), чтобы не переписывать написанную 20 лет назад систему, которую сегодня никто не сможет поддерживать. И именно из-за гор легаси кода вам, например, могут сказать "вот где карту получали, туда и идите" (и это не только сбербанк, но и в коммерческих банках).
Гораздо важнее тут соблюдение определенных стандартов, соглашений. Ява, да, в этом плане хороша тем, что там с давних времен есть отлаженный процесс стандартизации (JSR).
Пример утилиты observium вообще ни о чем не говорит. Это же open source - кто-то делал для себя и поделился. Может быть, эта утилита решила требуемую задачу. А если ее сесть писать на Яве с тщательным проектированием, составлением спецификаций, тестированием, это займет в 3 раза больше времени и даст такой же результат.
Open source - это не "а ну напишите мне бесплатно качественный продукт", это "смотрите, я это для себя делал, если интересно, присоединяйтесь". Взял бы и исправил косяки.
И насколько я знаю, фейсубк и вконтакте именно на PHP писать начинали. А на Яве написаны одноклассники.
>И насколько я знаю, фейсубк и вконтакте именно на PHP писать начинали.
Это было 15 лет назад, другая эпоха. Кто-нибудь сейчас стартует большие проекты на ПХП? На самом деле кажется, что всё-таки да, но сейчас явных преимуществ ПХП над другими языками нет, на ПХП уже не принято писать, как 15 лет назад.
Делал ли ты выборку по hh.ru по языкам или же твое мнение базируется на сообщениях анонимных безработных экспертов с двачей? Потому что про смерть PHP (и Windows) я слышу уже лет 5 если не больше.
Диван не отлежал ещё? PHP используется в разработке в том числе и новых проектов, например тут искали симфониста в новое направление Яндекса: https://moikrug.ru/vacancies/1000049016
Сейчас вакансии не мониторю, когда полгода назад мониторил - наткнулся на эту. Попробуй и ты поискать - поймёшь, что не прав.
>>55657
> Полное право имеют.
Джависты ничем от отличаются от PHP-разработчиков. Клепают такие же формы, пишут такие же REST/GraphQL API по общепринятым спецификациям в веб-разработке, интегрируют такие же инструменты для поиска и очередей (Elasticsearch, RabbitMQ), пользуются теми же облачными сервисами. Ладно если бы они ракеты в космос запускали или писали ПО для беспилотных автомобилей, но нет - такие же формошлёпы, как и PHP-шники. Есть подозрение, что ты далёк как от PHP, так и от современной Java- разработки.
При чём тут open source? Опен сурс проекты так-то пишет не 1 человек. Взять, например, арч или дебиан. Целая ОС, которую создавали на голом энтузиазме.
Суть в том, что рнр с его костылями не может дать гибкости как змея или ява. Он прост для вкатывания, написания каких-то простых вещей он и задумывался как язык для домашних страничек с обработкой форм, заебались через cgi perl запускать, ещё один язык, который придуман был для обработки текста. Мэил ру на перле написан и хули? Ну допиливают они его, и хули? Перл развивается, 6 версия не за горами, и хули?
Сколько написнно на явк и си решетке и сколько на рнр =) пример с легаси в банках глупость полная, там от такого уже ушли. Есть конечно какие-то исключения, но то единичные случаи. Если бы вы это лет 10 назад написали, я согласился бы.
Не отлежал. Пишут не с 0 на рнр, а на либе. Это как бы 2 разные вещи. Ну и от души посмеялся от знания го и змеи, это значит, что рнр в этом резюме как прокладка между чем-то. Собственно о чём я выше и писал. Бекэнд на рнр уже изживает себя. Я не отрицаю, что сайт легко и просто развернуть на рнр, но что-то более серьёзное, увы.
Бекэнд у вашего резюме даже не рнр обрабатывает, я больше чем уверен.
У тебя кругозор слишком узкий, видимо студент или крутишься в вебе. Джава как и змея используются для форма клепства сопру нет, но спектр задач гораздо шире. На рнр ты кое как бекэнд обработаешь да json оаспарсишь, а на джаве сервер напишешь, а на питоне вообще всё что угодно сделаешь, только пиздец как медленно.
Подобными вопросами задавался и я год-два назад.
На самом деле ПХП мне нравится. Пробовал питон - не зашел, нода - тоже. У ПХП есть какое-то ощущение чтоли прочности (как и у питона) и наличие си-подобного синатксиса (как у ЖС). Писал на нем все на свете.
Но постоянно ощущал несерьезность языка и это не давало мне покоя. Постоянно учил всякое разное - паттерны, фреймворки, еще глубже (как работает сервер, линупсы и т.д.). В конце концов понял - какой от этого смысл если я это не применяю и мне не платят за мои знания, завтра начальник скажет пилить очередной магаз на битриксе. Была возможность вкатываться дальше, учить фронтенд и углубляться в фулстек.
В конце концов дропнул, вышел из зоны комфорта и пошел в джаву и не жалею. ниче не имею против ПХП, мысль которую я хочу донести - если чувствуешь дискомфорт - не ищи причины и оправдания выходи из зоны комфорта и пиздую туда, куда хочется.
Та же хуйня у меня была с линуксами. Всю жизнь я просидел на винде, попробовал линукс - не смог, порвалась жопа, сидел на 10ке и оправдывал это, и все бы хорошо, но мне почемуто пиздец как хотел перейти на линукс, у этого небыло объективной потребности, просто хотелось, в конце концов я решил уйти и превозмогать пока не вкачусь. В конце концов укатился, сейчас сижу на арче и не жалею, чувствую себя спокойным и удовлетворенным.
хз зачем я это высрал
похуй, всеравно анонимная борда
Вообщем столкнулся я с задачей по ООП, где нужно написать функцию padLeft и padRight используя функции mbstring, но вот беда, модуль этот по стандарту не включен, нагуглил что нужно раскомментировать строку отвечающий за этот модуль в файле php.ini, но в папке php у меня его нет, а phpinfo() пишет что ini файл находиться в c:\windows, но там его тоже нет. Что делать?
В phpinfo() надо смотреть не "место, где ищется php.ini", а строку, где написано "использованные ini-файлы" или как-то так. Скинь скриншот верхней части таблицы, если найти не можешь.
Прошу прощения за платиновый вопрос и то, что не читаю в гугле.
МОжет подскажете, как дела в европе с PHP? через пару месяцев меня ждет релокация в Чехию или, менее вероятно, но есть шанс, в Гермашку (скорее первое) по основной работе, которую после дропну нахуй. Понимаю, что там своим спецов дохуя , и я буду нубом, но с финаносовой подушкой есть полгода-год, чтобы поуизучать + по текущей работе есть реальные примеры, что могу поделать (допилить аддоны в облаке, могу просто попросится проверять и помогать коллегам)
Судя по Loaded Configuration File (none) ini файла у меня попросту не существует.
Раскомментировать подойдет если у тебя стоит пыха такая как ее делали разрабы пыхи, что на большинстве дистрибутивов врядли. Скорее всего надо просто поставить нужный модуль. Но поскольку ты на винде - хз как это сделать
Нужный модуль у меня находиться в папке php\ext, но для его включения нужен ini файл, вот я и ищу его.
Нет, я использую встроенный php сервер.
Советую тебе поставить apache или nginx, чтобы ты все смог настраивать, там то они (конф. файлы) точно будут
Ладно, попробую, спасибо за помощь.
У тебя все ясно написано: PHP ищет конфиг в c:\windows\, но там его нет. Ну так создай файл php.ini (нужны права админа) и положи туда.
Обычно установщик при установке прописывает в реестр расположение папки PHP, и он ищет конфиг в ней.
Вот мануал, объясняющий где PHP ищет конфиг: https://www.php.net/manual/en/configuration.file.php
Ты можешь либо создать конфиг и положить в c:\windows\php.ini, либо создать в другом месте и указывать путь к нему опцией -c при запуске PHP (php.exe -c d:\php\php.ini )
Поддержка пространств имен нужна только для защиты от конфликтов (совпадений имен классов, функций, констант).
Чтобы подключить - надо смотреть мануал по библиотеке. Если там надо просто подключить файл (например, библиотека предоставляет файл-загрузчик), то его можно прописать в composer.json в секцию autoload.files, мануал тут: https://getcomposer.org/doc/04-schema.md#files
Если такого файла нет, можно использовать classmap в composer.json, который просканирует файлы и создаст автозагрузчик для классов сам.
Если нужно выполнить какой-то кастомный код, то делаешь функцию в своем приложении и вызываешь в bootstrap-файле (при запуске приложения).
Если подключение библиотеки требует много ресурсов, то делаешь функцию для подключения и вызываешь только когда это нужно.
Так что мне видимо требуется открыть для себя волшебный мир структур данных и алгоритмов, я прав?
Подскажите книгов пожалуйста.
Та же связка nginx-phpfpm (а теперь ещё и в php7.4 пред-загрузка появилась) дают огромную производительность, в которую ты уже не упрешься практически никогда (потому что узкое место - это обычно база данных, а приложения на php масштабировать очень просто), если написано нормально, а не через жопу.
Даже если задача такова, что нужно вычитывать из вебсокета или очереди, то есть куча инструментов (тот же nginx), которые умеют вычитывать данные и слать http-запросы, позволяя php работать as designed, а не как сова на глобусе.
так и есть , или ждать пхп8 когда сделают асинхронность из коробки на низком уровне ядра , всё остальное ReactPHP и тд шняги для бенчмарков + пет проекты уровня хелло ворлд
2 разных подходи , вопрос сорт оф автомобиль или лодка
подтягивай тогда лучше англ , джуны без нетива на уровне б1 не нужны , по работе она есть , не так много как например в укропском ДС но есть.
мимо варшава кун
Спасибо.
Всегда пишу через неймспейсы + композер, не хочется напрямую инклюдить, в обход общей структуры приложения.
Ты тредом ошибся.
кстати да + вопрос
INSERT INTO t8rv0_mobile_tokens (user_id, token) VALUES (:user_id, :token) ON DUPLICATE KEY UPDATE user_id = values(user_id), token = values(token)
Но, видимо из-за того, что токены различаются, оно создает новую запись вместо обновления старой. Спасибо
Появилась идея. При создании линковоной таблицы создаются пустые записы под слинковую колонку? Просто сам объект пользователя сохраняется в другой таблице. Если слинковать и создать шаблонные записи под каждого созданного пользователя и создавать новые при создании новой записи пользователя и использовать UPDATE
Этот вопрос уже 100500 раз обсосан. Это тебе в твоём манямирке на 2 с половиной юзера и полтора формошлёпа всё заебись, можешь хоть каждый день всё на новый язык переписать. А когда у тебя 50 разработчиков и кодовая база в несколько десятков тысяч строк, то ты каждый раз будешь думать, тащить ли новую технологию или сделать на старой. Потому что любой новый стек, это разработчики, которые должны уметь на этом кодить, девопсы, которые должны уметь это поддерживать, ещё одна экосистема, от которой ты зависишь и так далее. Для тебя это может быть пустой звук - но для бизнеса - нет, и дописать лишнюю точку входа в существующий монолит (или не совсем монолит, не суть) оказывается проще, чем тащить что-то новое.
Поэтому пхп не ван лав, просто нужно оценивать риски и профит. Та же нода - норм, но это если у тебя есть минимум 2 девелопера и 2 девопса, чтобы это готовить. И задача подходящая.
Во всех прочих случаях отдельный гейтвей для сокетов и обычный бекенд за ним решает 99% проблем, не принося новых.
А на пет проектах я сам на чём только не пишу.
>>56316
У текущей компании много продуктов, в большинстве бекенд написан на php. В основном, всякие сервисы по работе с хостингом, доменами и прочими сертификатами. Но я - выходец с аутсорса и работал в том числе над сайтами для компаний из fortune-500 (в-основном интранеты, интернет-магазины, прочие веб-приложени). Почти везде и почти всегда связка cron + php решала все проблемы и мне не приходилось изобретать велосипеды.
>Почти везде и почти всегда связка cron + php решала все проблемы
Я наверное не понял тебя сначала извини. Думал ты как раз расскажешь про те задачи что не решить этой связкой
А. Классическая задача - это запускать что-то раз в 10-15 секунд, кроном принципиально не решается.
Из реальных задач - у меня была задача максимально ускорить доставку писем клиентам (они содержали подтверждение платежей). Крон, который рассылал письма клиентам из очереди раз в минуту бизнес не устраивал. Решается такое как раз набором демонов, вычитывающих всё из очереди в тот же момент, когда оно туда попадает.
Ещё, у меня была задача подгружать много данных из разных источников, компоновать их, и возвращать в едином списке. Понятно, что кэшировалось, но изначально-то это была композиция ассинхронных запросов. Решал через по тем временам модный Gearman.
С сокетами тоже была задача, как раз нужно было слать пуши на девайс и обратно, причём быстро. Вообще на php есть Ratchet, который вроде как умеет в сокеты, но я тогда (уже не помню, по какой причине) написал простенький прокси на socket.io, который умел принимать http-запросы из php и пересылать их на девайс, принимать запросы с девайса и пинать php по http. Тут могла бы быть проблема в случае добавления новых нод (потому что пришлось бы как-то узнавать, к какому из инстансов ноды прицеплен конкретный пользователь), но там трафика было достаточно мало, чтобы этим пока что не заморачиваться. Если бы понадобилось, то, наверное, хранил бы в каком-нибудь хранилище (редисе, к примеру) связку пользователь-девайс-нода.
codewars. Там вроде уже есть клан двачеров, но лучше не вступай туда.
Интересно. Спасибо
Сейчас мой htaccess выглядит так:
RewriteEngine On
RewriteBase /
RewriteRule ^([-\w]+)?$ index.php?p1=$1
RewriteRule ^([-\w]+)/([-\w]+)?$ index.php?p1=$1&p2=$2
RewriteRule ^([-\w]+)/([-\w]+)/([-\w]+)?$ index.php?p1=$1&p2=$2&p3=$3
Каким кодом я могу также в GET передавать тот параметр, что идет вначале домена в виде поддомена?
Тоесть есть много адресов acer.domain.ru - нужно передать acer в скрипт, но при этом открывать тот же скрипт, что и domain.ru
На сколько я понял нужно как-то VirtualHost править
Тысячу лет не имел дел с апачем, но вообще поддомен выглядит, как отдельный виртуальный хост. Может, там можно плейсхолдер херануть, чтобы у тебя, к примеру, было два виртуальных хоста, *.domain.com и domain.com
А ты не хочешь просто смотреть оригинальный домен в $_SERVER['HTTP_HOST'] ? https://www.php.net/manual/en/reserved.variables.server.php
А так, открой мануал и изучи внимательно: https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule
> In addition to plain text, the Substitution string can include
>
> back-references ($N) to the RewriteRule pattern
> back-references (%N) to the last matched RewriteCond pattern
> server-variables as in rule condition test-strings (%{VARNAME})
Список "server-variables" есть на этой же странице выше.
middleware не для этого, это для работы на уровне HTTP-протокола вроде логгирования, сжатия, кеширования, зашифровки кук.
middleware не позволяет нормально передать переменные во view, как я понял.
У тебя есть такие варианты:
- наследовать все контроллеры (если это классы) от базового и в базовом генерировать "общие" данные и добавлять их в массив при рендеринге
- перед вызовом $app->run() сделать вызов своей функции, которая получит нужные данные и передаст в твиг как глобальные переменные:
function prepareLayoutData(...) {
$x = ....
$container->get('view')->getEnvironment()->addGlobal(...);
}
...
prepareLayoutData($app);
$app->run();
- сделать "контроллер" или "сервис" общих данных, который их будет получать их. Передать экземпляр этого сервиса в твиг как глоб. переменную. И далее использовать:
{% for layoutService.getMenu() as menuItem %}
....
И да, названия у меня ужасные, придумай что-нибудь получше.
middleware не для этого, это для работы на уровне HTTP-протокола вроде логгирования, сжатия, кеширования, зашифровки кук.
middleware не позволяет нормально передать переменные во view, как я понял.
У тебя есть такие варианты:
- наследовать все контроллеры (если это классы) от базового и в базовом генерировать "общие" данные и добавлять их в массив при рендеринге
- перед вызовом $app->run() сделать вызов своей функции, которая получит нужные данные и передаст в твиг как глобальные переменные:
function prepareLayoutData(...) {
$x = ....
$container->get('view')->getEnvironment()->addGlobal(...);
}
...
prepareLayoutData($app);
$app->run();
- сделать "контроллер" или "сервис" общих данных, который их будет получать их. Передать экземпляр этого сервиса в твиг как глоб. переменную. И далее использовать:
{% for layoutService.getMenu() as menuItem %}
....
И да, названия у меня ужасные, придумай что-нибудь получше.
Декомпозируй задачу
Спасибо большое! У меня теперь ещё один вопрос последний: ещё в middleware я ограничиваю доступ неавторизованных пользователей к некоторым разделам сайта. Это правильно, или фильтрацию надо в другом месте делать?
Ты создай контроллер а остальных наследуй от него
Это можно, но на практике может быть неудобно, так как тебе для принятия решения о доступе нужно получить какую-то сущность, которая получается в контроллере. И придется дублировать код ее получения.
Зато плюс middleware - что ты можешь разом ограничить доступ к целой ветке по URL, а в случае контроллера тебе надо не забыть это прописать.
Можно комбинировать оба подхода: требовать авторизации при входе в закрытый раздел на уровне middleware, а на уровне контроллера делать дополнительные проверки.
>>56458
А тебя не устраивает вариант с 2 запросами? Проверить наличие записи, и если надо, послать запрос UPDATE для обновления.
Если тебя беспокоит проблема "гонки" (за промежуток между 2 запросами другой процесс что-то поменяет в таблице, например, удалит юзера), то можно использовать транзакции и пессимистичные блокировки с использованием SELECT ... FOR SHARE / FOR UPDATE: https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html
Ты можешь попробовать поискать ответ в мануале (он очень подробный), но скорее всего, решения там не будет: https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html
Поведение запроса INSERT ... UPDATE зависит от наличия уникальных ключей, по каким колонкам они сделаны. У тебя наверно ключ по (user_id, token) отсюда и такое поведение.
А тебе тех, что есть в шапке, недостаточно, и ты уже сделал задачу про студентов, про файлообменник итд? Или ты имел в виду простые задачки по основам?
Если есть время, я бы посоветовал codeforces https://codeforces.com/problemset - тут, правда, задачи в основном вроде олимпиадных, на алгоритмы. Не бойся сложности: там есть простые задачи, которые легко увидеть по количеству решивших: если это несколько тысяч человек, то и ты, наверно, решишь (пример простой задачи, я додумался до решения за 5 минут: https://codeforces.com/problemset/problem/1206/A ). Если что, я готов дать подсказку.
>>56376
Уточни пожалуйста, что именно тебе не понятно. Личный кабинет - это просто набор страниц, доступ к которым ограничен с помощью авторизации.
Один из простейших способов авторизации - это куки с токеном. Если пользователь вводит логин/пароль, и они правильные, то сервер выдает ему куку, содержащую токен ("пропуск"), который должен:
- идентифицировать пользователя, то есть указывать, кто это. Например, это может быть id пользователя. Но этот вариант позволяет злоумышленнику самому поставить себе куку с любым id, и не защищен.
- быть защищенным от подделки, чтобы пользователь не мог выдать его себе сам. Например, мы можем для каждого пользователя при регистрации создавать и сохранять в таблице длинный случайный код, и выдавать этот код в качестве токена ("пропуска"). Так как коды уникальные, то они позволяют идентифицировать пользователя. А злоумышленник не знает коды других пользователей и не может обойти защиту.
Получается такое решение. При логине выдает в куки пользователю токен. Когда пользователь заходит на защищенную страницу, проверяем соответствие токена в куках данным в таблице. Если токен пуст или не верный, то редиректим пользователя на форму логина. Если верный - то показываем нужные данные.
Некоторые в качестве токена используют хеш от пароля пользователя. Плюс - это проще, а при смене пароля пользователя автоматом разлогинивает. Но независимый токен имеет преимущества:
- при его утечке, он никак не позволяет определить пароль пользователя
- пользователь не может сам его сгенерировать
- мы можем использовать разные токены в разных доменах (один токен для сайта, другой для моб. приложения)
- при каких-то атаках, мы можем поменять пользователям токены, не меняя им пароли
Если ты не знаешь, что такое куки, то изучи сначала. Тебе может быть придется также прочесть про протокол HTTP, у меня есть урок: https://github.com/codedokode/pasta/blob/master/network/http.md
А тебе тех, что есть в шапке, недостаточно, и ты уже сделал задачу про студентов, про файлообменник итд? Или ты имел в виду простые задачки по основам?
Если есть время, я бы посоветовал codeforces https://codeforces.com/problemset - тут, правда, задачи в основном вроде олимпиадных, на алгоритмы. Не бойся сложности: там есть простые задачи, которые легко увидеть по количеству решивших: если это несколько тысяч человек, то и ты, наверно, решишь (пример простой задачи, я додумался до решения за 5 минут: https://codeforces.com/problemset/problem/1206/A ). Если что, я готов дать подсказку.
>>56376
Уточни пожалуйста, что именно тебе не понятно. Личный кабинет - это просто набор страниц, доступ к которым ограничен с помощью авторизации.
Один из простейших способов авторизации - это куки с токеном. Если пользователь вводит логин/пароль, и они правильные, то сервер выдает ему куку, содержащую токен ("пропуск"), который должен:
- идентифицировать пользователя, то есть указывать, кто это. Например, это может быть id пользователя. Но этот вариант позволяет злоумышленнику самому поставить себе куку с любым id, и не защищен.
- быть защищенным от подделки, чтобы пользователь не мог выдать его себе сам. Например, мы можем для каждого пользователя при регистрации создавать и сохранять в таблице длинный случайный код, и выдавать этот код в качестве токена ("пропуска"). Так как коды уникальные, то они позволяют идентифицировать пользователя. А злоумышленник не знает коды других пользователей и не может обойти защиту.
Получается такое решение. При логине выдает в куки пользователю токен. Когда пользователь заходит на защищенную страницу, проверяем соответствие токена в куках данным в таблице. Если токен пуст или не верный, то редиректим пользователя на форму логина. Если верный - то показываем нужные данные.
Некоторые в качестве токена используют хеш от пароля пользователя. Плюс - это проще, а при смене пароля пользователя автоматом разлогинивает. Но независимый токен имеет преимущества:
- при его утечке, он никак не позволяет определить пароль пользователя
- пользователь не может сам его сгенерировать
- мы можем использовать разные токены в разных доменах (один токен для сайта, другой для моб. приложения)
- при каких-то атаках, мы можем поменять пользователям токены, не меняя им пароли
Если ты не знаешь, что такое куки, то изучи сначала. Тебе может быть придется также прочесть про протокол HTTP, у меня есть урок: https://github.com/codedokode/pasta/blob/master/network/http.md
Попробуй погуглить по "алгоритмы и структуры данных". Я тебе могу дать список самых базовых вещей, которые можно изучить: связанные списки, стек, деревья и графы и алгоритмы на них, бинарные деревья, хеш-таблицы.
>>56004
"менеджер сущностей" имеет свои плюс: он умеет сам искать изменения. Ты изменил (или создал) сущность и несколько связанных с ней, и одной командой все изменения находятся и сбрасываются в БД в нужном порядке. Хотя, конечно, это можно реализовать и в ActiveRecord.
>И да, названия у меня ужасные, придумай что-нибудь получше.
Поясни, знающий анон, как функции называть? Почему prepareLayoutData это плохо? Я думал плохо это TovarTyt() или VzatVelichiny()
>Нет это плохо с точки зрения читабельности кода
Да ты охуел там, с точностью до наоборот.
Визуальный мусор от скобочек и большего числа строк гораздо сильнее влияет на читаемость и восприятие кода, чем одна строчка.
Вот записывать так сложные условия - уже не очень.
А строка типа
hui && pizda читается изи.
Правда, жалко, это не работает с конструкциями языка. Только с функциями.
Например, unset () так не сделаешь
>Апач не используют по другой причине.
А более вменяемая и легкая настройка - это недостаточная причина?
Всегда люто блевал с этого апача, прежде чем научился настраивать это говно.
Nginx освоил за неделю, ибо там все в полторы строки делается.
я другой анон, но тоже не понимаю зачем вы if в сточку пишите. Мне читабельности не добавляет. Зачем экономить? Может ты еще и туалетную бумагу бережешь и пакетик три раза завариваешь? Смотри какая экономия выходит
>методы по 500 строк
Неправильно декомпозируешь скорее всего. Ещё и на читабельности начинаешь экономить.
Много коротких строк лучше чем мало длинных.
NameName_id
===================
Eva 222222
Joe 333333
Table_2
IdValueUnique_id
===================
8880 222222
99100 333333
Card
Card_nameCard_valueCard_id
===============================
Eva 20 88
Логика такая:
Table_1.Name = Card.Card_name
Table_1.Name_id = Table_2.Unique_id
Table_2.Id = Card.Card_id
Table_2.Value = Card.Card_value
В пустое поле "Card.Card_name" посылается только имя
UPDATE `Card` SET `Card`.`Card_name` = 'Eva'
Как сделать так, чтоб за один UPDATE не только имя посылалось, но и
значение из "Card.Card_value" прибалялось к "Table_2.Value"?
Пожалуйста реши анон, это обучающая таблица, весь день голову ломаю с иннер джоинами.
Хочу посмотреть на этом примере логику отношений таблиц.
Только начал про подключение PHP к таблицам через PDO и пришёл к этому, сильно не бейте.
Сами таблицы http://sqlfiddle.com/#!9/5b279e
NameName_id
===================
Eva 222222
Joe 333333
Table_2
IdValueUnique_id
===================
8880 222222
99100 333333
Card
Card_nameCard_valueCard_id
===============================
Eva 20 88
Логика такая:
Table_1.Name = Card.Card_name
Table_1.Name_id = Table_2.Unique_id
Table_2.Id = Card.Card_id
Table_2.Value = Card.Card_value
В пустое поле "Card.Card_name" посылается только имя
UPDATE `Card` SET `Card`.`Card_name` = 'Eva'
Как сделать так, чтоб за один UPDATE не только имя посылалось, но и
значение из "Card.Card_value" прибалялось к "Table_2.Value"?
Пожалуйста реши анон, это обучающая таблица, весь день голову ломаю с иннер джоинами.
Хочу посмотреть на этом примере логику отношений таблиц.
Только начал про подключение PHP к таблицам через PDO и пришёл к этому, сильно не бейте.
Сами таблицы http://sqlfiddle.com/#!9/5b279e
Спасибо, я уже это вчера читал. Это совсем не то, кстати.
У меня не обновление множества форм за раз, а отправка имени в пустое поле уже готовой формы и (самое сложное, из-за чего проблема-то) нужно с налёта сверить это имя с именем в 1й таблице и только потом скопировать уже имеющиеся значения в 3й таблице, сверив айди имени 1й таблицы с айди мени во 2й. Здесь вроде триггер нужен, но это пока сложно для меня.
Вообще, это странное задание. Джойны применяются обычно при выполнении выборки, SELECT. Ты джойнишь две таблицы, получаешь их декартово произведение (все возможные сочетания строк), отсеиваешь их по условиям, группируешь если надо, сортируешь, ограничиваешь количество.
Ты разобрался с джойнами в запросе SELECT? Если нет, я бы советовал изучить:
- JOIN (INNER JOIN)
- LEFT JOIN
- связи один-к-одному, один-ко-многим, многие-ко-кногим
Далее. твоя схема таблиц странная:
> Table_1.Name = Card.Card_name
Какой смысл дублировать имя в 2 таблицах? Если у тебя имена хранятся в Table1, то в Card достаточно сделать ссылку (внешний ключ) на поле Table1.Name_id . Так, как у тебя, обычно не делают (ну или может есть какая-то причина?).
Я бы советовал тебе прочесть еще мой урок про нормализацию, чтобы такого не допускать: https://github.com/codedokode/pasta/blob/master/db/normalization.md
Если тебе надо обновить 2 таблицы, самым простым способом будет открыть транзакцию, сделать 2 UPDATE, закоммитить транзакцию.
> UPDATE `Card` SET `Card`.`Card_name` = 'Eva'
Ты учел, что это обновит не одну строчку, а во всей таблице во всех строчках обновит поле?
Как жить дальше? Можно ли поменять api на apache или nginx?
>Джойны применяются обычно при выполнении выборки, SELECT.
Что нужны джоины это я сам себе придумал, разбирая другие примеры из инета. это была попытка создать логику отношений, чтоб обновлялись нужные данные на основе имени и айди, а не вся таблица. После твоих слов я попробовал без них:
UPDATE `Card`,
`Table_2`,
`Table_1`
SET
`Card`.`Card_name` = 'Eva',
`Table_2`.`Value` = `Table_2`.`Value` + `Card`.`Card_value`
Как ты и написал, заполняются именем Eva вся таблица "Card" и прибавляются все значения во всей таблице "Table_2".
Вообще я думаю, что это что-то нужно в WHERE
WHERE
`Table_2`.`Unique_id` = `Table_1`.`Name_id`
Или AFTER UPDTE `Card`.`Card_name` ...
Иначе как база будет брать Eva в момент её заполнения и тут же выполнять другие действия, основываясь на этом имени и уникальном айди на лету за раз.
>Я бы советовал тебе прочесть
Спасибо, почитаю.
Надо смотреть документацию, но обычно shared hosting подразумевает, что ты просто получаешь папку на диске, а веб-сервер настраиваешь не ты. Но тебе надо посмотреть, может быть у них есть какие-то опции, это все-таки известный хостер.
Metanit.com
>Ты учел, что это обновит не одну строчку, а во всей таблице во всех строчках обновит поле?
Сделал
WHERE
`Card`.`Card_id` = 88
Теперь обновляет только нужную строчку, но всё ещё
>прибавляются все значения во всей таблице "Table_2"
а не к нужной айди имени...
UPDATE `Card`,
`Table_2`,
`Table_1`
SET
`Card`.`Card_name` = 'Eva',
`Table_2`.`Value` = `Table_2`.`Value` + `Card`.`Card_value`
WHERE
`Card`.`Card_id` = 88
AND `Table_2`.`Unique_id` = `Table_1`.`Name_id`
AND `Table_1`.`Name` = `Card`.`Card_name`;
Без ошибок, но ничего не посылается, т.к. не проходит проверку `Table_1`.`Name` = `Card`.`Card_name` из-за того, что `Card`.`Card_name` пустое. Если вручную вписать `Card`.`Card_name` , то в `Table_2` происходит всё как надо. Всё логично, т.к. SET и WHERE пыполняются одновременно, а не последовательно, но куда рыть тогда? Всё же CREATE PROCEDURE и триггер AFTER UPDATE А может всё же можно как-то без них? ?
Нет.
Спасибо за ответ.
В теъ. поддержке ответили что поменять api можно только на выделенном сервере.
Конечно, не стесняйся.
Вот такой код. Выдаёт синтаксическую ошибку. Хотя синтаксической ошибки вроде как нет.
Не могу понять, тут какая-то неверная конструкция или что-то действительно не так с синтаксисом.
Пытался спросить у Гугла, не нашел ответ
/
<?php
public static function get_all_versions() : array {
global $CFG;
self::init();
$versions = array();
$versions['core'] = self::fetch_core_version();
$usecache = false;
if (CACHE_DISABLE_ALL or (defined('IGNORE_COMPONENT_CACHE') and IGNORE_COMPONENT_CACHE)) {
$usecache = true;
}
?>
У тебя не поддерживает указание типа возвращаемого значения. Возможно ты пишешь на php 5. Просто убери ": array". Должно заработать
Если ты можешь в своей локальной копии репозитория удалить лишние коммиты, то потом ты можешь ее принудительно выгрузить на гитхаб.
У Гитхаба есть мануал: https://help.github.com/en/articles/removing-sensitive-data-from-a-repository
Благодарю, то что нужно
>>59108
Смотрю вот это обучающее видео и повторяю практически все, как там есть:
https://www.youtube.com/watch?v=xihMCwARRpk
Разве что название сайта я поставил свое, плюс у меня не MySQL, как у автора, а MariaDB, но я читал, что они практически идентичны, т.к. мария - ответвление SQL. По идее все эти вещи никак не могут стать причиной ошибки, которую я получил.
Я уже где-то на 26-27 минуте видео. Не знаю даже, с какого лучше момента это смотреть, чтобы понять суть моего трабла.
В общем, автор ролика там собирается из базы данных вывести на сайт названия категорий статей в шапке. У него это получается, а у меня нет, потому что вылезает ошибка. У него тоже вылезают ошибки зачастую, но он их по ходу дела быстро исправляет. Я же так и не понял, что в моем случае не так.
Я запоролся на том моменте, где надо в конфиге прописать require, чтобы подключить db.php.
Мне выдает ошибку, что такого файла нет (см. скрин). Но файл-то есть. И он находится в той же папке, что и конфиг. Что может быть не так с моим файлом или путем к нему? Не удивлюсь, если я проглядел что-то совсем уж очевидное. Такое часто у меня бывает, но сейчас что-то совсем долго не могу самостоятельно найти решение.
Кстати, заметил, что автор ролика когда делает какие-то подключения, в одном случае ставит помимо кавычек еще скобочки вокруг ссылки, а в другом случае просто ставит кавычки. Я так понимаю, вообще без разницы, как это оформлять, но какой способ лучше?
Может кто-нибудь оценить актуальность и полезность этого ролик? А то вдруг я хуитой занимаюсь? Те туториалы, которые выложены в этом треде в шапке, я решил потом чекнуть. До этого учил html и css на сайтах codecademy и htmlacademy(по сути русский аналог предыдущего).
Не надо смотреть всяких ютубных професси-аналов, тем более учиться по их хайповым высерам. Достань нормальные курсы с подачей и структурой материала, нормальным преподавателем и лабораторками. И не брезгуй задачами из ОПпоста.
Хуетой занимаешься.
Будь внимательнее - ты опечатался в имени файла. Смотреть видео мне лень, скобки в require не требуются, значит, можно их не ставить.
MariaDB обратно совместима с MySQL и на ней все запросы должны работать нормально. Если что, список различий:
https://mariadb.com/kb/en/library/mariadb-vs-mysql-features/
https://mariadb.com/kb/en/library/mariadb-vs-mysql-compatibility/
Кстати, а какие есть действительно годные курсы для новичка по php? Чтобы при этом не разжевывали по 50 минут мелочи, потому что я немного в теме.
мимо
Узнал, что можно жс-код прямо в пхп-функциях прописывать, а потом выводить на страничку. У автора наверняка была шизофрения.
Спасибо, анон. Ну я и даун. Удивительно, что я так долго не замечал этой опечатки. Хотя не исключено, что траблы со зрением сыграли свою роль.
>вордпресса
Всегда было поделием для пиндосских домохозяек. Сорт оф эпл в мире бложиков. Чего ты ожидал?
На реактивной тяге Цукера.
По крайней мере теперь понятно откуда у пхпшников слава обезян за клавиатурой - благодаря таким вот мартыханским поделиям.
Я бы и сам так считал, если бы не знал, что это дикое легаси.
http://phpfaq.ru/pdo
Вроде норм.
Делай новый массив
На кого учишься?
>Кстати, а какие есть действительно годные курсы для новичка по php?
https://www.php.net/manual/ru/langref.php
А видеокурсы?
Пилю еще пару лайфаков.
Лайфак №2. List.
[$year, $month, $day] = $this->getCurrentCalendarDate($_calendar_name);
Иногда функции надо вернуть несколько значений, но городить отдельный объект данных зачастую лень, долго и нецелесооразно.
Тогда просто в функции возвращаем массив с нужными значениями, а потом распаковываем его в переменные с помощью list.
Лайфак №3. Общепогромистский.
Когда надо сформировать таблицу из N строк и K столбцов, то, как правило, делают 2 вложенных цикла.
Но можно обойтись и одним циклом!
Зачастую это очень полезно, когда таблицы разных размеров и количество строк и столбцов заранее неизвестно.
$cols = 4;
$result = [];
foreach ($array as $index => $value) {
$row = (int)\floor($index / $cols);
$col = $index % $cols;
$result[$row][$col] = $value;
}
Этот код сформирует таблицу из 4 столбцов и нужного количества строк.
Охуенно простая формула, целочисленное деление (с округлением вниз) + остаток от деления всегда дают точные номер строки и столбца для данных.
Во многих случаях облегчает жизнь.
в мыВамПерезвоним тредах писали что платят за пшп меньше, но вакансий/работы в разы больше
сайт http://koromiav.beget.tech/students/public/
Платят меньше по сравнению с чем?
ДА КАКОГО ХУЯ БЛЯТЬ. Я В РЕЗЮМЕ НЕ ПИСАЛ ЧТО ЗНАЮ ВОРДПРЕСС ОНИ ЕБАНУТЫЕ?????
только что вышел из спячки
>[$year, $month, $day] = $this
Теперь можно без list($year, $month, $day) ?
Пили еще мне нравится.
Я хотел создавать сайты. А не разбираться в готовых плагинах.
Помимо пхп я знаю кучу других языков. К тому же ПХП был в учебной программе, а вот вордпресс нихуя.
Пускай бухгалтерш сажают за вордпресс какого хуя программистов в этом разбираться заставляют?
Нахуй ты берёшься за эту работу, если нихуя не имеешь опыта в вп? Дальше на дваче по каждому кейсу будешь помощи просить?
Угу. Успех уровня /зк.
>Нахуй ты берёшься за эту работу, если нихуя не имеешь опыта в вп?
ВО 1) вакансия без опыта работы. Т.к. я сам без него. Там были скилы php js mysql и тд стандартный набор. Я откликнулся потому что думал меня там азам научат, что логично, потому что вордпрессу в учебных заведениях не обучают.
ВО 2) в резюме указан гитхаб аккаунт с моими проектами. Смысла в тестовых заданиях я не вижу по этой причине.
>Дальше на дваче по каждому кейсу будешь помощи просить?
>кейс
Смешной язык у тебя. Нет не буду просить.
Верстка (спизженый слайдер) без футера и хедера. Но даже так я не ебу как это сделать. Реквестирую хоть малейшую помощь.
Мне было бы проще сделать это задание на голой пыхе в десятки тысяч раз.
Возможно, они проверяют твою способность разобраться в технологии. Возможно, им нужны только те, кто знает ВП. Либо ты делаешь, либо сидишь дальше жалуешься на жизнь в перезвоним-треде.
Вордпресс - это блоговый движок, который допускает расширение, как я помню, двумя способами: написанием тем (наборов HTML/PHP-шаблонов) и плагинов (PHP-код, добавляющий функционал в ядро вопрдпресса).
Вордпресс предоставляет тебе API, содержащее разные функции. Например, если ты делаешь шаблон страницы для вывода поста в блоге, вордпресс предоставляет тебе фукнцию, которая возвращает заголовок поста. Ты можешь его вывести, используя эту функцию.
Также, для плагинов вордпресс предоставляет хуки. Хук - это возможность сделать так, что при определенном событии (например: регистрация пользователя или вывод меню в админке) будет вызываться твоя функция. которая может что-то сделать (добавить еще один пункт в меню).
Еще там есть виджеты - они добавляются в сайдбар блога.
Соответственно, для решения твоей задачи надо либо найти готовые плагин/тему, либо написать свои.
Вот документация по ВП: https://wordpress.org/support/
Вот документация по теме customizing: https://wordpress.org/support/category/customizing/
И тут, смотри, как много всего: https://codex.wordpress.org/Plugin_Resources
Ты можешь заметить, что в твоей задаче речь не о блоге. А кого это волнует? Значит, надо сделать блог, который выглядит как указано в задаче.
> Я откликнулся потому что думал меня там азам научат,
Ты с дуба рухнул? Учат в школе, колледже, на курсах. Коммерческой компании нужно зарабатывать, а не благотворительностью заниматься. Есть такая вещь, как internship (стажировка), но это в больших компаниях, которые могут себе это позволить, и там, я думаю, они учат каким-то специфичным внутрикорпоративным штукам (которым нигде в другом месте не учат). Так как учить вордпрессу нет особого смысла, его можно изучить самому или на курсах.
Также, ты путаешь CMS и CRM. CRM - это штука со списком клиентов и заказов, которая помогает принимать звонки или делать обзвоны.
ЗАМЕЧУ!
>localhost то же что 127.0.0.1
В свое время сильно погорел на этом на Винде. Пока писал везде localhost думал что код тормозит, искал где мог лохануться. Потом попросил друга запустить, а у него Линукс. И все залетало. Когда руки дошли это поменять у меня в коде, и все стало нормально, жопа хорошо так сгорела. До этого думал что программирование прямое как стрела, а оказалось рекой с камнями.
опечатался соре. но все и так поняли что я имел ввиду
>Ты с дуба рухнул? Учат в школе, колледже, на курсах.
Конкретно вордпресс учат на курсах либо дома за компом. Тогда нахуя требовать ПХП джс и тд, если максимум это натягивание верстки.
Я смотрю ты спец, можешь посоветовать, что делать человеку без опыта в индустрии? Стоит ли идти буквально за копейки работать ради опыта или стоит сидеть дома, ебаться с тестовыми заданиями?
Анон, я сам новичок, ничего дельного не посоветую. Но вот смотри, тебе же надо:
1.Инструмент, который бы в админке вордпресса давал возможность добавлять картинки для твоего слайдера
2.Выводить этот слайдер на страницу.
Скачал дистрибутив вордпресса:
https://ru.wordpress.org/download/
Установил его локально. Заходишь в админку - слева будет меню. В меню есть пункт "Медиафайлы" (\wordpress\wp-admin\upload.php). Этот компонент уже позволяет загружать файлы. Можешь грузить файлы через него, только добавляешь какую-нибудь галочку чтобы как-то различать просто файлы и свои - галерейные. Если хочешь - можешь вообще сделать копию этой страницы, переименовать в test.php, и перепрограммировать ее немножко, типа внутри путь к своей собственной папке поставить. Вывести твою новую страницу можно через файл menu-header.php, он выводит левое меню, я топорно вставил после 255 строки код
echo '<a href="test.php?post_type=page" class="menu-icon-page" aria-haspopup="false"><div class="wp-menu-arrow"><div></div></div><div class="wp-menu-image dashicons-before dashicons-admin-page"><br></div><div class="wp-menu-name">моя страница, скопированная с уплоад.пшп</div></a>';
и вроде работает. Если эту страницу подредактировать, поменять пути какие-нибудь, у тебя будет инструмент в админке для загрузки/редактирования твоих картинок. Останется в шаблоне главной страницы вывести загруженные файлы в верстку. Это очень топорный способ, по уму надо читать документацию, которую аноны выше предложили по созданию всяких модулей/плагинов. Но это может хоть как-нито помочь. Другой путь - сходить на рутрекер или другой ресурс, скачать плагин для вордпресса с каруселью и на его основе свой сделать
Решил что одному учиться грустно и ищe единомышленников, желательно адекватных с которыми можно обсудить проблемы/вместе писать проекты. Наверно это нужно писать в /soc но тем не менее.
Если что почта для связи
Как раз программист и разберётся, даже начинающий. А вот крикливое хуйло без скиллов будет бегать по форумам и просить чтобы ему всё разжевали.
А что ты хотел?
Php в России сейчас на 90%+ ВП, Юми и Битрикс.
Либо ращуй глаза перед отправкой резюме, либо пиздуй в другие языки, раз уж ты много их знаешь.
>одному учиться грустно и ищe единомышленников
В смысле - всей кучей тех же студентов из ОПпоста писать? Зачем?
Тебе ментора искать надо, а не единомышленников.
С другими языками сложности. Так как у меня все проекты веб, либо чисто фронтенд, либо пыха. Курсач и игру спейс инвайдерс на сишарпе делал. Мб их залить на гитхаб показать работодателю.
Как думаешь стоит ли на сишарпе поискать работу раз в рашке только вп, битрикс вместо пыхи?
Алсо проблема в том что мне очень нравится веб-разработка, но и программирование тоже. Что делать собственно?
Но жалко что в рашке это нихуя не популярно. Я же сидел на апворке ахуел сколько там заказов на сишарпе. Эх ну почему так?
+ я тока десктопные приложения умею пилить + немного асинхронных процессов изучил. Но нашему пынябизнесу это офк нинужна
Ты чо баба?
Хватит ныть.
Просто найди любую работу программиста. Любую. Хоть ВордПресс, хоть сап, не к вечеру помянут.
А там уже учись дальше и сможешь найти любой проект/стек/коллектив/условия.
Как же я тебе двачую блядь. Как заебали эти битриксы блядские.
Пишу красивый годный код. Начальник полтора года назад начал вкатывать меня в битрикс, с этого момента я узнал как это когда писать впадлу.
Начальник думает что я выучил и разбираюсь, а я просто проебую пол дня на ютуб, а потом методом тыка ищу куда тыкнуть надо и так уже полтора года. Пробовал посмотреть уроки, но порвался от хуесоса жирного омежного который их ведет.
Дичайше говрит от того, что я должен разбираться в том как пользоватьс готовыми программами, вместо того чтобы писать их. Это тоже самое, что мастер по ремонту телевизора приходил бы не ремонтировать его, а определять в какое место в комнате более красиво былобы его поставить сука блядь.
Все cms это готовая хуйня для клиента - прогеру там делать нехуй. Есть готовые темы и плагины - пиздую в админку и кликай, пердолится с этим - это не программирование.
Отдельное горение возникает от того, когда клиенту надо поменять чтобы что-то готовое было другим блядь. ЕСЛИ ТЕБЕ НЕ ПОДХОДЯТ ГОТОВЫЕ РЕШЕНИЯ - ПРОСИ МЕНЯ НАПИСАТЬ СВОЮ ПРОГРУММУ НА ФРЕЙМВОРКЕ ИЛИ ВАНИЛЬНЫМ КОДОМ, А НЕ ПЕРДОЛИТЬСЯ С ЭТИМ ГОВНОМ
очевидный mysql
html/css - это мастхэв для любого ЯП в принципе
js - тоже мастхэв для всех, но достаточно знать его по верхам
Зависит от того что за работа. Если написано, что надо знать Laravel, то надо его знать хуле.
По опыту скажу, что надо знать все, но тебя особо не ебут если не знаешь. Просто за то, что знаешь ЗП повышают.
Так например когда я устраивался я вообще толком не шарил в линупсах и администрировании серверов, расчехлился начал уметь это все настраивать - ЗП подняли, а я и не против - мне интересно.
>Отдельное горение возникает от того, когда клиенту надо поменять чтобы что-то готовое было другим блядь.
Люто двачую. Это говно вообще за гранью моего понимания. Помню как-то знакомый подкинул работку добавить какой-то блять новый тип(?) для комерс плагина, я вп никогда не трогал(так и не трогаю) но деньги были норм и решил посмотреть что там. Короче у этого плагина есть своя архитектура и главный тип Product везде захардкожен как строка, просто по всему коду. Я, если честно, так и не понял что от меня хотят и почему нельзя использовать дефолтные значения, как это задумывалось авторами, но потом нашел платную версию за 30$ и скинул ссылку.
Еще недавно другой знакомый попросил сверстать лендос, я такой "ОК", а он такой сразу "клиент хочет на битриксе, потому что у него основной сайт тоже на битриксе и типа одна экосистема", я поинтересовался мол зачем такой монолит как битрикс тянуть для лендинга, в ответ услышал что-то типа "ему нравится текстовый редактор и можно изменять фотки".
Мне это напоминает какое-то болото, клиент использует какой-то популярный продукт, который не всегда к месту(интернет магазин на вп это сильно конечно), а потом на фрилансе заказы в стиле "всего лишь добавить один дропдаун, если вы ебать охуенный спец то дело на 5 мин" а там на самом деле чтобы этот дропдаун добавить раком пол дня стоять потому что везде спагетти из говна и палок, и "разработчик" вместо того, чтобы написать 10-20 строк кода за 30 минут, пол дня сидит и кликает мышкой по настройкам, что-то руками вбивает в бд, хакает кор фреймворка и т.д.
И чем фреймворк так сильно от цмс-ки отличается, кроме количества готового кода?
Тем что в популярных цмсках лютый древний непролазный говнокод. А современные цмски с нормальным кодом как правило малопопулярны. Ну и в цмсках в большинстве случаев все зависимости захардкожены под друг друга, а в фреймворках с DI можно поменять все, даже небо...
- добавил пару сайтов
- починила автозум
- сделал кэширование страничек
В планах:
- Запоминать позицию на странице
- отправлять главу в кэш
брикинг ньюс!
Это не говнокод, это НАСЛЕДИЕ доООПшных времён.
>цмс-ки
Работают на уровне пользователя - чтобы быстренько навасянить что-то из готовых плагинов и тем. Обычно довольно сильно ограничены по функционалу и заточены под что-то одно. Часто является морально устаревшей хуйней.
Много откровенных говнокодеров и плохая безопасность как следствие.
>фреймворк
Более низкий уровень - каркас приложения для программиста. Часто требуют некоторых умений и знаний для использования. Ограничений нет - можно писать хоть собственную цмс, форум, магазин, лэндос, твою мать, и аллаха.
Приложения на них являются чем-то вроде костюма по личной мерке, а не штамповкой из украденных на рынке цветных тряпок.
Разработка стоит дороже, но программисты, обычно, на них лучше + безопасность выше.
>>цмс-ки
Алсо, являются сильно условно-бесплатными. Как только захочется сделать что-то большее чем стандартный шаблон с парой правок - для интернет-вывески, то сразу начнут доить по каждому пункту. Причём получишь за свои деньги штампованный продукт, который ещё и доводить до ума надо, опять же деньги.
Из бесплатного там только самый минимум.
Ковырял как-то модный у васянов элементор и охуел от того факта, что вообще все хедеры и футеры у них платные - это где они сайт без хедеров и футеров видели? То есть вообще все 10 штук. И далее везде такое.
Джун.
Никто вменяемый не будет писать коммерческие вещи на чистой пыхе - долго и дорого. Потом ещё и поддерживать это задолбаешься.
1 Коды в одном файле - используй переменную
2 Коды в разных файлах - используй include
3 Коды в разных файлах и помещены в классы - используй автозагрузку классов. Например композером.
intval(), strval() и подготовленные выражения в pdo.
Основное отличие, с точки зрения разраба - фреймворки сделаны для того, чтобы можно было писать расширяемый/дополняемый/изменяемый код. ЦМС - чтобы подключать готовые решения из админки, править тамошний код - побочная хуйня.
Все дело в том, что клиентам почему-то кажется, что раз цмс - это почти готовая хуйня то ее и пилить меньше, в то время как больше времени ты проебешь на разбор того, как устроен очередной говноплагин, чтобы поменять там цвет какой-то залупы
без мягкого знака
Можно выделить всю строку если нажать на ее номер. Так-же можно выделять несколько строк.
И еще одну фичу нашел — можно создавать новый файл при двойном клике на поле с вкладками.
Чувствую наговнокодил.. но вроде всё работает..
Правда поиск только по одному слову ищет, так и не понял как сделать поиск по нескольким словам(а нужен ли он вообще?).
https://github.com/hikkej/student_list
А где по твоему опыт я буду брать? Из онлайн туториола? Чтобы потом работодатель говорил "мы нитак делаем пошел нахуй"?
И вообще что значит научили? Программировать я умею а вот в сраном ВП не шарю. Здесь нет моей вины.
Да было бы все так просто. У меня фобия что из-за того что нет военника меня никуда не возьмут. + все вакансии это вп ебучий.
>Качаешь вп и изучаешь
я не он, но кто его кормить будет пока он учится? И кстати да, вп скачать можно, а вот битрикс...
Бля с биртиксом делал тестовое неделю назад. HR говорит сделай за день ну я и сделал в итоге он начал пиздеть что нихуя не может проверить. Завтра типа сможет. Но завтра он не написал и вообще нихуя не ответил.
Наес тестовые задания))))))))
Алсо реквестирую способы борьбы с такими пидорасами.
Вангую что они уже нашли кого то.
Доплачивать всё равно придётся.
>кто его кормить будет пока он учится?
А кого это ебёт? Работодатель ему мамочка что ли? Повзрослейте уже.
>Повзрослейте уже
по твоей логике выходит, что ты сразу из роддома работать пошел? Тебя самого родители не обеспечивали?
Какую зп джуну просить в дс2 без опыта работы?
Людям из дс-ов вообще платить не надо. Они - кровопийцы и сосут последнее из наших регионов.
>по твоей логике выходит
>сразу из роддома работать пошел
У тебя проблемы с пониманием контекста?
Речь о работодателе идёт.
Все деньги Москва сжирает, а потом перераспределяет по регионам. Так в чем виноват я житель дс2?
Не очень понятно сформулировал, наверное. Суть в том, что, допустим, если я удаляю из базы данных что-то с айди 7, к примеру, то при создании следующего объекта ему будет присвоен 8-ой, в то время как я хочу, чтобы был 7-ой айди, потому что он не занят после удаления старого. В общем, как сделать, чтобы так сделать? Сорри за косноязычность.
Анон, а зачем тебе так делать? Если ты хочешь в таблице, например, фамилий вывести слева столбец с красивыми числами по-порядку, то это не айдишники надо выводить, а тупо сделать какой-нибудь $num-плюс-плюс. Зачем еще такая штука может понадобиться?
Я вывожу статьи. У каждой свой айди. Мне не нравится, что после удаления некоторых "тестовых" статей из базы данных, их айди уходят в небытие, а остаются только те, которые не удалялись, но при этом айди для новой статьи выводится в зависимости от того, сколько уже статей создавалось, а не отсчитывается от последнего созданного айди с прибавкой единицы.
Вот этими?
https://habr.com/ru/post/37693/
Спасибо. Еще бы какой-нибудь гайд по этим триггерам исчерпывающий.
Я пока что совсем новичок в программировании.
Бля стояло 50к и ни одна сука не взяла на работу. Такое ощущение что туда приходят додики за 35к. В итоге рыночек решает что я не рентабелен. Может такое быть?
Стоит ли мне понизить планку до 35-45к ради опыта работы?
Да и нормально. У тебя какой-то нездоровый перфекционизм.
Опыта набираются во воемя учебы. Скачал виртуалку, развернул вордпресс, открыл вакансии с вордпрессом, откликаешься на заявки и клянчишь тестовое задание, делаешь их, самые мнтересные в гитхаб. Вот тебе и опыт.
Дебил ты ебаный ну сколько тебе лет? Залупа ты дроченая, ну хуле ты такой тупорылый?
Волка ноги кормят. Ещё один даун блядь. Учится надо в перерывах между работой. Хоть грузчиком, хоть таксистом, а в свободное время учеба.
>Что значит стояло?
Значит что я сейчас думаю делать ли ниже ЗП в резюме на хх.ру.
В данный момент стоит 50к рублей. Изначально в начале августа при создании резюме я столько указал.
>На собесе обсуждали зарплату?
С одной hr-кой в пулково 3. Она сказала что устраивает. Еще один "бос" Михаил Грохотов игнорщик с битриксом сказал что устраивает.
>Что умеешь вообще?
Умею PHP, Symfony, MySQL, JS ES6, HTML5, CSS.
Хорошо владею C# + изучали в шараге С/С++, Delphi, pascal, assembler.
Сам я дипломированный специалист.
>>60756
Мне 20 лет. А вообще пошел нахуй с таким общением.
Ты очень "душный тип", судя по постам. Возможно отлетаешь из-за people skills.
По частям:
>Умею PHP, Symfony, MySQL, JS ES6, HTML5, CSS.
На гитхабе есть что показать сложнее круда?
Все упирается в код, техническое собеседование и общую адекватность.
>Хорошо владею C# + изучали в шараге С/С++, Delphi, pascal, assembler.
Это в резюме не клади. Оно сразу в корзину улетит.
>Сам я дипломированный специалист.
"имею профильное образование"
Как ты в 20 лет уже с дипломом, поступил в 15?
Я же писал что в шараге учился "изучали в шараге". Конкретно ФСПО.
Мне люди никогда не говорили что я душный. Наоборот веселый позитивный.
Хорошо уберу лишнее из резюме.
Но как поступить с заработной платой? Ты сам с какого города?
> Мне 20 лет. А вообще пошел нахуй с таким общением.
Шлюха, слушай старших, если у самого ума нет нихуя. Как ты собрался выживать без мамкиной сиськи? Девочка, ты будешь сидеть итт и внимать всему, что я тебе скажу. Ты ещё мал и глуп, чтобы выёбыаться и своё мнение навязывать. Понял, блядь?
Я хуею с вас дебилов малолетних как вы не можете крутится и прокладывать свою дорогу. Всему вас мудаков учить надо.
Ох блядь и дуры вы дурные.
>Программировать я умею а вот в сраном ВП не шарю
Значит не умеешь.
Что за нытьё вообще? Либо умеешь и делаешь, либо идёшь нахуй с поезда.
Ты лицемер. Уверен, тебя все детство содержали родители, кормили, одевали. И что-то я не думаю, что ты отвергал их помощь, крича "Я ВОЛК МЯМЯ РЫЫЫ!" И мат тебя не красит, ты не выглядишь взрослее и мужественней, наоборот, мат - это показатель идиота
а через file_get_contents не получается?
С чего ты решил, что работодатель должен к тебе относиться как родитель? Ты у начальника ещё сисю попроси в обед - быстро трудовую на руки получишь.
Прекращайте бесполезный флуд, тут не тред перезванивающих.
>>60773
Непонятно, зачем ты тут опрос устраиваешь, если ты не работодатель и никак с трудоустройством не поможешь.
>>60756
Не умеешь нормально общаться, лучше ничего не пиши.
>>60736
Жалобы на работодателей в тред перезвонивших.
>>60731
С виду смысла нет.
Я изрекаю мысль как хочу, обилие мата доставляет мне эстетическое удовольствие.
Касаемо твоего высера - я с 15 лет работаю. К слову мне сейчас 32. Начинал я как принеси, подай, пошёл нахуй, не мешай. И не разрабом, а в сраном автосервисе. Среди моих знакомых не было ни одного человека, кто бы увлекался вебом. Даже в местной шараге, в которой я учился, я единственный кто писал диплом про веб разработку. Преподы вообще нихуя не поняли про что диплом.
>>60869
Я умею общаться, но когда вижу инфантильных мальчиков меня аж клинить начинает. Жаль, что мы не спартанцы. Тебя бы сразу с обрыва сбросить нахуй надо было бы.
Пользователь сохранил в избранном на статью с большими хуями, ты ту статью удалил, а id теперь принадлежит статье с сиськами. И вот хочет пользователь подрочить вслатсть, открывает избранное, переходит по автоматически сгенерированной ссылке, а ты ему вместо хуёв сиськи подсовываешь. Плохо, нельзя так делат.
Так и должно быть, иначе у тебя получается не удаление статьи, а замена одной статьи на другую.
>но при этом айди для новой статьи выводится в зависимости от того, сколько уже статей создавалось, а не отсчитывается от последнего созданного айди с прибавкой единицы.
Для урл наверное лучше генерировать какой-то уникальный slug из названия статьи, так ты скрываешь сколько у тебя в общем статей на сайте, это вроде как лучше для сео и т.п.
Самопис дает возможность сделать что угодно, но стоит больше денег (либо времени на разработку). Крупные торговые сети вроде как обычно пилят что-то свое. CMS позволяют быстро создать шаблонный магазин, иногда без программирования, но кастомизация (например: скидочные программы, логика оформления заказа и тд) может быть болью.
Хороший разработчик способен разобраться и в том, и в том.
Ставлю ; после }, отбиваю вложения табуляцией.
Я вкатывальщик 19 лвла, есть заказ на автомобильный магазин. Клиент не шарит вообще и был найден по сарафанному радио ( т.е не крупная какая-то сеть, а частник). Последние два дня повкатывался в CMS (Modx,WP). В целом я как программист могу и обойтись без этого. Но хочется с этим проектом продвинутся в теме современного веба, А то мне подумалось что самописы это изобретение велосипедов, поправь мои рассуждения, если я не прав.
Интернет-магазины сейчас не нужно писать, это глупо. Там до жопы фич нужно, заказы, корзины, интеграции с платёжными системами, выгрузки, купоны, акции, скидки, витрины, напоминания, dwh и прочая и прочая.
Полноценно писать такую систему очень долго (несколько лет) и сложно (потому что это коммерц, там много нетривиальных задач), и написать её хорошо сразу не получится (те системы, что уже есть на рынке, развиваются и пишутся последние лет 10, множеством программистов).
Конечно, можно начать с нуля и потихоньку наворачивать одну фичу над другой, но во-первых это будет обрекать тебя на цикл разработки сразу же, как захочется хоть что-нибудь изменить, а во-вторых некоторые вещи вроде event sourcing'а закладываются в архитектуру сразу же и я не верю в то, что ты сумеешь заложить сразу всё правильно.
Да и бизнесу это всё не нужно.
Короче, если у тебя рядом (или ты сам) сидит мамкин бизнесмен и хочет себе интернет-магазин - бусть башляет 1000 рублей любой онлайн-платформе для этого и получает сразу вообще всё готовое. Максимум, потратится на дизайнера и фронтендщика. Зато ему не придётся думать о хостинге, бекапах и прочем.
Если есть твёрдое решение хоститься у себя - берите уже готовое решение, магенту, друпал коммерц (есть сборка commerce kickstart), вордпресс (у него должны быть плагины) и т.п.
угомонись, матершинник. Ты не вписываешься в тред. Советы дельные не даешь, всех оскорбляешь. Здесь новичкам помогают, а не матерят их. Поищи себе другую доску, уверен в /au ты найдешь единомышленников. Там и тачки можно обсудить, и свою зазнобу, и тугосерю, и спорт - все, что интересно человеку, начавшему трудовой пусть в пятнадцать лет с разгрузки товорняков с зеками
анон, я сам слаб в пшп, вот сам код, который уже работает, но без запроса командной строки о вводе твоих чисел. Погугли как это делается
Есть старый сайт который пилится уже 10 лет, на нем обычная перезагрузка страниц, никакого спа. Заказчику нужно прикрутить на сайт систему звонков и прочего. У сторонней системы которую интегрируем есть виджет звонков, не вездесущее "мы_вам_перевозним_через_2_минуты_вы_только_оставьтетелефон-говно" , а реальное voip на js'e, который как я понимаю заточен под спа и работает на реакте (в доках написано, сам я не знаю что там на самом деле).
В общем есть проблема с тем, что при перезагрузке кусок js'a который отвечает за этот виджет эхается снова, по новой загружается виджет и все такое. А нужно что бы пользователь мог общаться без разрывов, перезагрузок сессий и прочего и при этом продолжать серфить сайт потенциально, то есть не быть привязанным к одной странице на время звонка.
По сути вопрос в том, что есть ли какой-то механизм, когда пользователь ливает со страницы на другую, то какой-то окуклить js и перенести его на другую страницу?
Зачем? Хз смотря что хочешь делать.Так же можно легко угодить не в программирование на пхп а в разработку на вордпрессе, модх, опенкартах и прочем дерьме. Будешь не прогать а васянить одну херню к другой.
Шизоид, ты сейчас с другим человеком переписываешься.
В тред не вписываешься именно ты, со своими дружбой и понями. Вали на свой доброчан, двуличная скотина - заебал со своим нытьём.
Кто тебе вообще право дал - других одёргивать? У тебя гондурас опух выше всякой меры и хуесосят тебя тут по делу.
Пытаться делать стабильный js внутри перезагружающейся веб-страницы противречит логике работы браузеров и, поэтому, бессмысленно.
Просто открывай по клику на это говно новое окно/вкладку, в которой уже и будет колл. Google так же делает в своём Hangouts по той же самой причине - при клике на видеозвонок открывается новое окно.
Он про то, что есть куча вакансий, заключающихся в формошлёпстве, где ты двумя заученными клацами по веб-интерфейсу в CMS-ке будешь накликивать примерно то же самое день за днём. Такое сайт-кликерство - это низшая квалификация "веб-разработки" и потому презирается.
По теме, вкатываться никогда не поздно, но, как и всегда, лучше приложить максимум усилий для поиска достойного работодателя. Тебе потребуется работадатель с современным стеком (только symphony / laravel, всех васянов с yii/вордпрессом/самописками/прочим говном посылай сразу нахер), поставленным процессом(git, dev-stage-prod, код-ревью, ci/cd, докер и всё такое) и системой наставничества, чтобы ты мог получать знания от компетентных людей.
В противном случае влезешь в говноконтору и там и залипнешь на неопределённый срок, да ещё и плохих практик нахватаешься (а узнать, плохие они или хорошие не сможешь, т.к. опыта нет).
>Кто тебе вообще право дал - других одёргивать?
это ты, дурачок залетный, закатился в тред и начал всех оскорблять.
>и хуесосят тебя тут по делу
Почему во множественном числе? Ты типичная слабовольная овца, что ищет поддержки и апеллирует к какому-то стаду? Повторяю, тред создан для помощи новичкам, помощь не предполагает оскорблений и флуда. А ты только флудишь и оскорбляешь. Для тридцатилетнего ты слишком глуп
>залетный
Я тут довольно давно уже. Всем нормально, только один дурачок постоянно других разговаривать учит. Как бабка при церкви.
>Почему во множественном числе?
Потому, что не я один так считаю.
>тред создан для помощи новичкам, помощь не предполагает оскорблений и флуда
У тебя ебать какие комплексы по этому поводу, да? Из треда в тред твердишь свою мантру. Видать тебя везде хуями кроют раз у тебя такая фиксация. И немудрено.
>только флудишь и оскорбляешь
Тебя ебать это не должно, полицай.
кех
>только symphony / laravel
>yii
пора бы уже давно выкатываться из интерпрайз медленного говна
https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=query&l=zik073-f
>самописками
тот же баду самописка сомнительно что это плохая контара
>поставленным процессом(git, dev-stage-prod, код-ревью, ci/cd, докер и всё такое)
тут +
>системой наставничества, чтобы ты мог получать знания от компетентных людей
как ты это определишь если
>т.к. опыта нет
алсо в ПХП сейчас эра аутсорса , аутсорс бизнес постраоин чем быстрее тем лучше , потому на рынке сейчас 70% в СНГ подобных котор
Бенчмарк нерепрезентативен, потому что узкое место в 99% это либо база, либо крайне плохой код.
Тем более, slim, phalcon, reactphp и симфони в одном месте - это что-то совсем странное. Одно - микрофреймворки и наборы компонентов для написания ассинхронного кода, а второе - это, блин, полноценный фреймворк.
Симфоня же пропагандирует принципы хорошей архитектуры и компонентного подхода, за что ей плюс. Да и я бы не сказал, что она медленная.
> тот же баду самописка сомнительно что это плохая контара
Поработав на каком-нибудь ларавеле раз - ты легко переключишься на другой проект, что даёт тебе больше возможностей при поиске работы. А вот второго badoo как-то и нет, да и задачи там придётся решать далеко не те, что в большинстве других компаний. Из-за этого тоже не так просто потом будет работу менять.
> как ты это определишь если
По отзывам от действующих сотрудников и ответам на вопросы о наставничестве на собеседовании.
> алсо в ПХП сейчас эра аутсорса , аутсорс бизнес постраоин чем быстрее тем лучше , потому на рынке сейчас 70% в СНГ подобных котор
Я работал на аутсорсе до недавнего времени. Симфони-компоненты (за счёт того, что все проекты были построены на одном стеке - очень легко было шарить знания и просить помощи), dev-stage-prod, ci/cd, и т.п. Не сказал бы, что плохо или что был слишком большой перевес в сторону скорости в ущерб качеству.
> нтерпрайз медленного говна
Ну и да, этой теме уже лет 10, но я всё же выскажусь. Такие вещи, как симфони, дают небольшой оверхед в начале перед тупым кастомным кодом, но очень быстро начинают себя оправдывать за счёт грамотного структурирования кодовой базы и архитектуры, позволяя строить сложные приложения большим командам разработчиков. А вот те, кто начинают разрабатывать с принципом "нахер всё, делаем максимально просто на кастомном коде" очень быстро с нарастанием кодовой базы превращают проект в огромный неподдерживаемый сгусток кода (как-то так: https://www.bangkokpost.com/media/content/dcx/2018/05/04/2749833_620x413.jpg).
Далее, "медленный" - это понятие относительное. быстрее почти всегда будет код на си - но мы же что-то не нём разрабатываем, правильно? Бизнесу не нужно оптимизировать микросекунды, ему нужна примемлемая скорость разработки с приемлемой скоростью отдачи данных пользователям. Своего рода компромисс.
Учитывая пред-загрузку файлов, кэширование на самых разных слоях (включая грядущий JIT), современные компьютерные мощности и производительность современного PHP - писать код можно во вполне широких пределах, жертвуя миллисекундами в угоду читаемости кода и его поддерживаемости.
Уточню, я не имею ввиду "говнокодим и пофиг, оперативка дешёвая", я имею ввиду - слой абстракции, котороый структурирует код, упростив какие-то вещи, но будет требовать создания одного-двух объектов в рантайме - это неплохой компромисс.
Но всегда нужно руководствоваться критерием разумности и оправданности, конечно.
Бенчмарк нерепрезентативен, потому что узкое место в 99% это либо база, либо крайне плохой код.
Тем более, slim, phalcon, reactphp и симфони в одном месте - это что-то совсем странное. Одно - микрофреймворки и наборы компонентов для написания ассинхронного кода, а второе - это, блин, полноценный фреймворк.
Симфоня же пропагандирует принципы хорошей архитектуры и компонентного подхода, за что ей плюс. Да и я бы не сказал, что она медленная.
> тот же баду самописка сомнительно что это плохая контара
Поработав на каком-нибудь ларавеле раз - ты легко переключишься на другой проект, что даёт тебе больше возможностей при поиске работы. А вот второго badoo как-то и нет, да и задачи там придётся решать далеко не те, что в большинстве других компаний. Из-за этого тоже не так просто потом будет работу менять.
> как ты это определишь если
По отзывам от действующих сотрудников и ответам на вопросы о наставничестве на собеседовании.
> алсо в ПХП сейчас эра аутсорса , аутсорс бизнес постраоин чем быстрее тем лучше , потому на рынке сейчас 70% в СНГ подобных котор
Я работал на аутсорсе до недавнего времени. Симфони-компоненты (за счёт того, что все проекты были построены на одном стеке - очень легко было шарить знания и просить помощи), dev-stage-prod, ci/cd, и т.п. Не сказал бы, что плохо или что был слишком большой перевес в сторону скорости в ущерб качеству.
> нтерпрайз медленного говна
Ну и да, этой теме уже лет 10, но я всё же выскажусь. Такие вещи, как симфони, дают небольшой оверхед в начале перед тупым кастомным кодом, но очень быстро начинают себя оправдывать за счёт грамотного структурирования кодовой базы и архитектуры, позволяя строить сложные приложения большим командам разработчиков. А вот те, кто начинают разрабатывать с принципом "нахер всё, делаем максимально просто на кастомном коде" очень быстро с нарастанием кодовой базы превращают проект в огромный неподдерживаемый сгусток кода (как-то так: https://www.bangkokpost.com/media/content/dcx/2018/05/04/2749833_620x413.jpg).
Далее, "медленный" - это понятие относительное. быстрее почти всегда будет код на си - но мы же что-то не нём разрабатываем, правильно? Бизнесу не нужно оптимизировать микросекунды, ему нужна примемлемая скорость разработки с приемлемой скоростью отдачи данных пользователям. Своего рода компромисс.
Учитывая пред-загрузку файлов, кэширование на самых разных слоях (включая грядущий JIT), современные компьютерные мощности и производительность современного PHP - писать код можно во вполне широких пределах, жертвуя миллисекундами в угоду читаемости кода и его поддерживаемости.
Уточню, я не имею ввиду "говнокодим и пофиг, оперативка дешёвая", я имею ввиду - слой абстракции, котороый структурирует код, упростив какие-то вещи, но будет требовать создания одного-двух объектов в рантайме - это неплохой компромисс.
Но всегда нужно руководствоваться критерием разумности и оправданности, конечно.
> https://www.bangkokpost.com/media/content/dcx/2018/05/04/2749833_620x413.jpg).
Сорян, разметка поехала. Вот так правильно:
https://www.bangkokpost.com/media/content/dcx/2018/05/04/2749833_620x413.jpg
так то посыл все верен , только как пользоваться молотком (фреймом) ломать головы или бить гвозди дело сугубо пользователя , по сему как строить грамотную архитектуру это уже к разработчикам а не фреймам , асинк фреймы всё больше набирают обороты , и это очевидно логично в эру микросервисной архитектуры потому на всякие swoole я бы обращал по более внимания. Но в основном с картинкой да ты прав, хотя опять таки это если мы пишем монолит.
> Монолит
Я за весь свой опыт не видел годно организованных микросервисов.
Пришёл к выводу, что правильно написанный монолит можно расширять почти бесконечно, а если пишешь говно, то и микросервисы не помогут.
> Асинк
Просто по статистике с сайтов вакансий, асинк пока не особо популярен. Да и никто не мешает делать асинк и симфони одновременно.
Тем более, что асинк сам-по-себе в пхп сделан через костыли. Я бы писал на обычном классическом php-fpm с симфоней обычный монолит, а узкие части писал бы на golang.
Дико извиняюсь за тупой вопрос а как использовать php с другими языками на одном сервере?
пожалуй под всем подпишусь анончик , спасибо за лайтовый конструктивный разговор ,
разве что асинк должен появиться как стандарт в языке 8 пхп
нечего не мешает делить запросы через тот же nginx между разными софтинами на разных языках
В итоге у тебя получаются несколько приложений, одно центральное - это монолит, а прочие - это сервисы, которые отвечают за отдельные аспекты функциональности, требующие производительности или специфических фич (вебсокеты, нейронки, многопоточная обработка).
В итоге у тебя возникнет три задачи, обеспечения этих сервисов, доступа к ним и поддержки.
Первое решается множеством способов в зависимости от стека, требований и просто вкусов создающих. Самый тупой и сомнительный вариант - запускать прямо из php через shell_exec. Самый простой из нормальных - поднимать всё ручками, рядом или на соседнем сервере. Самый хайповый - это kubernetes и прочие системы оркестрации.
По поводу второго камрады из
>>61245
>>61246
уже высказались. Тут нужно определиться с двумя вещами, типом взаимодействия и транспортом. Тип - это синхронные вызовы (по сути rpc, например, jsonrpc) или ассинхронные (событийность, подписка/отписка). Транспорт же может быть любым, это могут быть сетевые вызовы (http-запросы), может быть брокер сообщений (отдельная система по доставке, например, rabbitmq) или твои сервисы могут просто пользоваться одной и той же базой данных (сомнительный вариант, но иногда встречается).
Третье - это поддержка, и связан он с тем, что такие распределённые (состоящие из нескольких узлов) системы не так просто поддерживать, например, дебажить. Из очевидного, каждая из этих систем должна писать свои логи и ты должен понимать, как ты будешь их деплоить (потому что они будут разворачиваться не одновременно, что вызовет временные отказы в связанных компонентах). Из неочевидного, это какие-то общие конфигурации и трасировка: ты должен предусмотреть возможность понять, к какому запросу в монолит у тебя относится твоя задача в стороннем сервисе. Делается не особо сложно, генерируешь на уровне входящего запроса случайный идентификатор REQUEST_ID, прокидываешь его во все последующие запросы и пишешь во всех логах. Таким образом, поискав по всем логам всех сервисов по этому REQUEST_ID, ты поймешь кто и что вызвал, и почему.
Ну и в принципе, правильное логирование - залог стабильной системы.
В итоге у тебя получаются несколько приложений, одно центральное - это монолит, а прочие - это сервисы, которые отвечают за отдельные аспекты функциональности, требующие производительности или специфических фич (вебсокеты, нейронки, многопоточная обработка).
В итоге у тебя возникнет три задачи, обеспечения этих сервисов, доступа к ним и поддержки.
Первое решается множеством способов в зависимости от стека, требований и просто вкусов создающих. Самый тупой и сомнительный вариант - запускать прямо из php через shell_exec. Самый простой из нормальных - поднимать всё ручками, рядом или на соседнем сервере. Самый хайповый - это kubernetes и прочие системы оркестрации.
По поводу второго камрады из
>>61245
>>61246
уже высказались. Тут нужно определиться с двумя вещами, типом взаимодействия и транспортом. Тип - это синхронные вызовы (по сути rpc, например, jsonrpc) или ассинхронные (событийность, подписка/отписка). Транспорт же может быть любым, это могут быть сетевые вызовы (http-запросы), может быть брокер сообщений (отдельная система по доставке, например, rabbitmq) или твои сервисы могут просто пользоваться одной и той же базой данных (сомнительный вариант, но иногда встречается).
Третье - это поддержка, и связан он с тем, что такие распределённые (состоящие из нескольких узлов) системы не так просто поддерживать, например, дебажить. Из очевидного, каждая из этих систем должна писать свои логи и ты должен понимать, как ты будешь их деплоить (потому что они будут разворачиваться не одновременно, что вызовет временные отказы в связанных компонентах). Из неочевидного, это какие-то общие конфигурации и трасировка: ты должен предусмотреть возможность понять, к какому запросу в монолит у тебя относится твоя задача в стороннем сервисе. Делается не особо сложно, генерируешь на уровне входящего запроса случайный идентификатор REQUEST_ID, прокидываешь его во все последующие запросы и пишешь во всех логах. Таким образом, поискав по всем логам всех сервисов по этому REQUEST_ID, ты поймешь кто и что вызвал, и почему.
Ну и в принципе, правильное логирование - залог стабильной системы.
А, ну и главное забыл. Ключ к правильной структуре приложения - это правильное разделение областей ответственности между компонентами (это не только в SOA, это в принципе так).
Соответственно, 95% логики должно быть в монолите, а в другие компоненты нужно выносить то и только то, что слишком тяжёлое/сложное/долгое для монолита. В идеале оно не должно быть связано с другими частями, будучи "чистой функцией": получает аргументы, возвращает результат, без вызовов в другие компоненты.
К примеру, у нас был монолит и нужно было генерировать огромные PDF'ки, что сильно выжирало процессор и оперативную память. Мы в тот раз написали отдельный маленький сервис, который получал данные для документа, генерировал pdf и слал её назад отдельным запросом. В итоге, мы вынесли тяжелый процесс в отдельное место (и он перестал влиять на производительность пользовательских запросов), сохранив неизменной бизнес-логику внутри монолита (методы "создай отчёт", "дай отчёт" остались в монолите, как и раньше).
>Вопросы по схеме БД:
>- что за URL указывается в поле message.content? URL на стороннем сервере? На своем? Если на своем, не логичнее ли вместо URL указать внешних ключ на таблицу файлов, либо какой-то идентификатор файла, из которого строится URL? Идентификатор удобен тем, что позволяет в будущем менять вид URL файла.
https://github.com/someApprentice/Crypter/blob/master/schema.sql#L93
А как составлять URL на основе идентификатора?
Изначально я хотел чтобы URL хранил в себе относительную ссылку от сервера, а в клиенте (то есть в html версии где строится ссылка), если меняется адрес хранилища, просто менять адрес хранилища в ссылках.
То есть, в БД message.url = "path/to/file.jpg", а при выдаче html версии склеивать эту ссылку с адресом хранилища.
Как лучше всего хранить записи о файлах, чтобы было гибко, при любом переносе данных можно было легко построить ссылку? Посоветуйте пожалуйста лучшую практику.
А ещё вопрос.
Как лучше проектировать схему? Например, я сейчас могу хранить ключи прямо в таблице user добавив соответствующие поля, но в будущем может понадобится чтобы у одного пользователя/конференции могло быть несколько ключей, и для этого нужно делать отдельную таблицу.
Лучше сразу на будущее делать таблицу, или можно оставить просто? А если потом всё таки делать реализацию нескольких ключей, то придётся переносить все ключи из user в новую таблицу? А если пользователей миллионы, это не будет времяёмкой задачей? Как обычно поступают в таких ситуациях?
>>50056
>>>- зачем нужна таблица participant, если есть conference_reference? Я не понимаю, чем таблица participant отличается от conference_reference.
>> Это денормализация чтобы получить конференцию по собеседнику, в случае приватных конференций
>
>Тут мне кажется, непонимание. Я вижу, что в таблице conference_reference есть поля-ссылки:
>
>- "user" -> на таблицу users
>- "participant" -> на таблицу users
>- conference -> на таблицу conference
>
>А еще есть таблица participant с такими полями:
>
>- user -> на таблицу users
>- conference -> на таблицу conference
>
>Соответственно вопрос, чем таблица participant отличается от conference_reference? Они обе содержат поля user и conference, и не хранят ли они одно и то же?
>
>В моем понимании диалог выглядит так: есть conference, есть 2 ссылающихся на него conference_reference (вид на диалог со стороны каждого собеседника). Что тут делает таблица participant? На нее нет внешних ключей, то есть никто на нее не ссылается.
>Соответственно вопрос, чем таблица participant отличается от conference_reference? Они обе содержат поля user и conference, и не хранят ли они одно и то же?
Нет, они хранят разные значения.
В случае conference_reference:
"user" - это пользователь которому принадлежит ссылка на конференцию
В случае с participant:
"user" - это конкретный получатель в конференции
То есть, пользователь может удалить свою ссылку на конференцию, но всё равно оставаться получателем и получать уведомления. Кстати у меня ошибка в коде и реализовано совсем наоборот. Исправлю.
>В моем понимании диалог выглядит так: есть conference, есть 2 ссылающихся на него conference_reference (вид на диалог со стороны каждого собеседника). Что тут делает таблица participant? На нее нет внешних ключей, то есть никто на нее не ссылается.
Таблица собеседников нужна для хранения всех собеседников в той или иной конференции. Это нужно для публичных конференций, а приватные представлены так же как и публичные, но только всего из двух собеседников.
>> builtins.TypeError: catching classes that do not inherit from BaseException is not allowed
>> except (InvalidSignatureError, UserNotFoundError, WrongTokenError, Exception) as e:
>
>Это скорее всего из-за того, что классы не импортированы или импортированы неправильно и Питон путает их с какими-то другими классами. Для надежности можно отркыть исходный код, где они определены, и проверить, что они действительно наследуются от базового класса исключений.
Да, они действительно наследуется от базового класса исключений https://github.com/jpadilla/pyjwt/blob/d25c92ca5e9980ca7bc8b31420bf36e3f4a9e3f0/jwt/exceptions.py#L16
>Вопросы по схеме БД:
>- что за URL указывается в поле message.content? URL на стороннем сервере? На своем? Если на своем, не логичнее ли вместо URL указать внешних ключ на таблицу файлов, либо какой-то идентификатор файла, из которого строится URL? Идентификатор удобен тем, что позволяет в будущем менять вид URL файла.
https://github.com/someApprentice/Crypter/blob/master/schema.sql#L93
А как составлять URL на основе идентификатора?
Изначально я хотел чтобы URL хранил в себе относительную ссылку от сервера, а в клиенте (то есть в html версии где строится ссылка), если меняется адрес хранилища, просто менять адрес хранилища в ссылках.
То есть, в БД message.url = "path/to/file.jpg", а при выдаче html версии склеивать эту ссылку с адресом хранилища.
Как лучше всего хранить записи о файлах, чтобы было гибко, при любом переносе данных можно было легко построить ссылку? Посоветуйте пожалуйста лучшую практику.
А ещё вопрос.
Как лучше проектировать схему? Например, я сейчас могу хранить ключи прямо в таблице user добавив соответствующие поля, но в будущем может понадобится чтобы у одного пользователя/конференции могло быть несколько ключей, и для этого нужно делать отдельную таблицу.
Лучше сразу на будущее делать таблицу, или можно оставить просто? А если потом всё таки делать реализацию нескольких ключей, то придётся переносить все ключи из user в новую таблицу? А если пользователей миллионы, это не будет времяёмкой задачей? Как обычно поступают в таких ситуациях?
>>50056
>>>- зачем нужна таблица participant, если есть conference_reference? Я не понимаю, чем таблица participant отличается от conference_reference.
>> Это денормализация чтобы получить конференцию по собеседнику, в случае приватных конференций
>
>Тут мне кажется, непонимание. Я вижу, что в таблице conference_reference есть поля-ссылки:
>
>- "user" -> на таблицу users
>- "participant" -> на таблицу users
>- conference -> на таблицу conference
>
>А еще есть таблица participant с такими полями:
>
>- user -> на таблицу users
>- conference -> на таблицу conference
>
>Соответственно вопрос, чем таблица participant отличается от conference_reference? Они обе содержат поля user и conference, и не хранят ли они одно и то же?
>
>В моем понимании диалог выглядит так: есть conference, есть 2 ссылающихся на него conference_reference (вид на диалог со стороны каждого собеседника). Что тут делает таблица participant? На нее нет внешних ключей, то есть никто на нее не ссылается.
>Соответственно вопрос, чем таблица participant отличается от conference_reference? Они обе содержат поля user и conference, и не хранят ли они одно и то же?
Нет, они хранят разные значения.
В случае conference_reference:
"user" - это пользователь которому принадлежит ссылка на конференцию
В случае с participant:
"user" - это конкретный получатель в конференции
То есть, пользователь может удалить свою ссылку на конференцию, но всё равно оставаться получателем и получать уведомления. Кстати у меня ошибка в коде и реализовано совсем наоборот. Исправлю.
>В моем понимании диалог выглядит так: есть conference, есть 2 ссылающихся на него conference_reference (вид на диалог со стороны каждого собеседника). Что тут делает таблица participant? На нее нет внешних ключей, то есть никто на нее не ссылается.
Таблица собеседников нужна для хранения всех собеседников в той или иной конференции. Это нужно для публичных конференций, а приватные представлены так же как и публичные, но только всего из двух собеседников.
>> builtins.TypeError: catching classes that do not inherit from BaseException is not allowed
>> except (InvalidSignatureError, UserNotFoundError, WrongTokenError, Exception) as e:
>
>Это скорее всего из-за того, что классы не импортированы или импортированы неправильно и Питон путает их с какими-то другими классами. Для надежности можно отркыть исходный код, где они определены, и проверить, что они действительно наследуются от базового класса исключений.
Да, они действительно наследуется от базового класса исключений https://github.com/jpadilla/pyjwt/blob/d25c92ca5e9980ca7bc8b31420bf36e3f4a9e3f0/jwt/exceptions.py#L16
1 пользователь двигает объект с помощью жс
2 юзер видит это передвижение
Я сделал пару пет проджектов: "музыку вконтакте", где можно было грузить треки и проигрывать их и ещё аналог гисметео, карту России с прогнозами погоды по городам (тянул из какого-то апи). Ну и вроде классический туду лист слепил.
Приходил на собесы с ноутом, говорил, что джуниор, но вот смотрите, что сделал.
Потом было тестовое в одну контору, сделать блог без использования фреймворков. Я написал свой mvc фреймворк и уже на нём сделал тестовое.
В итоге взяли.
Но это было уже лет 6 назад, если не больше.
Спасибо за ответ, вот я тоже думаю запилить петпрожект, думал пару сайтов сделать, это лучшая практика, да и на собесе покажу сразу.
Делал бота в телеграм, копался в темах вордпресса, парсил всякое говно, игрался разными с апи, лепил калькуляторы на жикуери и жс, тыкал палочкой ноду, есть гитхаб с собственной приватной помойкой на парочку проектов. MVC, паттерны, сотни статей в одно лицо и 60 часов лекций на старте. Дома давно уже стоит серверная убунта из старого нетбука на которой собираю всякое под нужду.
На работу не пробовался ещё. Стрёмно как-то.
Будучи совсем ничего не знающим джуном работал за еду 20к, но довольно быстро зп выросла до 50к, а потом и до 70к (с бонусами иногда переваливало за 100к). В моём мухосранске это вполне себе деньги, но в итоге я через несколько лет после первого найма поменял работу и там уже в районе 150к начал получать.
>>61504
Советую запилить хотя бы один high-quality проджект, потому что
> Делал бота в телеграм, копался в темах вордпресса, парсил всякое говно, игрался разными с апи, лепил калькуляторы на жикуери и жс, тыкал палочкой ноду, есть гитхаб с собственной приватной помойкой на парочку проектов.
звучит, как "пробовал 100500 разных технологий, но всегда получалось говно". Ты пойми, как это будет выглядеть для работодателя. Твоё резюме будет смотреть сеньор (например, я). Он получит от HRа ссылку на твой гитхаб с просьбой оценить. Зайдёт на один проджект, посмотрит, поморщиться. Зайдёт на другой, блеванёт. На третий уже не зайдёт, напишет "чувак знатный говнокодер, в разработке не разбирается от слова совсем" и hr пойдёт писать тебе отказ (или тупо заигнорит, если овца).
Лучше собрать один эталонный проект по бест-практикам, который ты и будешь совать под нос всем работодателям.
Я бы взял laravel и реакт, прочитал бест практики, посмотрел примеры приложений и прочие скелетоны и написал бы, к примеру, двач. С анонимными постами, картиночками, тредами, цитатами, капчой и админкой. Ну и сверстал бы под мобилки его отдельно, конечно же.
Чтобы ревьювер (всё ещё, например, я) начал смотреть и такой: "Ага, паттерны. Ага, структура. Ага, конфиги. Ага, докер. Ага. Всё понятно, всё красиво, всё по стандартам. Ну вот тут шероховатости, но джуниор же, не страшно. Берём!"
Не понял вопроса.
>ТЫ ГАВНО А Я СИНЬЕР-РЕВЬЮЕР
Читаю такие высеры, и в очередной раз убеждаюсь, какое же среди прогеров высокомерное говно бывает. У нас на заводе был Дядьпаша такой же вахтер, который новичкам не помогал, а отбивал охоту работать. "Я бетон по часовой мешаю и вы мешайте, это технология!"
>ВОТ ТЫ СДЕЛОЛ МАЛЕНЬКИЙ ПРОЕКТ - Я ПОМОРЩЮСЬ И НИВАЗЬМУ ТИБЯ, А ВОТ КАК ТЫ ДВАЧ СДЕЛОИШЬ - Я СРАЗУ УВИЖУ СПИЦА!
А ты, дурачок, в его мелких проектах паттерны, структуру, конфиги не увидишь? Там стандарты какие-то другие? У тебя стандарты и красивый код от скольки-размерных-проектов начинаются?
Ты пойми, что ты мудак и отбиваешь человеку желание программировать. Почитает тебя ньюфаг и подумает вон "специалист" советует сразу большие проджекты писать, чтобы меня признали, сделаю как я фейсбук. И закономерно соснет, потому что он не знает как две переменные складывать, а ты его за большой проект сажаешь.
Так-то у меня есть вещь, которую я 4 месяца на голом пхп задротил и 2 раза переписывал - там и паттерны и практики, и жопа с ручкой.
Обязательно фейсбук надо писать, чтобы очередной великий мастер оценил?
Про говно - ты сам придумал, а на деле за два дня это всё поднимается, если через композеровские либы делать. Да и дохуя как-то негатива у тебя в посте только на выдумке + какой-то подростковый максимализм.
Вчера вот на google cloud platform туторы проходил. Годно зделоли. Местными хостерами уже пользовался, теперь с этим хочу попробовать.
Чувак, у тебя явно пригорает и/или ты обижен на кого-то, поэтому взрываешься тут на адекватные советы.
Я анону сказал правдивую вещь: засылай на ревью хороший код, потому что небольшой качественно сделанный проект в глазах ревьювера (например моих) будет весить больше, чем 10 некачественно сделанных проектов. Увы, мир так работает, что людей оценивают по результатам и показывать нужно лучшее, что можешь вообще продемонстрировать.
Стандарты и паттерны у меня начинаются сразу, я в принципе стараюсь плохой код не писать, даже если нужно по-быстрому наговнякать - чтобы не страдать при поддержке и не отвечать за плохой код в будущем (когда спришвают "что за плохой код годичной давности" обычно аргумент "эээ, ну там сроки горели" не проканывает).
Далее, про большие проекты я не писал, как и не отбивал охоту. что-то делать. Я сказал чуваку выбрать стек, изучить бест-практики (в которых будут и конфиги, и паттерны и всё такое) и сделать настолько хороший проект, насколько он сможет. К слову, "написать двач" - довольно изичный пет проджект, не виду ничего "большого", где новичок "соснёт".
> сделаю как я фейсбук
> не знает как две переменные складывать
Вот и узнает. Ты забываешь, что мы не в детский сад играем, и чем меньше джун знает, тем сильнее он сядет мне на шею, если я его возьму. Если он будет знать, что нужно использовать конфиги, нельзя писать весь код в одном классе и нужно использовать ORM вместо кастомных запросов, то это значит, что мне можно будет больше времени объяснять ему, как сделать задачу, нежели как пользоваться инструментами и как складывать переменные.
Соответственно да, я ожидаю от джуна понимания на начальном уровне, как пользоваться языком программирования (чтобы он понимал, что такое "отнаследуй класс" и "реализуй интерфейс") и то, как следует пользоваться фреймворком (всё ещё на начальном уровне, что конфиги нужно выносить вот сюда, база данных описывается вот в таких классов и так далее). Я считаю это справедливым требованием, тем более, что изучать это действительно просто, заходишь в любой мануал "пишем блог на XXX" и там тебе всё распишут.
Чувак, у тебя явно пригорает и/или ты обижен на кого-то, поэтому взрываешься тут на адекватные советы.
Я анону сказал правдивую вещь: засылай на ревью хороший код, потому что небольшой качественно сделанный проект в глазах ревьювера (например моих) будет весить больше, чем 10 некачественно сделанных проектов. Увы, мир так работает, что людей оценивают по результатам и показывать нужно лучшее, что можешь вообще продемонстрировать.
Стандарты и паттерны у меня начинаются сразу, я в принципе стараюсь плохой код не писать, даже если нужно по-быстрому наговнякать - чтобы не страдать при поддержке и не отвечать за плохой код в будущем (когда спришвают "что за плохой код годичной давности" обычно аргумент "эээ, ну там сроки горели" не проканывает).
Далее, про большие проекты я не писал, как и не отбивал охоту. что-то делать. Я сказал чуваку выбрать стек, изучить бест-практики (в которых будут и конфиги, и паттерны и всё такое) и сделать настолько хороший проект, насколько он сможет. К слову, "написать двач" - довольно изичный пет проджект, не виду ничего "большого", где новичок "соснёт".
> сделаю как я фейсбук
> не знает как две переменные складывать
Вот и узнает. Ты забываешь, что мы не в детский сад играем, и чем меньше джун знает, тем сильнее он сядет мне на шею, если я его возьму. Если он будет знать, что нужно использовать конфиги, нельзя писать весь код в одном классе и нужно использовать ORM вместо кастомных запросов, то это значит, что мне можно будет больше времени объяснять ему, как сделать задачу, нежели как пользоваться инструментами и как складывать переменные.
Соответственно да, я ожидаю от джуна понимания на начальном уровне, как пользоваться языком программирования (чтобы он понимал, что такое "отнаследуй класс" и "реализуй интерфейс") и то, как следует пользоваться фреймворком (всё ещё на начальном уровне, что конфиги нужно выносить вот сюда, база данных описывается вот в таких классов и так далее). Я считаю это справедливым требованием, тем более, что изучать это действительно просто, заходишь в любой мануал "пишем блог на XXX" и там тебе всё распишут.
>написал бы, к примеру, двач
Я бы не стал работать с чуваком, который выпячивает тот факт, что он двачер. Мне местных раковых рвотных конфочек хватило. Тайный двачер лучше явных трёх.
Да какая разница. Двач, форчан, реддит, блог - это зависит от вкуса того, кто делать будет, его же пет-проект.
Просто он должен быть достаточно подъёмным для новичка, но при этом достаточно большим, чтобы можно было хоть на что-то посмотреть (потому что я видел тестовый в которых был 1 контроллер, 1 модель и 3 метода которые эту модель сохраняли, или удаляли).
Советовать сделать бложег как-то скучно, имиджборда - хотя бы оригинально.
Отчасти потому и стрёмно устраиваться - вдруг на такого как ты попаду. Ты мне ничего нового не сказал, но ЧСВ у тебя определённо большое.
>потому что я видел тестовый в которых был 1 контроллер, 1 модель и 3 метода
Падажжи. Наличие контроллера, модели и методов говорит о том, что человек понимает в ООП и MVC. А что должно говорить наличие пяти контроллеров и трёх моделей? Это просто количественная характеристика - всегда можно напилить ещё больше.
Походу ты сам плаваешь в своих же требованиях.
В конце-концов, если у меня есть собственный двач, то нахуй ты мне сдался со своей конторой.
Не устраивайся, мне безразлично.
>>61810
И тем не менее, 20 строчек кастомного кода в одном файле - это слишком мало. Выводы делаются в конце-концов по кастомному коду, а есои этот кастомый код - это строка
```
function someAction($id) {
return someModel::load($id)
}
```
в минимальных вариациях, то это ничего не говорит о том, какого качества разработчик пишет это. Это несомненно плюс, что он показывает контроллер вместо самописного обращения к $_GET, но всё ещё недостаточно.
Это как принимать на работу чувака, поговорить с ним минуту и выяснить, что он знает русский язык. Знание языка - это необходимое условие, но не достаточное.
>20 строчек
Давай только про крайности не говорить. Ты который пост уже выдумываешь какие-то вычурные вещи.
Всё сдохнет и даже ты.
>как и перл он сдохнет
как и Java как и C как и С++ и любой другой язык программирования , дальше то что ?
>>61844
Вы правда считаете утверждения "тестовое задание с использованием паттернов и бест-практик" и "тестовое задание со значимым объёмом кастомного кода" взаимоисключающими, да?
Ну и да, если уже начались придирки к словам, то я ухожу из треда, здесь не будет диалога. Если вам хочется делать как-то по-другому и вы не готовы признавать, что бывает и другое мнение - то пожалуйста, как угодно.
анон не обращай внимания , верные же вещи пишешь
Не понимаю чего они к тебе докопались. Все 3 опытных погроммиста с которыми я знаком, говорили мне примерно тоже самое:
- сделай пару мелких
- придумай и сделай большой проект
- начинай ходить по собесам
Ты с тем шизиком общаешься, который своим нытьем, о том что ему все должны весь тред засрал. Не понял еще?
Мы перекатываем в раене 800+ постов. Иначе много большая часть треда оффтоп и срачи. Осенью будет полегче.
устарел,советуют пдо.
есть мож какая библиотека,которая нах между ПДО и монстрами типа доктрины и eloquent?
Я бы не назвал eloquent монстром, можно свободно отдельно брать и подключать, работает стабильно, хотя и active record. Ещё есть всякие propel, phpixie, зендовские компоненты.. Но я бы всё-таки eloquent взял.
Почитай про композер.
Ну ты и камрад чувак.
Надеюсь по адресу)
Есть таблица пользователя. (у нее есть расширенные данные в виде профиля)
Есть таблица профиля. (она в свою очередь может и не иметь пользователя)
В профиле есть "возраст", который может принимать 1 из 3х значений. (Для этого я выделил еще 1 табличку?)
В профиле есть "занятость" которая может иметь несколько вариантов из списка.
Собственно вопросы:
1) Как грамотно реализовать вышесказанное, есть ли смысл в отдельной таблице для возраста?
2) После того, как разобрались с представлением, у меня все равно есть вопросы по взаимосвязям в таблицах.(1-к-1? м-к-м??)
3)Да и вообще как это делается? Уникальный-не уникальный, Индекс-хуиндекс
Пик - как я это себе представляю.
Если с третьим пунктом гугл легко справится, то вот насчет первых двух прошу совета! А если не впадлу, можно и за за последний пояснить.
Возраст это связь 1-М: многие люди могут иметь один итот же возраст, но один человек не может иметь 2 разных возраста.
Реализовано ка ку тебя. Также есть вариант не делать таблицу и использовать ENUM.
Другой пример 1-M -это пост и комментарии к нему. У одного поста может быть много комментариев, но не наоборот.
Занятость - если человек может выбрать несколько вариантов одновременно, то это M-N. Так как у многих людей может быть одна и та же профессия, и одной профессии может соответствовать много людей.
Другой пример M-N это теги и статьи. У статьи может быть много тегов, а тегу соответствует много статей.
Реализуется она через таблицу занятостей и связи (из колонок user_id, profession_id и составным первичным ключом по ним).
Пользователь - профиль это отношение один-к-одному. Оно реализуется как и 1-M, через внешний ключ, но с добавлением уникального индекса на внешний ключ (внешний ключ - это поле типа profile_id которое ссылается на другую таблицу).
Также, может быть тебе будет полезна статья про нормализацию, хотя она не очень простая: https://github.com/codedokode/pasta/blob/master/db/normalization.md
На работке мне нужно написать некий сервис отчетов, определенная выборка из нашей базы. То есть пользователь заходит под своей учеткой, и ему выдается список доступных ему отчетов. Один и тот же отчет может быть доступен всем пользователям.
У меня самособранный MVC-фреймворк. И сейчас я думаю куда помещать сами отчеты (их может быть пару десятков).
Может делать общую для всех контроллеров модель, в которой будут все отчеты? А от общей модели уже наследовать модель конкретного контроллера?
Вооу, спасибо большое!!
Сейчас подкреплюсь и пойду воплощать в дело тобою сказанное.
Еще раз спасибо!
>и вы не готовы признавать, что бывает и другое мнение - то пожалуйста
весь дискас как раз и начался с того, что в тред залетел идиот-матершинник и стал оскорблять новичков, безапеляционно верещя "Я ЗНАЮ КАК НАДО, С ПЯТНАДЦАТИ ЛЕТ РАБОТАЛ А ВЫ ВСЕ ДЕРЬМО И ИНФАНТИЛЫ ВЫ МЕНЯ БЕСИТЕ". Ему тактично намекнули, что если не можешь помочь, а только ругаешь - то иди в другой тред
ага ололо вот они лохи да не то што мы студенты первого курса
Все это дело работает на http, как переехать на https?
1. Нужно убедиться что модуль отвечающий за https на сервере включен
2. Сделать редирект любого запроса по http на https в .htaccesse?
Все ?
Тебе нужно подложить ssl-сертификат (если всё локально - то модно самоподписной) и сонфигать сервер, чтобы он через этот сертификат работал.
Редирект не обязателен, делают обычно для удобства, чтобы быть на 100% уверенными, что все юзеры ходят под https.
Знает кто?
Почему сайт откис?
Поднял. Заодно настроил uptime бота на постоянную проверку статуса главной страницы. В случае 500-й ошибки от сервера бот будет оповещать нас в слаке.
>>62691
ОП кстати писал на эту тему: https://phpclub.tech/pr/res/1019301.html#1027969
Ещё тут есть теория и практика: https://learn.javascript.ru/bitwise-operators
$row = array();
$row[1] = trim(substr($data,0,7));
$row[2] = trim(substr($data,7,20));
$row[3] = trim(substr($data,27,25));
пытаюсь сделать через substr. Но substr используется только для строк, потому выдает ошибку. Вопрос, как разделить текстовый файл на 3 столбика и поместить их в csv?
А после я просто переименую .csv в .xls получив экселевский файл
Ее тоже находил, но не совсем понял как она работает. В моем примере цикл в котором есть массив построчно делит каждую строку по 3 столбика символами. А в этом не понимаю как использовать.
на месте
Нет и не нужна. Если у тебя у нескольких функций отличается сигнатура, то и назови их по-разному. Для создания объектов частенько применяют static конструкторы, это хорошая практика не только в PHP мире:
$money = Money::parse('$1,200.00')
$money = Money::USD(1200);
Примеры из Symfony:
- https://github.com/symfony/http-foundation/blob/master/Request.php#L283
- https://github.com/symfony/http-foundation/blob/master/Request.php#L313
Перегрузка методов и функций усложняет понимание кода, так как без IDE сложно понять какая версия метода вызывается - нужно сверять типы и сравнивать количество аргументов. Код не только через IDE смотрят - если ты делаешь код-ревью коллеге в гитлабе/гитхабе, то скорее всего будешь искать метод через Ctrl+F на странице и перегрузка будет мешать и отнимать время. Опиши реальную проблему. Есть подозрение, что ты решаешь её не с той стороны.
а нельзя добавить перед твоим массивом B добавлять сначала массив A с пустыми значениями/пробелами? Или так коряво выйдет?
так коряво выйдет. Планировал по очереди записать информацию в столбики. Сначала первый ,потом второй, потом третий.
Наверное очень плохо обьяснил, да и вопрос нубский. Первый раз в такой тупик зашел.
Массивы в PHP не типизируются, есть риск какой-то ключ забыть/опечататься, а потом долго искать причину ошибки в другом месте. Вместо кучи аргументов можно группировать данные в объекты, например вместо
$entity = new Entity($dateFrom, $dateTo, $country, $city, $street, $lat, $lan);
писать
$entity = new Entity(
new DateRange(new DateTime('now'), new DateTime('+30 days')),
new Address($country, $city, $street, new Location($lat, $lan)),
);
В БД это будет храниться в одной строке, Доктрина такое может через Embeddable: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/embeddables.html
Плюсы здесь в том, что у Value Object могут быть дополнительные методы, например $dateRange->isOverlapping($dateRange2)
Scope в ларавел это "магический" метод, подозреваю что работает как-то через __call() и scope{MethodName}, который ты можешь чейнить с кверибилдером. Например ты ищешь только публичные посты, вместо того чтобы делать Post::where('public', true)->get(), ты можешь сделать scopePublic(), НО для удобства вызывается этот скоуп просто как Post::public(). Переменная $query это и есть объект текущего билдера, к которому ты вызываешь этот скоуп. Сам билдер возвращается тыщей разных методов, with, where и т.п. У меня всегда были проблемы со слогом.
Все более-менее понял. Спасибо за ответ!
$thread = "https://2ch.hk/pr/res/1446969.html (М)";
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_URL, $thread);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$data = curl_exec($curl);
preg_match_all("/c\/(.)\" class=\"post__image-link\"/", $data, $images);
preg_match('/hk\/(.)\/r/', $thread, $board);
$board = $board[1];
foreach ($images[1] as $image) {
$image_small = preg_replace('/[^0-9\/]/', "", $image);
print "<a href='https://2ch.hk/$board/src/{$image}' (М)><img src='https://2ch.hk/$board/thumb/{$image_small}s.jpg' (М)></a>";
};
То и значит, "знать фреймворк на уровне джуниора/миддла/сеньора".
Вообще, как правило, ожидается знание архитектуры, набора компонентов, используемых паттернов и наличие практических навыков работы с ними для решения хотя бы повседневных задач.
https://badcode.ru/chto-nuzhno-znat-laravel-junior-proghrammistu/
Это нормальные требования для того же джуниора? Я просто недавно начал учить, то что в статье той написано кажется довольно простыми вещами.
Что аноны могут по поводу видео-курсов по 20+ часов сказать? То же создание блога с ларакаста, сайт обьявлений Елисеева. Может быть смотрел кто полностью?
vscode
A File Icon - чтоб иконки красивые были у файлов и zzz A File Icon zzz
AceJump - быстрое перемещение по коду
Alignment - массив выровнять чтоб приятно смотрелось либо группу объявления переменных
All Autocomplit - автодополнение в текущей вкладке со всех открытых вкладок
BracketHighlighter - подсветка парных скобок
DocBlockr - блоки для функций переменных и тд (ну вот кстати дисскасс имеет ли сейчас смысл писать в описании тип если ты его уже указал в самой функции? зачем дублировать)
Emmet - ну если ты вдруг фулстек или иногда приходится накалякать html+css
Laravel 5 artisan - можно звать команды прям из редактора. Но есть у тебя в проекте несколько микросервисов то поведение довольно рандомное.
Laravel Blade Highlighter - подсветка синтаксиса.
PHP Codebeutifier - приведение к стандарту стиля кода
PHP Companion - основная для меня фича: кликаешь ф5 и он дописывает декларацию класса есть и другие но не особо пользую
PHPUnitKit - удобрый запуск phpunit тестов но если работаешь чередз дохер то не работает и проще написать конфигурацию для билда
QNav - ну иногда когда не хочется alt-0
Requester - тестить апишку можно прям сценарии писать (так как можно обращаться к значениям предыдущего запроса) но зачем они такое ебанутое форматирование сделали для json я не понимаю - хочешь свернуть большой объект - хуй
SidebarEnhancements - дополнительные команды к файлам в основном удобно duplicte
SublimeLinter - основа для линтеров
SublimeLinter-php
SublimeLinter-phpcs
SublimeLinter-phpmd - отключен. он хороший но долго думает
SublimeLinter-phpins - подсветка когда забыл подключить класс или на русском написал букву "c" или забыл указать переменную что используешь
Благодарю
> Это нормальные требования для того же джуниора?
Всё зависит от конкретной компании. Не существует эталона требований для джуниора, какие-то компании нанимают совсем никаких студентов, другие ожидают от джуна опыт в несколько лет коммерческой разработки.
Лучше выбрать 2-3 компании, куда хотел бы попасть, посмотреть на их требования + нагуглить сотрудников этих компаний и выспросить с них ожидания от джунов. Тут не стоит стесняться, то, что ты так проактивно подходишь к трудоустройству - будет скорее дополнительным плюсом, потому что любая адекватная компания понимает, что первый условный год джун работает в лучшем случае в 0, потому что учится - и только потом начинает приносить в прибыль. Значит, если чувак сначала выяснил требования, потом потратил месяц на самообучение, потом пришёл на собеседования - значит, он ответственный и целеустремлённый и не сольётся через 6 месяцев, не оправдав вложений в его обучение.
> https://badcode.ru/chto-nuzhno-znat-laravel-junior-proghrammistu/
На мой вкус, данный список выглядит неплохо, лучше, чем 90% дерьмовых советов из интернетов.
>и не сольётся через 6 месяцев, не оправдав вложений в его обучение
По этому и спрашивал, что не хочется быть совсем уж "грузом", и не вылететь даже если меня возьмут. Но с другой стороны слишком долго сидеть без работы тоже не вариант.
Большое спасибо за ответ
Вопрос: как мне сделать так, чтобы я мог писать в лог из всего приложения? На первый взгляд логичным кажется создать объект класса cllog в объекте класса root и работать с ним. И всё бы ничего, но мне ведь нужно к логу обращаться из остальных классов. То есть, все 4 класса (root, cl<1-3>) должны работать с одним объектом.
Мне в голову пришли следующие решения:
1. В каждом классе реализуется метод, который позволяет установить ссылку на лог. То есть, в классе root я создаю объект класса cllog, создаю объект класса cl1 и по ссылке (&) передаю в него объект с логом. Минусы очевидны: мне нужно в каждый класс пихать этот метод, это во-первых, во-вторых - а если логов несколько? Или если помимо лога есть еще что-то, что должно быть доступно из всех классов? Пилить десяток методов, которые по ссылке будут устанавливать? Короче, хуета какая-то.
2. Класс root содержит СТАТИЧЕСКОЕ свойство $log, которое хранит в себе лог. Соответственно, если мне нужно откуда-то написать в лог, то я делаю примерно так: root::$log->addRecord(). Вроде звучит хорошо, но, опять же, рассмотрим ситуацию, в которой у меня несколько логов. Есть общий лог приложения - root::$log. Но, в то же время, есть еще один лог, который касается какой-то конкретной части приложения, которая состоит из нескольких классов. Т. е, грубо говоря,в root:$log будут писать из всех классов, а в root:$logTwo из cl1 и cl2. С чего бы этому логу храниться в классе root, если он относится к cl1 и cl2? Сваливать абсолютно все объекты, которые должны быть доступны из нескольких классов в root - звучит не очень адекватно.
3. Существует еще один абстрактный класс - допустим, global. В нём есть статическое свойство global::$log. Я внутри root создаю объект лога и дальше делаю примерно так: global::$log = &$this->log.
В этом варианте я минусов не вижу, но хз, насколько это адекватно с точки зрения ООП. Я, по сути, создаю собственную глобальную область видимости с блекджеком и шлюхами.
Короче, максимально сокращая вопрос: что делать, если у меня есть какой-то объект, который должен быть доступен из нескольких классов?
Вопрос: как мне сделать так, чтобы я мог писать в лог из всего приложения? На первый взгляд логичным кажется создать объект класса cllog в объекте класса root и работать с ним. И всё бы ничего, но мне ведь нужно к логу обращаться из остальных классов. То есть, все 4 класса (root, cl<1-3>) должны работать с одним объектом.
Мне в голову пришли следующие решения:
1. В каждом классе реализуется метод, который позволяет установить ссылку на лог. То есть, в классе root я создаю объект класса cllog, создаю объект класса cl1 и по ссылке (&) передаю в него объект с логом. Минусы очевидны: мне нужно в каждый класс пихать этот метод, это во-первых, во-вторых - а если логов несколько? Или если помимо лога есть еще что-то, что должно быть доступно из всех классов? Пилить десяток методов, которые по ссылке будут устанавливать? Короче, хуета какая-то.
2. Класс root содержит СТАТИЧЕСКОЕ свойство $log, которое хранит в себе лог. Соответственно, если мне нужно откуда-то написать в лог, то я делаю примерно так: root::$log->addRecord(). Вроде звучит хорошо, но, опять же, рассмотрим ситуацию, в которой у меня несколько логов. Есть общий лог приложения - root::$log. Но, в то же время, есть еще один лог, который касается какой-то конкретной части приложения, которая состоит из нескольких классов. Т. е, грубо говоря,в root:$log будут писать из всех классов, а в root:$logTwo из cl1 и cl2. С чего бы этому логу храниться в классе root, если он относится к cl1 и cl2? Сваливать абсолютно все объекты, которые должны быть доступны из нескольких классов в root - звучит не очень адекватно.
3. Существует еще один абстрактный класс - допустим, global. В нём есть статическое свойство global::$log. Я внутри root создаю объект лога и дальше делаю примерно так: global::$log = &$this->log.
В этом варианте я минусов не вижу, но хз, насколько это адекватно с точки зрения ООП. Я, по сути, создаю собственную глобальную область видимости с блекджеком и шлюхами.
Короче, максимально сокращая вопрос: что делать, если у меня есть какой-то объект, который должен быть доступен из нескольких классов?
Это прямо таки типичный пример Dependency Injection: https://github.com/codedokode/pasta/blob/master/arch/di.md
Также, классы стоит называть с большой буквы и без странных сокращений. Не cllog, а Logger.
Также, для логгера есть рекомендация PSR: https://www.php-fig.org/psr/psr-3/ Не стоит изобретать тут велосипед.
Также, ссылки для объектов использовались в PHP4 много лет назад, а с PHP5 они не нужны, обнови свои знания.
>Также, классы стоит называть с большой буквы и без странных сокращений
Я знаю, это просто пример. Реальные имена другие.
>Также, классы стоит называть с большой буквы и без странных сокращений
Вообще, я использую для этих целей библиотеку, так что, опять же, велосипед не изобретаю. Хотя, в принципе, не вижу в этом ничего плохого, ибо изобретение велосипеда заставляет гораздо лучше понимать чужие библиотеки по той же теме. Но сейчас речь не об этом.
Насколько я понял (а понял я, конечно же, не так много, нужно еще пару раз перечитать), Сатана, в статье идёт речь о том самом, спасибо. На счёт ссылок - действительно, сейчас проверил и они правда не нужны. Но если говорить о сути вопроса, то мой первый вариант с кучей методов типа setLogger оказался ближе всего к истине? Довольно внезапно, конечно.
Гитхаб github.com/deadj/student-list/
Хостинг http://f914421i.beget.tech
Организаторы отменили европейскую конференцию по php, потому, что туда записались только белые мужчины.
https://2019.phpce.eu/en/ (см. там ссылки на твиты)
https://wptavern.com/php-central-europe-conference-canceled-due-to-lack-of-speaker-diversity
В твиттере им напихали хуёв в панаму - поляки, русские, украинцы, в основном, но не только.
А я вот думаю, что это такой тонкий наброс и реклама пыхи.
Типа "php - технология белых людей".
твит не мой
Не могли бы вы пояснить свою мысль, уважаемый(-ая)?
>Но если говорить о сути вопроса, то мой первый вариант с кучей методов типа setLogger оказался ближе всего к истине?
нет ты просто плохо понимаешь что такое DI контейнер, перечитай ещё раз.
мимо другой анон
DI - это хорошо, конечно, но нужен контейнер.
У тебя он есть? Если да - читай документацию к нему.
А если нет?
Используй статические методы класса, как в джаве.
Напрмер, на джаве в клиентском коде будет:
Logger log = Logger.getLogger(name);
log.fine("OLOLO");
log - это экземпляр класса Logger.
getLogger() - это статический метод класса Logger. Он доступен везде. И он возвращает сконфигурированный логгер (не создаёт он уже создан ранее).
Другой статический метод этого класса позволяет сконфигурировать логгер при старте приложения - открыть файл и т.п..
Т.е., по сути, мы имеем статическую "глобальную" переменную внутри класса. Она не глобальная, естественно. Она - в пространстве имён "Logger". Но, может быть доступна везде.
Ещё это можно назвать модулем.
Т.е., в джаве класс - это 2 в 1 - и модуль и класс.
В пыхе так можно? Если да - так и делай.
Бля, я таки дал себе труд прочитать, что ты там (>>65794) написал.
Вообще непонятно, в чём у тебя проблема, если честно.
Про статические методы ты знаешь (но классы называешь по-блядски).
Сделай внутри лог-менеджера несколько логгеров, выбирай по именам, пиши в разные файлы.
А лучше - не изобретай велосипед, а загугли php logging library.
Контейнер не обязателен. Мы можем руками передать логгер при создании объектов:
$logger = new Logger;
$c1 = new Class1($logger);
...
Контейнер просто позволяет это упростить и автоматизировать, но можно и без него.
Ты же предлагаешь какие-то кривые самодельные костыли. В твоем варианте со статическими методами, как передать 2 разных логгера в разные классы? Как в тесте подменить логгер на другой тип?
В уроке про DI это все упоминается, и описаны недостатки статических методов.
Иван Величко @Ostrovski
dllweb: DI - это на самом деле очень просто. Берете и явно (ключевое слово именно явно) передаете зависимости в код, который их требует. Через параметры функции/метода или через конструктор. А DIC - это о том, как этот процесс автоматизировать/универсализировать на уровне сервисов веб-приложения. Т.е. у вас есть куча сервисов, каждый явно определяет, от каких других сервисов он зависит (через параметры конструктора). А DIC умеет создавать экземпляры сервисов, скармливая им экземпляры тех сервисов, от которых они зависят.
Сурс: https://toster.ru/q/195091#comment_662753
Разве это не довольно близко к тому, что сказал я?
Ну, то есть, я понимаю, что мой вариант (еще и с ссылками) относительно адекватной реализации = это каменный топор относительно танка, но сама философия и там и там заключается в том, что мы в каждый объект явно передаём его зависимости. DIC просто сокращает/автоматизирует этот процесс.
Нет?
>как передать 2 разных логгера в разные классы?
Как два пальца обоссать. Хоть 22.
Там же написано: Logger.getLogger(name);
Но, у вас тут, похоже, своя атмосфера, лол.
Пыха открывает для себя ООП, DI и прочие взрослые игрушки.
Добавлю ещё, что когда ты сам, руками передаёшь зависимости как параметры в конструктор - это не DI. DI - это когда это делает контейнер за тебя, а ты просто пишешь аннотации.
И логгер - это не зависимость, в обычном понимании.
Передавать логгер в конструктор - это ебанизм.
Хотя, возможно, в пыхе это норма.
> передаёшь зависимости как параметры в конструктор - это не DI. DI - это когда это делает контейнер за тебя
вопрос без подъеба ты явист?
Разумеется, я выше это написал.
Чувак, I = Injection.
В данном случае можно перевести как внедрение, хотя, оттенок немного не тот. Т.е. что-то внедряет в твой код зависимость извне, понимаешь?
А когда ты делаешь это руками - ну какой же это, нахуй, инжекшн, ну сам подумай? Это обычное программирование, никакие особые термины для этого не нужны.
>явист
Ява - это остров такой.
И мотоцикл такой ещё был, охуенный.
А язык называется "джава".
>Организаторы отменили европейскую конференцию по php, потому, что туда записались только белые мужчины.
Черные айтишники тоже могли бы записаться, но они все еще сидят А ю гарет гайз? сидят ин джейл!
>Пыха открывает для себя ООП, DI и прочие взрослые игрушки.
Ненавижу ждава пидарастов за то, что у них переменные без $ объявляются. Тупо рандомное слово без идентификации. Мрази. Насколько надо быть дурными, что даже до значка не додуматься? А потом заходит такой ополоум в благородный тред и поучать начинает.
В твоем подходе в классе просто жестко прописано получение логгера (Logger.getLogger) и мы не можем снаружи выбрать, что в него передать. Мы не можем выбрать тип логгера при создании класса, так как там все захардкожено. Мы не можем создать 2 экземпляра класса с разными логгерами. Мы не можем в тестах передать другой тип логгера.
Да, иногда это и не требуется и можно прописать получение логгера жестко, но это частный случай. Первоначальный вопрос был именно про то, как правильно передавать зависимости в объекты (не только логгер) в общем случае, и DI тут самый простой и логичный способ. Потому я и дал ссылку на урок про DI.
Ты же даже оригинальный вопрос не прочел, а просто пишешь тут частный пример, то, как где-то в Яве кто-то предпочитает прописывать получение логгера статическими методами. Причем не даешь других вариантов, не даешь описания плюсов и минусов.
Логгер такая же зависимость, как и любой другой объект.
> Добавлю ещё, что когда ты сам, руками передаёшь зависимости как параметры в конструктор - это не DI.
А что? DI - это принцип передачи зависимостей снаружи (а не поиска их объектомсамостоятельно), а DIC - вспомогательный класс для реализации этого принципа.
DI/IoC описан у Фаулера тут: https://martinfowler.com/articles/injection.html
Тут есть явное противопоставление DI vs ServiceLocator:
> I'm going to start by talking about the various forms of dependency injection, but I'll point out now that that's not the only way of removing the dependency from the application class to the plugin implementation. The other pattern you can use to do this is Service Locator
Также, нигде явно не написано про обязательность "контейнера":
> The basic idea of the Dependency Injection is to have a separate object, an assembler, that populates a field in the lister class with an appropriate implementation for the finder interface
Да, тут упомянут некий "assembler", но к нему не предъявляется никаких требований и не сказано, что это должен быть "контейнер".
В твоем подходе в классе просто жестко прописано получение логгера (Logger.getLogger) и мы не можем снаружи выбрать, что в него передать. Мы не можем выбрать тип логгера при создании класса, так как там все захардкожено. Мы не можем создать 2 экземпляра класса с разными логгерами. Мы не можем в тестах передать другой тип логгера.
Да, иногда это и не требуется и можно прописать получение логгера жестко, но это частный случай. Первоначальный вопрос был именно про то, как правильно передавать зависимости в объекты (не только логгер) в общем случае, и DI тут самый простой и логичный способ. Потому я и дал ссылку на урок про DI.
Ты же даже оригинальный вопрос не прочел, а просто пишешь тут частный пример, то, как где-то в Яве кто-то предпочитает прописывать получение логгера статическими методами. Причем не даешь других вариантов, не даешь описания плюсов и минусов.
Логгер такая же зависимость, как и любой другой объект.
> Добавлю ещё, что когда ты сам, руками передаёшь зависимости как параметры в конструктор - это не DI.
А что? DI - это принцип передачи зависимостей снаружи (а не поиска их объектомсамостоятельно), а DIC - вспомогательный класс для реализации этого принципа.
DI/IoC описан у Фаулера тут: https://martinfowler.com/articles/injection.html
Тут есть явное противопоставление DI vs ServiceLocator:
> I'm going to start by talking about the various forms of dependency injection, but I'll point out now that that's not the only way of removing the dependency from the application class to the plugin implementation. The other pattern you can use to do this is Service Locator
Также, нигде явно не написано про обязательность "контейнера":
> The basic idea of the Dependency Injection is to have a separate object, an assembler, that populates a field in the lister class with an appropriate implementation for the finder interface
Да, тут упомянут некий "assembler", но к нему не предъявляется никаких требований и не сказано, что это должен быть "контейнер".
Значок $ скорее по историческим причинам, унаследован от Перла, а тем от программ-оболочек командной строки (shells). Тут есть как плюсы: его удобно подставлять в строку, так и минусы: надо писать на один символ больше.
Java унаследовала синтаксис от Си, где доллар не пишется.
Еще были языки, где суффикс или префикс переменной определял ее тип.
>>66229
Если понимать дословно, то как раз все логично: мы "внедряем" зависимости в объект, передавая их при создании. Можно почитать статью Фаулера и поискать определение там: https://martinfowler.com/articles/injection.html
>>66131
> Сделай внутри лог-менеджера несколько логгеров, выбирай по именам, пиши в разные файлы.
Это ты начинаешь изобретать костыли вместо DI. Исходный вопрос был не только про логгеры, а вообще про инъекцию зависимостей.
>В твоем подходе в классе просто жестко прописано получение логгера (Logger.getLogger) и мы не можем снаружи выбрать, что в него передать. Мы не можем выбрать тип логгера при создании класса, так как там все захардкожено. Мы не можем создать 2 экземпляра класса с разными логгерами. Мы не можем в тестах передать другой тип логгера.
Всё это мы можем. Как обоссать два пальца.
Статический метод - это просто способ вызова.
Функция, не привязанная к экземпляру какого-либо объекта.
Никаких недостатков у статических методов нет.
Какие могут быть недостатки у функции?
Но, конечно, их можно неправильно использовать. Всё что угодно можно неправильно использовать.
Я, всего лишь, привёл пример, как эта проблема (логгинг) решается в джаве.
В реальных профессиональных фреймворках и библиотеках.
Как правило, в реале логгеры конфигурируются в конфиге - xml и т.п. И не обязательно в конфиге приложения - у библиотеки логгинга может быть свой отдельный конфиг - просто файл в каталоге приложения, который она найдёт сама. Можно делать что угодно вообще.
Например, у меня логгеры сконфигурированы в конфиге DI контейнера, тем способом, которым он хочет. А получаю я их через Logger.getLogger(name) - тоже стандартным способом. Это две стороны одного целого.
В конфиге я могу писать if-else. И у меня всё это будет конфигурироваться по-разному, в зависимости от других условий. Само.
Более того, я могу даже сменить саму библиотеку логгинга (которая, собственно, пишет в файлы и т.п.), и у меня всё будет продолжать работать.
А в пыхе вместо конфига можно использовать просто код - это же динамический язык. Но, если ты так хочешь - пиши конфиг на json или yaml и парси.
Также, логгер - не обычная зависимость, и не надо тупо переносить на него правила работы с зависимостями в DI. Не надо стремиться сделать всё "универсально" - это типичная ошибка начинающих.
А передавать логгер через конструктор (или сеттер) - это просто верх ебанизма.
>Фаулер
Не перебарщивай с этим.
Суха теория, мой друг, а древо жизни вечно зеленеет, лол.
>>66271
>изобретать костыли вместо DI
Это не "костыли". И не "вместо" DI. Это вообще про другое.
>В твоем подходе в классе просто жестко прописано получение логгера (Logger.getLogger) и мы не можем снаружи выбрать, что в него передать. Мы не можем выбрать тип логгера при создании класса, так как там все захардкожено. Мы не можем создать 2 экземпляра класса с разными логгерами. Мы не можем в тестах передать другой тип логгера.
Всё это мы можем. Как обоссать два пальца.
Статический метод - это просто способ вызова.
Функция, не привязанная к экземпляру какого-либо объекта.
Никаких недостатков у статических методов нет.
Какие могут быть недостатки у функции?
Но, конечно, их можно неправильно использовать. Всё что угодно можно неправильно использовать.
Я, всего лишь, привёл пример, как эта проблема (логгинг) решается в джаве.
В реальных профессиональных фреймворках и библиотеках.
Как правило, в реале логгеры конфигурируются в конфиге - xml и т.п. И не обязательно в конфиге приложения - у библиотеки логгинга может быть свой отдельный конфиг - просто файл в каталоге приложения, который она найдёт сама. Можно делать что угодно вообще.
Например, у меня логгеры сконфигурированы в конфиге DI контейнера, тем способом, которым он хочет. А получаю я их через Logger.getLogger(name) - тоже стандартным способом. Это две стороны одного целого.
В конфиге я могу писать if-else. И у меня всё это будет конфигурироваться по-разному, в зависимости от других условий. Само.
Более того, я могу даже сменить саму библиотеку логгинга (которая, собственно, пишет в файлы и т.п.), и у меня всё будет продолжать работать.
А в пыхе вместо конфига можно использовать просто код - это же динамический язык. Но, если ты так хочешь - пиши конфиг на json или yaml и парси.
Также, логгер - не обычная зависимость, и не надо тупо переносить на него правила работы с зависимостями в DI. Не надо стремиться сделать всё "универсально" - это типичная ошибка начинающих.
А передавать логгер через конструктор (или сеттер) - это просто верх ебанизма.
>Фаулер
Не перебарщивай с этим.
Суха теория, мой друг, а древо жизни вечно зеленеет, лол.
>>66271
>изобретать костыли вместо DI
Это не "костыли". И не "вместо" DI. Это вообще про другое.
Ты опоздал на пару лет, вся та СЖВ хуерга заглохла ещё в 2017, и только сейчас до рашки доходят отголоски.
Если начать разбираться в теме - выяснится что ВНЕЗАПНО, никто не смотрел на имя или цвет кожи, а отбирались докладчики по докладу. Комиссия не знала имён, пола или расы. Так что выбрали 20 самых адекватов из 253 подавших заявки.
ВНЕЗАПНО, оказалось что все 253 были белыми.
252 из них - мужиками.
Какой-то дебич, вдруг решил что свалить на пару недель куда-нибудь на сказочноебали будет лучше, чем сидеть в европках с ботанами и нердами и не придумал ничего лучше чем сказать "Там одни белые и тёлок нет", его поддержал ещё один докладчик. Так как за пару недель до события новых двух найти не удалось, решили что надо расходиться.
Но Всякие нытики в интернетах и твитере конечно преподносят это как СЖВ и вот это вот всё.
он под 800 постов вроде появляется. Надо просто верить в него
#яверю #посмотриМоихСтудентов #устройНаРаботуЗаСтоМильеновВсек
Не, я не о том, когда он проверит. Мне интересно чем он занимается, работает
Тебе не всегда нужен весь фарш сразу и разом, некоторые предпочитают собирать проекты покомпонентно, выбирая каждый инструмент под задачу. Роутер от слима, базу от ларавела, валидатор от симфони и так далее.
А касательно задачи про файлообменник, что можешь посоветовать? Я хочу от слима взять только роутер, остальное на чистом. Или лучше углубиться в слим для обучения?
Если я ничего не путаю, то в слиме нет ничего, кроме роутера и структуры, так что я бы взял его. Ну или lumen, если ты laravel не знаешь, так хоть познакомишься с частью компонентов.
Js очень прост, как язык, там нечего долго изучать. Главное, изучать ES6 и тому подобное, модули, экосистему. Сложнее изучать фреймворки, библиотеки и подходы. react/redux,angular,saga и т.п.
Советую напичать пару простеньких фронтенд приложений с бекендом на ноде, потратишь неделю, но будет очень полезно.
Плюс, отдельно можешь тайпскриптом заполировать, он намного приятнее и будет полезен в будущем, он часто используется. Можешь писать на нём и фронт, и бэк.
СЖВ-блядки лезут туда, куда их исторически не просили. Никто не мешает нигерам и феминисткам тоже записыватся, но они слишком тупые для этой сходочки белых парней.
Расскажешь. Может тебе просто, с высоты опыта и тп. но новичок охуеет от того сколькими разными способами делается одно и то же, совершенно законно. Ни разу не легкий и не простой.
спасибо, но жс не логичен, язык не поворачивается назвать его простым
В js'е нет кастомных типов (только примитивные), классов, указателей, многопоточностей. Сравнительно просто.
На начальный уровень знания самого языка нужно выучить только типы, операции, сравнительно маленькую стандартную библиотеку, концепцию event loop и промисов. Ну и про стандарты прочитать.
>Я хочу от слима взять только роутер, остальное на чистом
Аношка, я тоже делаю slim. Но я еще установил шаблонизатор твиг, про него в учебнике написано. Возьми еще и его в нагрузку, он простой, но авторитет в собственных глазах повышается. Еще можешь бутстрап юзать для верстки - считай ТРИ пакета используешь. У будущего работодателя соски встанут от такого резюме джуна
Делаю сервис отчетов из бд.
Запросом из БД формирую отчет, пишу его в exel-файл и данный файл сохраняю в отдельной папочке.
Далее мне требуется этот файл отчета отдать клиенту, сделал ссылочку которая ведет на отдельный обработчик. Примерный код обработчика везде одинаков, у меня такой :
https://ideone.com/rB4236
Фигня в том что когда я сохраняю файл отчета на одном уровне с индексным файлом, то все отдается.
Но когда я размещаю файл в дочернем каталоге, то уже readfile не может найти файл. И ниче про это найти не могу.
>классов
Прототипы, которые ломают мозг сильнее всяких классов.
>кастомных типов
Если бы такая фича и была (хотя она и не нужна в ваниле, есть typescript), и ты ещё жив, сможешь и с этим разобраться.
>указателей
В хаскелле тоже нет, но это не делает его простым для освоения.
>многопоточностей
Хороший пойнт. Но можно ведь
>выучить только
Не понимаю, с чем ты споришь. В js'е, как языке, находится сравнительно мало фич. Кроме блядских прототипов и ряда исторически сложившихся нёх'ов там сильно нечего изучать, в языке.
Дальше нужно изучать экосистему и вот это уже пиздец, да.
Ни разу не видел, чтобы работодатели хотели слим. Лучше уж тогда брать ларавел или симфони.
я не очень умный, но может там в переменной path перед конечной папкой добавить глобальную переменную с серверным путем типа _DIR_
>отдельный обработчик
Но нахуя?
У тебя веб-сервер не может нормально отдать excel-файл? Добавь ему mime-тип в конфиг, если так.
Или тебе нужны ограничения по безопасности, чтобы кто-то не мог брать чужие файлы и т.п.? Или с именами что-то мутить?
Проверь, что на самом деле является текущим каталогом у тебя - выведи в лог полый путь к "."
Дело в этом, скорее всего. А в readfile() может быть какая-то магия, и ты думаешь, что каталог скрипта у тебя текущий.
Где то как ты сказал и получилось - я с php.net скопировал пример, под себя перекопал - все заработало. У меня видимо некие траблы с относительными и абсолютными путями и всей этой залупой со слешами и корнями приложения.
Так там только роутинг и зависимости с логгером. Что ещё?
Как запустить приложение из примера: https://github.com/nesk/puphpeteer/
Пытаюсь запустить через xammp. В папку htdocs поместил test.php, обращаюсь через localhost/test.php, но сервак не видит либы установленные через composer.
Попробовал прописать их вречную через include, но на 20-й либе заебался?
Что я делаю не так? (на скрине нерабочий скрипт, не находит
очередной класс)
А как же заказчики?
Контекст не особо читал, но после того как ты делаешь composer install он генерирует все подключения и тебе надо будет за иклудить только один файлик auto..чета там вроде load.php
Вот у меня такая структура сайта -> в корне (он определяется $_SERVER['DOCUMENT_ROOT']) только файл .htassecc, который переадресует все запросы на дочерний каталог public, в котором находится уже index.php.
корень
.htaccess
----- папка public - тут каталоги картинок, стилей и тому подобное
----------index.php
----- папка App - в ней вся логика приложения, контроллеры, модели и представления
Я не очень понимаю что есть корень сайта для браузера в моем случае? Корень для браузера это $_SERVER['DOCUMENT_ROOT']- корень приложения, или для браузера корень - это то что находится в папке public, т.е. для браузера корневой каталог это каталог в котором выполняется index.php? И ниже него нельзя уже обратиться?
Проблема в том, что когда я в каком нибудь представлении размещаю ссылку на картинку которая находится не в каталоге public - картинка не отображается
>для браузера корневой каталог это каталог в котором выполняется index.php
да
даже если попробовать ../folder/1.jpg тоже не отображается ?
обычно vhost настраивается сразу на папку public что бы не было плясок с .htaccess
>>68539
>>для браузера корневой каталог это каталог в котором выполняется index.php
>>да
Похоже все же нет, потому что без .htaccess если просто создать структуру из каталогов - то браузер понимает конструкцию ../img/img.jpg и отображает изображение.
Первый .thaccess (который в корне) у меня таков:
AddDefaultCharset utf-8
Options -Indexes
RewriteEngine On
RewriteRule ^(.)$ /public/$1
он передает урл в каталог public (в нем находится индексный файл php), где запрос обрабатывается следующим .thaccess :
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.) index.php?$1 [L,QSA]
В index.php у меня вызывается роутер, который уже разбирает запрос и вызывает нужные контроллеры.
Вопрос таков - все ссылки в тэгах <img> , все подключения стилей и так далее - это те же самые запросы, которые проходят всю цепочку из .thaccess.
То есть в <img src=' img/img.jpg ' > запрос "img/img.jpg" будет передан в папку public и открыт, согласно второму правилу не будет обработан index.php а отдан сервером сразу.
В таком же случае запрос "../img/img.jpg" не обрабатывается?
>В таком же случае запрос "../img/img.jpg" не обрабатывается?
Почему же таком же случае запрос "../img/img.jpg" не обрабатывается?
самофикс
Хочу сказать спасибо ОПу за существование этих тредов. Благодаря ему "вошёл в АйТи". Прошел его гайд, сделал студентов, файловый хостинг (правда здесь не показывал, ибо было стыдно, да и слишком хикка был ). Попытался устроиться на галеру в другой город (100к променял на 500к (было сложно, очень)). С первого же раза прошел собес (спасибо за упор на ООП и современные технологии, большинство вопросов были по ООП (собес был удаленно, вначале тряслись руки и было очень страшно)). Видимо им понравился файловый хостинг и мой проект на Node.JS. Предложили зп выше той, что я просил, готовы были взять хоть сейчас.
Четвертый месяц как сижу на галере. За это время успел съездить в командировку в UK (после годов хиккования - это было потрясающе (совершенно другой мир)). Узнал что такое Agile и Scrum.
Научился работать в команде. Стал гораздо более общителен, стал менее бояться окружающего мира. И много-много всего остального.
Просто огромное спасибо ОПу за существование сего треда и всем помогающим. Единственное, что могу посоветовать - не сдавайтесь, какими бы тупыми вы себя не считали. Вы не такие, раз смогли дойти до этого треда.
Написано в пьяном желании выразить благодарность.
Двачую. ОП, ты очень крутой чел (а может и барышня, кто знает)
Как это правильно реализовать? Чтобы в функцию нельзя было просто так передать значение "omega" без последствий.
Очевидный вариант: if ($arg !== "eot" || $arg !== "eroha") { ... }, но интуитивно кажется, что должен существовать какой-то более стройный способ.
Про enum я знаю, но стоит ли под каждый метод, который принимает одно из значений заводить enum? Это сделает код не слишком громоздким?
>Очевидный вариант: if ($arg !== "eot" || $arg !== "eroha") { ... }, но интуитивно кажется, что должен существовать какой-то более стройный способ.
Можно так:
if (in_array($arg, ['eot', 'eroha'], true)) {}
Или вынести массив в отдельную переменную/поле_класса/константу:
$dvachers = [
'eot',
'eroha',
];
Пробовал через bindTo() но чёта ругается на ссылку $this в функции.
Не хочется городить глобальный контейнер для передачи в обработчики.
Это как раз нормально и правильно, создавай класс либо интерфейс Context и прокидывай его.
Ты же просто в рутах указываешь обработчик, это или анонимная функция или путь к методу. Вот тебе и весь мвс
Сделал передачу $this в обработчик. В этом $this сделал публичные поля, где надо. Вроде цивильно выглядит.
Так пойдёт?
слим это контейнер с роутингом. Всю логику ты пишешь сам, по необходимости можно вьюхи подключить или отдавать по апи
Какое то говно. Два часа не могу контроллер к роуту привязать. Все мини-фреймворки такие душные?
700. Для джуна без опыта - очень много. Сейчас понимаю, что очень повезло.
Хотелось бы понимать, какие именно действия представляют угрозу для сайта и как уметь максимально от них этот сайт обезопасить. По крайней мере, на таком уровне, чтобы не было стыдно за свои работы на фрилансе (если я, конечно, когда-нибудь начну там получать бабос).
Сразу сорри за много букв. Немного конкретнее опишу свою проблему.
Занимался тут по одному видосу, где рассказывалось, как работать с базой данных, и сделал почти все, что нужно. Только автор видоса предлагал проблему безопасности сайта решить самому. Он обмолвился, что в моем случае можно полям с конкатенацией применить mysqli_real_escape_string. А также сказал что-то про XSS-атаку, от которой можно защититься посредством strip-tags. Я не понял, идет ли речь о том, что нужно выбрать что-то одно из этого, либо же надо несколько фильтров накладывать? Мне уже приходилось использовать strip-tags() для того, чтобы очистить текст от html-тэгов, и вроде как она фильтрует также PHP, но мне не очень ясно, как именно это помогает в безопасности.
Видов атак, я так понял, существует немалое количество. Как от всех них защищаться и в каких случаях нужно применять те или иные функции?
Верно ли я понимаю, что о безопасности впору думать всякий раз, когда на сайте есть какие-либо формы для ввода/работает GET или POST параметр? Но это вроде как касается только SQL-инъекций... Тут, казалось бы, достаточно сделать так, чтобы передаваемая от пользователя информация воспринималось только как текст или число, а не запрос в базу данных.
Собственно, в своем коде я применил mysqli_real_escape_string (как это рассказывается уже в другом ролике, но он на англ: https://www.youtube.com/watch?v=nTgFPcYRkys), а вот со strip-tags решил подождать. Потому что я не очень понимаю, нужен ли он. Нужно ли вообще прогонять информацию, получаемую через $_POST через несколько фильтров (для того, чтобы защититься от разных атак)? Подобные ухищрения кажутся немного нелепыми, но это первое, что пришло мне на ум, а именно создать еще 4 переменных и использовать очередную функцию (в данном случае strip-tags), прогоняя через нее уже имеющиеся переменные. Как паровозик через туннели, ё-мое. На комментарии в скрине внимание можно не обращать, я их оставляю для себя.
Я смотрел как-то еще один ролик, и там сразу про несколько функций рассказывалось, применяющихся для защиты. Помимо strip_tags() еще htmlspecialchars() и htmlentities().
Но из роликов и инфы в нете я получаю какую-то фрагментированную информацию. Знает ли кто-то адекватные источники на эту тему?
И еще вопросы по скрину: можно ли мой код написать каким-нибудь другим образом в данном случае? Ну, за исключением варианта с созданием отдельной переменной, которая содержала бы в себе запрос. (Видел, что некоторые так делают зачем-то, но мне это кажется просто лишним удлинением кода).
И что меня интересует больше всего, так это то, зачем в таких запросах нужна конкатенация с двух сторон, именно в таком виде? И еще кавычки внутри кавычек-апострофов. Это связано с безопасностью? В ролике автор как-то не очень объяснил этот момент. До того, как я применил strip-tags, в самом запросе mysqli_query на скрине там были не переменные, а POST-параметр.
Хотелось бы понимать, какие именно действия представляют угрозу для сайта и как уметь максимально от них этот сайт обезопасить. По крайней мере, на таком уровне, чтобы не было стыдно за свои работы на фрилансе (если я, конечно, когда-нибудь начну там получать бабос).
Сразу сорри за много букв. Немного конкретнее опишу свою проблему.
Занимался тут по одному видосу, где рассказывалось, как работать с базой данных, и сделал почти все, что нужно. Только автор видоса предлагал проблему безопасности сайта решить самому. Он обмолвился, что в моем случае можно полям с конкатенацией применить mysqli_real_escape_string. А также сказал что-то про XSS-атаку, от которой можно защититься посредством strip-tags. Я не понял, идет ли речь о том, что нужно выбрать что-то одно из этого, либо же надо несколько фильтров накладывать? Мне уже приходилось использовать strip-tags() для того, чтобы очистить текст от html-тэгов, и вроде как она фильтрует также PHP, но мне не очень ясно, как именно это помогает в безопасности.
Видов атак, я так понял, существует немалое количество. Как от всех них защищаться и в каких случаях нужно применять те или иные функции?
Верно ли я понимаю, что о безопасности впору думать всякий раз, когда на сайте есть какие-либо формы для ввода/работает GET или POST параметр? Но это вроде как касается только SQL-инъекций... Тут, казалось бы, достаточно сделать так, чтобы передаваемая от пользователя информация воспринималось только как текст или число, а не запрос в базу данных.
Собственно, в своем коде я применил mysqli_real_escape_string (как это рассказывается уже в другом ролике, но он на англ: https://www.youtube.com/watch?v=nTgFPcYRkys), а вот со strip-tags решил подождать. Потому что я не очень понимаю, нужен ли он. Нужно ли вообще прогонять информацию, получаемую через $_POST через несколько фильтров (для того, чтобы защититься от разных атак)? Подобные ухищрения кажутся немного нелепыми, но это первое, что пришло мне на ум, а именно создать еще 4 переменных и использовать очередную функцию (в данном случае strip-tags), прогоняя через нее уже имеющиеся переменные. Как паровозик через туннели, ё-мое. На комментарии в скрине внимание можно не обращать, я их оставляю для себя.
Я смотрел как-то еще один ролик, и там сразу про несколько функций рассказывалось, применяющихся для защиты. Помимо strip_tags() еще htmlspecialchars() и htmlentities().
Но из роликов и инфы в нете я получаю какую-то фрагментированную информацию. Знает ли кто-то адекватные источники на эту тему?
И еще вопросы по скрину: можно ли мой код написать каким-нибудь другим образом в данном случае? Ну, за исключением варианта с созданием отдельной переменной, которая содержала бы в себе запрос. (Видел, что некоторые так делают зачем-то, но мне это кажется просто лишним удлинением кода).
И что меня интересует больше всего, так это то, зачем в таких запросах нужна конкатенация с двух сторон, именно в таком виде? И еще кавычки внутри кавычек-апострофов. Это связано с безопасностью? В ролике автор как-то не очень объяснил этот момент. До того, как я применил strip-tags, в самом запросе mysqli_query на скрине там были не переменные, а POST-параметр.
Ты пойми сразу что никто ничего не пишет с нуля.
А готовые решения уже содержат средства для валидации данных и защиты инъекций.
А дальше два подхода
если ты хочешь что то делать то ты изучаешь как правильно использовать продукт;
если ты хочешь понимать как проходят атаки гуглишь атаки конкретно для этого продукта и разбираешь их на сырцах
сколько лет? сколько прошло между началом обучения и первым оффером? бочку делаешь?
Не ведись глупенький
Я проигрываю с местных кастратов, лол.
>>у меня вообще паническая атака
Чтож вы такие немощные то?
Люди вообще нихуя не зная пхп и прочего говна, на джумле/вордпрессе работают и делают сайты на заказ, зарабатывают деньги.
П.С.
Я не к тому что бы постебаться.
Я к тому, что любые знания можно продать, а ты >>70198
уже что то умеешь. Но как конченый овощ скулишь
>>Оцените мои шансы попасть на работу
позорище.
Напрягись сам и ищи то что тебе по уровню. Если упорно искать - найдешь обязательно. И прокачаешь решительность, упорство, смелость, умение брать ответственность.
А не стерильное " возьмите меня на работу, я кастрат".
Не будь тряпкой, и верь в себя.
да кстати лол, у меня одноклассник так "работал", но ему лет 15 было лол. К 19 уже жоповозку купил учась в колледже.
но он работал на себя, а не на дядю)
>А что мне делать если у меня уже есть composer.json?
composer install
>Просто composer uodate?
Не делай composer update. Забудь про существование этой команды (пока, по крайней мере).
Composer - это инструмент не только для скачивания, но и для фиксации версий. Потому что mypack@v1 может иметь функцию, которой уже нет в mypack@v2 и твой код, вызывающий её, сломается. Соответственно, необходимо куда-то записать, что ты используешь mypack с версией именно v1.
Так, композер поддерживает два файла файла:
composer.json - "проекту нужен mypack"
composer.lock - "нужно использовать mypack версии v1"
Команды:
composer require mypack v1 - добавит mypack в composer.json и v1 в composer.lock
composer update mypack - обновит версию mypack в composer.lock
composer install - скачает все пакеты из composer.lock с указанными версиями тебе в vendor.
composer install обычно используется при деплое. Твои composer.json и composer.lock лежат под гитом. Ты делаешь git clone или git pull и стягиваешь актуальные версии этих файлов на машину, потом делаешь composer install - и он выкачивает тебе нужные пакеты нужных версий. Всё, проект можно запускать.
Да, по крайней мере у нас с товарищем было так. Наверное localhost виндой как-то по-другому интерпретируется, нежели просто ip циферками. Да чё, щас проверю ещё раз. / Да, все ещё есть задержка секунда- полторы. Интересно бы узнать как там, в глубине, это работает.
Скорее всего, если ты указываешь адрес напрямую, то твой компьютер обращается по нему безо всяких промежуточных этапов.
А localhost требует вызова службы dns, которая пытается зарезолвить слово "localhost" в какой-то айпишник, обращается к кэшам, ещё куда-то, потом в hosts-файлик и в итоге возвращает 127.0.0.1, куда твой компьютер уже отправляет запрос так же, как и в варианте 1.
(собственно, слово localhost - это вообще нифига не стандарт, просто он прописан в локальном конфиге dns большинства ОСей, как 127.0.0.1)
Скорее всего, у тебя в винде какие-то проблемы с локальной службой dns. Или с ней же, но внутри докера, если ты его используешь. Где-то там в-общем, далее надо смотреть, что именно ты используешь и дебажить.
На всякий случае можешь сбросить локальный кэш dns.
На ноде у меня нет такой проблемы, оба варианта работают быстро.
Ок, спасибо, буду так делать на всякий случай.
>ты пойми
Ничего не понял из твоего поста. Для меня это просто каша из непонятных слов, т.к. я совсем новичок в программировании.
>готовые решения
>валидация данных
>продукт
>на сырцах
Мне бы понять, в какую сторону вообще двигаться. Есть ли какой-то гайд или книга годная на эту тему?
Приходит тебе заказ сделать сайт для компании, ты берешь например битрикс для реализации, потому как нет смысла для типичного проекта писать все руками с нуля.
Ты изучаешь как правильно им пользоваться. Например рядовое место для инъекций это формы (для отзывов, для записи на что либо). Соответственно ты смотришь примеры как это правильно сделать в битриксе. И если ты сделаешь по гайдам с офсайта то у тебя и не возникнет проблем.
Чуваки, что угодно, только не битрикс. Действительно, что угодно, хоть yii, хоть древний, как говно мамонта, codeigniter, хоть wordpress (хотя тоже то ещё говно).
Но только не битрикс. Не заботитесь о себе - позаботьтесь о тех, кому после вас это поддерживать.
А новичку его вообще предлагать нельзя. Хороших паттернов он не выучит, навыки архитектуры не прокачает, на зарубежных клиентов работать не сможет. Эдакая западня.
И это убожество называется Laravel.
Действительно, почему бы при сраном удалении нескольких записей не создать инстанс объекта для каждой из них?
В который раз убеждаюсь, что все эти ORM годятся исключительно для васянских манясайтов с нагрузкой не больше 5 одновременных запросов.
спасибо
А что ты еще ожидал от пыхарей?
>на зарубежных клиентов работать не сможет
Он их и так найти не сможет (нормальных, по крайней мере), если продолжит писать на php.
>Мимо-пыхарь-работает-удалённо-на-нидерланды-за-3-килобакса.
Какие же пыхари дегенераты, простигосподи.
мимо-жавист-котлинист-работает-в-комфортном-офисе-за-300-килорублей
Ты не дорос ещё.
>Действительно, почему бы при сраном удалении нескольких записей не создать инстанс объекта для каждой из них?
Это ты про уровень домена? Именно, что без архитектуры будет у тебя сплошное васянство и говнокод.
Так-то тебе никто не мешает взять вордпресс и не ебать умным людям мозги.
мимо-жавист-котлинист-анонист-гребёт -в кандалах-на-галере-с-корпо -булшитом-за-300-килорублей
Теперь немного понял. С нуля - т.е. на чистом пхп без всяких CMS, фреймворков и т.д., да? Т.е. нет особого смысла вкатываться в безопасность, пока не начну работать с фреймворками?
нахуя мне хрюндель и твоя помойка галера если я на себя работаю уже как с 10 лет
мимо вопрос не мой , другой анон
а что ты ожидал от Eloquent и ОRM в целом ? сделано тупым говном для тупого говна как и сама Лара для написания чего-то на коленки за минимум секунд, алсо особые дауны пытаются пародировать dao и приминают подходы от туда.
Уже месяцев 5 барахтаюсь на одном и том же уровне. Чето типа блога с ноля способен написать. И завис.
Есть работка, платят не среднюю по РФ, на работке есть паралельная задача написать определенный сервис, я его общую логику написал. Но я пишу его еле еле, кое как по три строки в день.
Если бы взялся уверенно - давно бы уже сделал, и мне бы ЗП подняли. Но я как дерьмо в проруби.
Пиздец мне это надоело.
Аношка, я уверен, если тебя прижмет, ты быстро и качественно выполнишь любую работу, так что не напрягайся зря. Выдели в день по десять минут на самосовершенствование - для начала. Просто каждый день эти 10 минут трать и постепенно увеличивай. И само пойдет - привычка сильная сила
Я если честно себя уважать уже перестал, ну что это за дела?
Деньги пусть обычные платят, мозг не ебут, чему то я по итогу научился, задача есть. Время есть.
Мне блядь просто стыдно.
Это обычная реакция умного человека - не напрягаться без нужды. Выдели 10 минут в день для начала и все
Солидный человек. Может себе позволить.
А то вот опытным путём обнаружил, что в тестировании конфигурации битрикса она убирает предупреждение про размер стека, но возникают подозрения, что этим я какой-то функционал отключаю.
Собственно вопрос в том, что выгодней. Хранить такие данные или вычислять их при необходимости каждый раз?
Нашел. Когда искал пропустил trait FileHelpers
>Т.е. нет особого смысла вкатываться в безопасность, пока не начну работать с фреймворками?
Очень спорное утверждение, аношка. За ним может скрываться чистая лень типа "я щас на голом php не буду делать проверку на инъекцию и эддслеши, зачем, ведь во фреймворках все есть". Но чисто для саморазвития, чего и хочет добиться оп, это плохо, потому что ты упускаешь кучу нюансов и можешь просто не понять как работает функция "безопасности" во фреймворке
>>71516
Вроде как оп советует вычислить их один раз с помощью сторонней библиотеки/средствами скрипта и хранить в базе в виде jcon объекта. То-есть, как я понимаю, будет одно лишнее поле с текстом объекта. Кроме того, оп еще пишет делать комментарии к скачиваемым файлам, то-есть это еще одна таблица, у которой будет текст камента, айди камента, потом парент айди - для двевовидных каментов, и айди-файла - чтобы знать кому этот камент принадлежит. Хотя это может быть факультативным заданием со звездочкой
https://3v4l.org/BEGtc
[Ссылка]
BEGtc
https://3v4l.org/BEGtc
это надо сделать апишку ?
если да то можно но зачем ?
https://forum.yiiframework.com/t/creating-a-rest-api-for-yii2-basic-template/87613
Член встал, как же еще
и обязательно на yii2 ? или можно любой другой фрейм ? для таких задач обычно микроферймы типа слим люмен етц юзают , но это весьма изи задание
Бамп, что никто проекты чужие в портфолио не запихивал?
JIT = just-in-time compilation. Это опция, которая позволяет взять регулярку и скомпилировать из нее программу в машинных кодах, которая проверяет строку на соответствие регулярке (вместо того, чтобы сопостовлять регулярку со строкой с помощью интерпретатора).
По умолчанию JIT не используется, а используется программа-интерпретатор. Она разбирает регулярку, преобразует ее в дерево, затем по нему генерирует набор инструкций, выполняет их, проверяя строку на соответсвие регулярке.
JIT - это значит, что мы берем регулярку вида "/^abc/" и преобразуем (компилируем) ее, например, в исполняемый PHP-код:
function is_match($string) {
return mb_substr($string, 0, 3) == 'abc';
}
И используем этот код для проверки строки на соответствие вместо того, чтобы использовать универсальный интерпретатор. Единственное отличие - JIT генерирует не PHP-код, а машинный код - команды, которые напрямую выполняет процессор и которые обеспечивают максимальную производительность.
Подробно она описана в документации к библиотеке PCRE: https://www.pcre.org/original/doc/html/pcrejit.html , учти что это сишная библиотека и там есть примеры кода на Си.
Если кратко:
- JIT позволяет ускорить сопоставление строки с выражением, убрав накладные расходы на работу программы-интерпретатора, так как в JIT она не используется, мы напрямую преобразуем регулярку в программу-проверяльщик.
- JIT поддерживается не для всех архитектур и не для всех конструкций в регулярке
- JIT - новая технология и может глючить
- при отключении JIT регулярки не перестанут работать, но будут работать медленнее, чем могли бы
>>72217
> И какого черта у меня ноль градусов находится в районе 6 часов, а не как у ОПа в районе 3 часов
А ты наверно синус с косинусом местами перепутал. При 0 градусов синус равен нулю, а косинус - единице. Если у тебя синус на оси X, то при нуле градусов у тебя будет либо 12 часов, либо 6 в зависимости от знака (+/-) перед косинусом. В компьютерной графике традиционно 0 градусов лежит на 3 часах и угол отсчитывается против часовой стрелки.
> $curDegree = round($degree);
Начальный угол, наверно, должен равняться $fromAngle.
В остальном, решение верное.
JIT = just-in-time compilation. Это опция, которая позволяет взять регулярку и скомпилировать из нее программу в машинных кодах, которая проверяет строку на соответствие регулярке (вместо того, чтобы сопостовлять регулярку со строкой с помощью интерпретатора).
По умолчанию JIT не используется, а используется программа-интерпретатор. Она разбирает регулярку, преобразует ее в дерево, затем по нему генерирует набор инструкций, выполняет их, проверяя строку на соответсвие регулярке.
JIT - это значит, что мы берем регулярку вида "/^abc/" и преобразуем (компилируем) ее, например, в исполняемый PHP-код:
function is_match($string) {
return mb_substr($string, 0, 3) == 'abc';
}
И используем этот код для проверки строки на соответствие вместо того, чтобы использовать универсальный интерпретатор. Единственное отличие - JIT генерирует не PHP-код, а машинный код - команды, которые напрямую выполняет процессор и которые обеспечивают максимальную производительность.
Подробно она описана в документации к библиотеке PCRE: https://www.pcre.org/original/doc/html/pcrejit.html , учти что это сишная библиотека и там есть примеры кода на Си.
Если кратко:
- JIT позволяет ускорить сопоставление строки с выражением, убрав накладные расходы на работу программы-интерпретатора, так как в JIT она не используется, мы напрямую преобразуем регулярку в программу-проверяльщик.
- JIT поддерживается не для всех архитектур и не для всех конструкций в регулярке
- JIT - новая технология и может глючить
- при отключении JIT регулярки не перестанут работать, но будут работать медленнее, чем могли бы
>>72217
> И какого черта у меня ноль градусов находится в районе 6 часов, а не как у ОПа в районе 3 часов
А ты наверно синус с косинусом местами перепутал. При 0 градусов синус равен нулю, а косинус - единице. Если у тебя синус на оси X, то при нуле градусов у тебя будет либо 12 часов, либо 6 в зависимости от знака (+/-) перед косинусом. В компьютерной графике традиционно 0 градусов лежит на 3 часах и угол отсчитывается против часовой стрелки.
> $curDegree = round($degree);
Начальный угол, наверно, должен равняться $fromAngle.
В остальном, решение верное.
> И какого черта у меня ноль градусов находится в районе 6 часов, а не как у ОПа в районе 3 часов
А ты наверно синус с косинусом местами перепутал. При 0 градусов синус равен нулю, а косинус - единице. Если у тебя синус на оси X, то при нуле градусов у тебя будет либо 12 часов, либо 6 в зависимости от знака (+/-) перед косинусом. В компьютерной графике традиционно 0 градусов лежит на 3 часах и угол отсчитывается против часовой стрелки.
> $curDegree = round($degree);
Начальный угол, наверно, должен равняться $fromAngle.
В остальном, решение верное.
>>71516
>>71969
В такой ситуации стоит выписать возможные варианты, их плюсы и минусы, и выбрать оптимальный в данной ситуации. Например, рассмотрим хранение размера в БД:
- плюс в том, что можно сортировать файлы по размеру, считать суммарный объем загруженных файлов, в том числе по дням
- плюс в том, что при выводе списка файлов не надо обращаться к диску, чтобы узнать их размер. Если у нас распределенный проект, и веб-интерфейс работает на одном сервере, а файлы хранятся на других серверах, то обращаться с одного сервера к другому очень невыгодно, медленно, и данные нужно хранить именно в БД
- минус в том, что в таблице будет на одно небольшое поле больше
Насчет имени файла - я думаю, надо хранить:
- оригинальное имя, чтобы выводить его на странице и подставлять в диалог сохранения при скачивании файла
- имя, под которым файл хранится. Оно может отличаться от оригинала по таким причинам: чтобы убрать спецсимволы, чтобы при загрузке нескольких файлов с одинаковым именем они не затирали друг друга
> И ведь правильно, что выходит только 1 модель и контролер?
Наверно, да. У тебя же по сути один раздел на сайте с 3 действиями: закачка файла, просмотр информации о файле, скачивание файла. И одна сущность: файл.
Если будут комментарии, то для них будет своя модель.
>>72199
В виде JSON я советую хранить метаданные (для картинки - размер, для аудиофайла - длительность, число каналов, параметры кодеков), у которых нет какой-то определенной схемы, и которые из-за этого не получится или невыгодно хранить в отдельных колонках.
> И какого черта у меня ноль градусов находится в районе 6 часов, а не как у ОПа в районе 3 часов
А ты наверно синус с косинусом местами перепутал. При 0 градусов синус равен нулю, а косинус - единице. Если у тебя синус на оси X, то при нуле градусов у тебя будет либо 12 часов, либо 6 в зависимости от знака (+/-) перед косинусом. В компьютерной графике традиционно 0 градусов лежит на 3 часах и угол отсчитывается против часовой стрелки.
> $curDegree = round($degree);
Начальный угол, наверно, должен равняться $fromAngle.
В остальном, решение верное.
>>71516
>>71969
В такой ситуации стоит выписать возможные варианты, их плюсы и минусы, и выбрать оптимальный в данной ситуации. Например, рассмотрим хранение размера в БД:
- плюс в том, что можно сортировать файлы по размеру, считать суммарный объем загруженных файлов, в том числе по дням
- плюс в том, что при выводе списка файлов не надо обращаться к диску, чтобы узнать их размер. Если у нас распределенный проект, и веб-интерфейс работает на одном сервере, а файлы хранятся на других серверах, то обращаться с одного сервера к другому очень невыгодно, медленно, и данные нужно хранить именно в БД
- минус в том, что в таблице будет на одно небольшое поле больше
Насчет имени файла - я думаю, надо хранить:
- оригинальное имя, чтобы выводить его на странице и подставлять в диалог сохранения при скачивании файла
- имя, под которым файл хранится. Оно может отличаться от оригинала по таким причинам: чтобы убрать спецсимволы, чтобы при загрузке нескольких файлов с одинаковым именем они не затирали друг друга
> И ведь правильно, что выходит только 1 модель и контролер?
Наверно, да. У тебя же по сути один раздел на сайте с 3 действиями: закачка файла, просмотр информации о файле, скачивание файла. И одна сущность: файл.
Если будут комментарии, то для них будет своя модель.
>>72199
В виде JSON я советую хранить метаданные (для картинки - размер, для аудиофайла - длительность, число каналов, параметры кодеков), у которых нет какой-то определенной схемы, и которые из-за этого не получится или невыгодно хранить в отдельных колонках.
Безопасность не зависит от того, используешь ты фреймворк или нет. В фреймворках есть средства для защиты от уязвимостей, но если о них не знать, то можно ее допустить. Советую почитать мои несколько базовых уроков о популярных уязвимостях: https://github.com/codedokode/pasta/tree/master/security
>>70925
Так тебе никто не запрещает удалять SQL-запросом. На практике удобно совмещать ORM и SQL. Ну например, если тебе надо посчитать сумму по какой-то колонке, выгоднее это делать через SQL, чем загружать в PHP 1000 объектов, суммировать их поля и выбрасывать эти объекты.
Причина, почему ORM так делает, там написана. Также, в Доктрине есть "ленивая" загрузка, которая позволяет не загружать данные при создании объекта.
И какую альтернативу ты предложишь? Отказаться от ORM и моделей-объектов и передавать массивы неизвестной структуры из функции в функцию? Потом в таком коде не разобраться. По моему опыту, удобнее использовать ORM для маленьких объемов данных и SQL для каких-то операций на большом числе записей.
А если у тебя очень высокая нагрузка ... может быть, тебе нужен не PHP.
>>70854
А еще у битрикса можно получать вознаграждение за покупку продукта по твоей рекомендации ;)
Битрикс и правда хреновый, там по моему требуется настройки в php.ini менять, чтобы он работал. Хорошо, что я с ним не работаю.
Начни отсюда: https://github.com/codedokode/pasta/tree/master/security
Изучи каждую уязвимость, можешь даже сам сделать страницу с ней и сам взломать. Только не "проверяй" чужие сайты, это может быть незаконно.
Если хочешь учиться далее, смотри OWASP top 10 - 10 самых популярных уязвимостей: https://www.owasp.org/images/7/72/OWASP_Top_10-2017_(en).pdf.pdf
Увы, там пояснения не очень простые и не очень понятные. Так что ты можешь по каждой уязвимости гуглить информацию дополнительно. Вот например презентация про SQL инъекции: https://www.ptsecurity.com/upload/corporate/ru-ru/analytics/PT-devteev-Advanced-SQL-Injection.pdf
Далее, есть сайт с каталогом всех известных уязвимостей (не только на сайтах, а вообще в любых программах), для каждой уязвимости делается описание и присваивается номер. Вот обзор уязвимостей: https://www.cvedetails.com/vulnerabilities-by-types.php
Вот список уязвимостей по вордпрессу: https://www.cvedetails.com/product/4096/Wordpress-Wordpress.html?vendor_id=2337
Вот пример одной из них (SQL инъекция в плагине): https://www.cvedetails.com/cve/CVE-2011-5216/
Вот изменения, которые ее исправляют, и по ним можно попробовать понять, в чем она заключалась: https://plugins.trac.wordpress.org/changeset/435356/scormcloud
Можешь порыться, хотя там сложно будет разобраться.
По идее тебе надо искать курс по теме "безопасность веб-приложений"/"уязвимости веб-приложений". Попробуй набрать это в Гугле и изучить первые 10 страниц выдачи, вдруг что найдется.
> Видов атак, я так понял, существует немалое количество. Как от всех них защищаться и в каких случаях нужно применять те или иные функции?
Если выучить топ 10 уязвимостей, то этого хватит в большинстве случаев. Как минимум, надо знать наизусть:
- SQL инъекции
- инъекции в eval
- XSS
- CSRF (cross site requst forgery)
- session fixation
- такую уязвимость: https://habr.com/ru/post/124387/ и https://habr.com/ru/post/124898/
- уязвимости при загрузке файлов на сервер
- раскрытие информации (путей к файлам, параметров конфигурации итд)
- как безопасно хранить пароли
- как безопасно сделать авторизацию и проверку прав доступа
- same-origin policy в браузерах, CORS (cross-origin resource sharing)
Я не знаю, единственный способ наверно изучить существующие популярные уязвимости и не допускать их. Ну и писать код так, чтобы в нем были нужные проверки данных, для каждого вида данных определять допустимые значения и фильтровать/валидировать. При подстановке данных (в SQL-запрос, в HTML-код, в URL) экранировать нужной функцией. При использовании потенциально опасных функций (запуск внешней программы, прием файла от пользователя) проверять все особо тщательно.
> Мне уже приходилось использовать strip-tags() для того, чтобы очистить текст от html-тэгов, и вроде как она фильтрует также PHP, но мне не очень ясно, как именно это помогает в безопасности.
Читай мой урок по XSS, там объясняется.
> Верно ли я понимаю, что о безопасности впору думать всякий раз, когда на сайте есть какие-либо формы для ввода/работает GET или POST параметр?
Не только. От пользователя приходят еще и другие данные:
- файлы при загрузке файлов (что, если он загрузит к тебе php-файл с кодом?)
- HTTP-заголовки в $_SERVER
- куки в $_COOKIE
Также, уязвимость может возникнуть при взятии данных из БД, которые ранее туда положил пользователь, а ты не проверил тщательно.
> Нужно ли вообще прогонять информацию, получаемую через $_POST через несколько фильтров (для того, чтобы защититься от разных атак)?
Нет. Нужно не наугад применять фильтры, а подумать, какие правила действуют для тех или иных данных, и проверять их на соответствие этим правилам. То есть не делать ничего наугад, а делать все осознанно с полным пониманием принципа работы каждой функции.
Код у тебя плохой. Данные удобнее подставлять с помощью подготовленных запросов и плейсхолдеров.
Косые кавычки нужны, если имя поля или таблицы является зарезервированным словом (вроде SELECT или INT) в языке SQL. Официальный мануал, попробуй прочесть: https://dev.mysql.com/doc/refman/8.0/en/identifiers.html
Если есть еще вопросы, задавай, только сначала прочитай мои уроки по ссылке выше.
Начни отсюда: https://github.com/codedokode/pasta/tree/master/security
Изучи каждую уязвимость, можешь даже сам сделать страницу с ней и сам взломать. Только не "проверяй" чужие сайты, это может быть незаконно.
Если хочешь учиться далее, смотри OWASP top 10 - 10 самых популярных уязвимостей: https://www.owasp.org/images/7/72/OWASP_Top_10-2017_(en).pdf.pdf
Увы, там пояснения не очень простые и не очень понятные. Так что ты можешь по каждой уязвимости гуглить информацию дополнительно. Вот например презентация про SQL инъекции: https://www.ptsecurity.com/upload/corporate/ru-ru/analytics/PT-devteev-Advanced-SQL-Injection.pdf
Далее, есть сайт с каталогом всех известных уязвимостей (не только на сайтах, а вообще в любых программах), для каждой уязвимости делается описание и присваивается номер. Вот обзор уязвимостей: https://www.cvedetails.com/vulnerabilities-by-types.php
Вот список уязвимостей по вордпрессу: https://www.cvedetails.com/product/4096/Wordpress-Wordpress.html?vendor_id=2337
Вот пример одной из них (SQL инъекция в плагине): https://www.cvedetails.com/cve/CVE-2011-5216/
Вот изменения, которые ее исправляют, и по ним можно попробовать понять, в чем она заключалась: https://plugins.trac.wordpress.org/changeset/435356/scormcloud
Можешь порыться, хотя там сложно будет разобраться.
По идее тебе надо искать курс по теме "безопасность веб-приложений"/"уязвимости веб-приложений". Попробуй набрать это в Гугле и изучить первые 10 страниц выдачи, вдруг что найдется.
> Видов атак, я так понял, существует немалое количество. Как от всех них защищаться и в каких случаях нужно применять те или иные функции?
Если выучить топ 10 уязвимостей, то этого хватит в большинстве случаев. Как минимум, надо знать наизусть:
- SQL инъекции
- инъекции в eval
- XSS
- CSRF (cross site requst forgery)
- session fixation
- такую уязвимость: https://habr.com/ru/post/124387/ и https://habr.com/ru/post/124898/
- уязвимости при загрузке файлов на сервер
- раскрытие информации (путей к файлам, параметров конфигурации итд)
- как безопасно хранить пароли
- как безопасно сделать авторизацию и проверку прав доступа
- same-origin policy в браузерах, CORS (cross-origin resource sharing)
Я не знаю, единственный способ наверно изучить существующие популярные уязвимости и не допускать их. Ну и писать код так, чтобы в нем были нужные проверки данных, для каждого вида данных определять допустимые значения и фильтровать/валидировать. При подстановке данных (в SQL-запрос, в HTML-код, в URL) экранировать нужной функцией. При использовании потенциально опасных функций (запуск внешней программы, прием файла от пользователя) проверять все особо тщательно.
> Мне уже приходилось использовать strip-tags() для того, чтобы очистить текст от html-тэгов, и вроде как она фильтрует также PHP, но мне не очень ясно, как именно это помогает в безопасности.
Читай мой урок по XSS, там объясняется.
> Верно ли я понимаю, что о безопасности впору думать всякий раз, когда на сайте есть какие-либо формы для ввода/работает GET или POST параметр?
Не только. От пользователя приходят еще и другие данные:
- файлы при загрузке файлов (что, если он загрузит к тебе php-файл с кодом?)
- HTTP-заголовки в $_SERVER
- куки в $_COOKIE
Также, уязвимость может возникнуть при взятии данных из БД, которые ранее туда положил пользователь, а ты не проверил тщательно.
> Нужно ли вообще прогонять информацию, получаемую через $_POST через несколько фильтров (для того, чтобы защититься от разных атак)?
Нет. Нужно не наугад применять фильтры, а подумать, какие правила действуют для тех или иных данных, и проверять их на соответствие этим правилам. То есть не делать ничего наугад, а делать все осознанно с полным пониманием принципа работы каждой функции.
Код у тебя плохой. Данные удобнее подставлять с помощью подготовленных запросов и плейсхолдеров.
Косые кавычки нужны, если имя поля или таблицы является зарезервированным словом (вроде SELECT или INT) в языке SQL. Официальный мануал, попробуй прочесть: https://dev.mysql.com/doc/refman/8.0/en/identifiers.html
Если есть еще вопросы, задавай, только сначала прочитай мои уроки по ссылке выше.
Только эти фреймворки можно использовать. Я вообще фреймворки не использовал, только-только начал изучать. А как эту задачу сделать я не представляю
почитай про API , потом ищи примеры реализации АПИ на ларавеле (наверно есть на ларакасте) , начинай делать и решай попутно проблемы.
Там фреймворк за тебя сам все сделает. Создаешь модельку, пишешь у ней rules с указанными требованиями, передаешь то что пришло в модель и дергаешь validate, оно тебе вернет bool, если там false, то getErrors кажется возвращает как раз массив вида поле=>ошибки
Стоит понимать, что yii2 уже порядочно пованивает. Лучше взять laravel, symphony либо какой-то из микрофреймворков, указанных выше.
Совсем новичкам я бы посоветовал Laravel, как самый простой и имеющий сразу в коробке всё, что понадобится, без необходимости надстраивать микрофреймворк какими-то внешними пакетами.
А накодить можно что угодно на чём угодно, это не показатель.
>Стоит понимать, что yii2 уже порядочно пованивает
для типовых средних задач как RAD фрейм ему до сих пор нет равных , его минус это монолитность , но и тут это не особо важно
>Лучше взять laravel, symphony
с 4 симфой возможно , лажа для такой типовой задачи точно мимо когда есть спец люмен который не требует доп настроек
>Cовсем новичкам я бы посоветовал Laravel, как самый простой и имеющий сразу в коробке всё
всё в коробке есть у любого фрейма , но лара вместе с лара кастом делают кодера инвалида ибо джуны учат джунов что не круто , лару можно брать при сильном контроле синьёра (толкового) , симфа по выгоднее как с её философией так и стем кол вом ООП и ДДД пропагандой которую она несёт, порог выше да , но и профита больше по итогу.
после полу года работы на ларе так и не понял на что дроч на неё даже по сравнению с тем же yii.
>В такой ситуации стоит выписать возможные варианты, их плюсы и минусы, и выбрать оптимальный в данной ситуации. Например, рассмотрим хранение размера в БД:
Спасибо что ответил, опчик.
Аноны, кому не впадлу. Я вывел видео/аудио тегом <video>. Но, как я понял, данный способ сейчас не используют. Может у кого есть в закладках хороший гайд по этой теме?
Вчера когда искал инфу - выдавало iframe и еще что то. Нашел только что в бутстрапе есть класс 'video-fluid', которого на деле не было (долго тупил, в итоге понял что он просто не прописан. прописал сам). В общем сложилось такое впечатление по вчерашнему опыту гугла.
Мне стыдно даже как то просить скинуть ссылку на что-то, ведь я и сам могу уделить время и поискать. Только встал сегодня - убунту не запускается моя,час назад переустановил полностью, сижу среду настраиваю. Вот и спросил, может у кого под рукой хороший гайд по этой теме.
Но судя по тому что ты спросил - мои догадки ошибочны.Только сейчас вспомнил, что читал вчера, мол эти плееры встроенные в браузеры можно джава скриптом как то менять/настраивать.
для каких целей ?
есть https://www.adminer.org
в пхпшторме есть модель довольно удобный
я ещё использовал https://www.heidisql.com тоже довольно удобный
*модуль
> Нашел только что в бутстрапе есть класс video-fluid
А этот класс есть в документации? https://getbootstrap.com/docs/4.3/getting-started/introduction/ Если нет, то ты скорее всего что-то напутал.
>>73073
У тебя неверная информация, HTML5 audio/video сейчас как раз используют. Но там есть одна проблема: аудио и видио бывает разных форматов (есть разные форматы файлов-контейнеров, аудио/видеокодеков, разные профили этих кодеков) и разные браузеры поддерживают разные форматы. Более того, поддержка формата в одном и том же браузере может быть разной в разных ОС.
Вот информация: https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats
Если ты хочешь, чтобы видео/аудио работало в максимальном числе браузеров, то надо выбрать несколько наиболее поддерживаемых форматов и конвертировать медиафайл в них (например, с помощью ffmpeg).
> убунту не запускается
Если ты сидишь под рутом, то отвыкай и сиди под обычным пользователем, так как иначе очень легко что-то сломать.
Я хочу попасть в какое нибудь комюнити или заиметь своих сподвижников. Что я имею введу: Я хотел бы вести какой нибудь опенсорсный проект, не запарно и с другими людьми (пусть это будет пакет для Фреймворка или что то в этом роде). Какой профит я с этого поимею:
1. Будет проект которым можно баловать свое самолюбие
2. Смотря на код других я смогу подчерпнуть что то для себя
3. Даже когда мне будет лень что то делать или же не будет времени - проект будет развиваться так как есть другие люди и не будет демотивации по принципу: Сколько еще надо сделать и где на все это времени найти.
И так вопрос как мне в это влиться, у меня есть выложены а гите пакеты и некоторые пошарены в композер, есть плагины для редактора которыми я и сам пользуюсь но у них мало звезд и мало скачиваний. Я считаю просто потому что они никому не известны (ну да может конечно нахрен никому не сдались но надеюсь что нет).
Пс не хочу пулреквестить в сами фреймворки так как это капля в море и сосем не тешит мое тщеславие.
у laravel более чистая архитектура, больше экосистема и аудитория и он не застрял в 2009.
Мне приходилось поддерживать проекты на yii, и это ад. Ни тебе нормального слоя конфигурации, ни тебе нормального контейнера, ничего. Всё какое-то самописное, на магии и сайд эффектах. Фу-фу-фу.
Сранивать с тем же laravel смысла нет вообще, настолько в yii всё убого.
Спасибо, переделал
Давай разделим вопрос на две части: про известность и про коммьюнити. Чтобы повысить известность, надо о себе рассказывать и себя рекламировать. Это можно делать несколькими способами:
- искать всякие обзоры вроде "топ 100 плагинов для редактора X" и писать их авторам, что ты написал такой-то плагин и может быть, они добавят его в текущий или в следующий обзор. На Хабре выходят дайджесты вроде "события из мира PHP", можно написать их авторам.
- если это плагин к редактору, то у него наверно есть какой-то официальный или неофициальный каталог/рейтинг плагинов или что-то такое, надо посмотреть, как добавиться туда
- делать хорошие описания и ставить теги в описании пакета, чтобы он выдавался в поиске по ключевым словам. Посмотри, какие описания стоят у аналогичных пакетов.
- можно попробовать написать статью на Хабр о своем проекте. Но там по моему есть ограничения на пиар, потому вместо "посмотрите, какой я хороший написал плагин" можно сделать статью "как писать плагины к редактору на примере X"
- можно написать статью в своем блоге и запостить на Hacker News, но не факт, что она там надолго задержится
- можно искать вопросы на сайтах вроде SO, где люди спрашивают как что-то сделать, и рекомендовать свой плагин, но опять же, соблюдая их правила и раскрывая, что ты являешься его автором
Если ты себя пиаришь, и твой проект полезен людям, то информация о нем будет распространяться далее. Если не очень интересен, то даже активный пиар не поможет. И учти, что это происходит не быстро.
Теперь о контрибуторах. С этим будет сложнее. В опен сурсе люди обычно делают что-то, только если это им самим очень нужно. Часто из 100 человек 99 только пользуются и 1, может быть, что-то вложит в проект. Потому тут опять же все завязывается на известность, чем больше будет пользователей, тем охотнее они будут контрибутить.
> Пс не хочу пулреквестить в сами фреймворки так как это капля в море и сосем не тешит мое тщеславие.
Ну вообще, в этом есть смысл. Представь, что ты обнаружил какой-то баг или неудобный момент при разработке. Ты, конечно, можешь сделать исправление и держать его при себе, но тогда тебе придется самому же его поддерживать. Выгоднее было бы отдать исправление авторам фреймворка.
То есть нужно делать то, что тебе самому нужно, а не кому-то другому. Тогда про тщеславие вспоминать не придется.
>>73878
str_split не работает с русскими буквами, читай урок https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md
Давай разделим вопрос на две части: про известность и про коммьюнити. Чтобы повысить известность, надо о себе рассказывать и себя рекламировать. Это можно делать несколькими способами:
- искать всякие обзоры вроде "топ 100 плагинов для редактора X" и писать их авторам, что ты написал такой-то плагин и может быть, они добавят его в текущий или в следующий обзор. На Хабре выходят дайджесты вроде "события из мира PHP", можно написать их авторам.
- если это плагин к редактору, то у него наверно есть какой-то официальный или неофициальный каталог/рейтинг плагинов или что-то такое, надо посмотреть, как добавиться туда
- делать хорошие описания и ставить теги в описании пакета, чтобы он выдавался в поиске по ключевым словам. Посмотри, какие описания стоят у аналогичных пакетов.
- можно попробовать написать статью на Хабр о своем проекте. Но там по моему есть ограничения на пиар, потому вместо "посмотрите, какой я хороший написал плагин" можно сделать статью "как писать плагины к редактору на примере X"
- можно написать статью в своем блоге и запостить на Hacker News, но не факт, что она там надолго задержится
- можно искать вопросы на сайтах вроде SO, где люди спрашивают как что-то сделать, и рекомендовать свой плагин, но опять же, соблюдая их правила и раскрывая, что ты являешься его автором
Если ты себя пиаришь, и твой проект полезен людям, то информация о нем будет распространяться далее. Если не очень интересен, то даже активный пиар не поможет. И учти, что это происходит не быстро.
Теперь о контрибуторах. С этим будет сложнее. В опен сурсе люди обычно делают что-то, только если это им самим очень нужно. Часто из 100 человек 99 только пользуются и 1, может быть, что-то вложит в проект. Потому тут опять же все завязывается на известность, чем больше будет пользователей, тем охотнее они будут контрибутить.
> Пс не хочу пулреквестить в сами фреймворки так как это капля в море и сосем не тешит мое тщеславие.
Ну вообще, в этом есть смысл. Представь, что ты обнаружил какой-то баг или неудобный момент при разработке. Ты, конечно, можешь сделать исправление и держать его при себе, но тогда тебе придется самому же его поддерживать. Выгоднее было бы отдать исправление авторам фреймворка.
То есть нужно делать то, что тебе самому нужно, а не кому-то другому. Тогда про тщеславие вспоминать не придется.
>>73878
str_split не работает с русскими буквами, читай урок https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md
Значит все упирается в раскрутку.
>Ну вообще, в этом есть смысл
Я плохо объяснил мне. не проблема создать иссуе если я нашел баг, но меня так прельщают что мне дают на столько проработанный агрегат и я им пользуюсь что я не хочу соглашаться по чужим проблемам и пулреквестить на их основе. Это омрачит мое впечатление
ПАСЫБА УЧИТЕЛ
Обязательно: знание PHP на уровне, ответственность и максимум свободного времени. Больше навыков - только лучше.
Telegram для связи со мной: @no_snakes_alive
for comment in comments
то выводятся только элементы верхнего уровня. Можно ли через синтаксис шаблонизатора сказать "выводи, пожалуйста, еще и все что вложено, а еще и вложенное во вложенном"?
Или просто взять и убрать многомерность у исходного массива комментариев, сделать все элементы одноуровневыми, просто детей под родителем ставить, и так выводить? Как по умному делается?
ситуация такая - вынес код регистрации в отдельный файл, прикрутил туда php с записью в БД, и этот файл надо через include вставить в основную страницу, но include возвращает сам файл и еще 1, как успешное подключение, так вот, как правильно его подключить чтобы include не вернул единицу?
Спасибо, аноны, всем кто откликнулся. Сделол через макросы
у них разница лишь в том что require вернет фатальную ошибку , если не сможет найти нужный файл, а так при успешном выполнении тоже вернет единицу
по идее там должна быть функция которая будет что то возвращать, тогда единица пропадет, но я не знаю как мой код обернуть в функцию и что она должна возвращать, если я просто делаю запись в БД
пытался найти готовый проект в инете чтобы посмотреть как там чего люди делают на практике, в итоге хуй, либо плати либо перди
Я тоже нуб, посмотрел и что то не врубаюсь что ты сделать хочешь. Что должно выводиться то?
Зачем что то искать, когда у тебя в шапке огромное кол-во гайдов и заданий с ответами на подводными и прочим.
должна выводиться форма регистрации , но вместе с ней выводится цифра 1 - TRUE как результат спешного подключения файла, 3 скрин смотри
Делается же это через точку? Или как то иначе? Типа:
echo $hui . $zalupa . $nigger . functioname();
единица говорит сколько символов взять, напиши там 2 и ответ будет
$number = 123456 67890;
echo $number."\n";
echo substr($number, -3, 2);
// Вернет 8381427840 84
$number = 123456 67890;
echo $number."\n";
echo substr($number, -3, 1);
// Вернет 8381427840 8
Спасибо. Почему-то не подумал самостоятельно проверить.
А вообще, в таких непонятных для тебя ситуаций, советую обращаться к php.net, а именно поиску на нем. Пишешь например "substr" и смотришь аргументы =)
>что чтобы использовать переменные вне функции в самой функции
Хуй проссышь что вы хотите
>$hui . $zalupa . $nigger
Это переменные функции?
Тебя никто и не заставляет решать какие-то чужие проблемы. Ты можешь делать только то, что тебе самому интересно.
>>74426
Есть 2 варианта:
- выбирать данные одним плоским списком (или сортировать после выборки) так, чтобы они шли в нужном порядке. Тогда мы просто выводим список циклом, добавляя отступы слева в соответствие с глубиной вложенности.
- сгруппировать данные в виде дерева, то есть чтобы дочерние комментарии были вложены внутрь родительских, и выводить с помощью рекурсивного макроса (который вызывает сам себя для вывода вложенных комментариев).
Первый вариант скорее всего будет проще и удобнее, и верстка будет тоже проще.
Также, может быть тебе поможет информация про хранение древовидных данных в БД (может пригодиться, чтобы продемонстрирвоать знания на собеседовании): https://github.com/codedokode/pasta/blob/master/db/trees.md
>>74457
Для начала, надо исправить уязвимости в твоем коде - SQL-инъекцию при выполнении запроса INSERT, почитай урок https://github.com/codedokode/pasta/blob/master/security/sql-injection.md
Плохо, что учебник, по которому ты учишься, об этом не расказал.
> но include возвращает сам файл и еще 1, как успешное подключение
А зачем ты выводишь то, что вернет include? Не выводи результат.
Также, возможно тебе еще пригодится урок по работе с формами: https://github.com/codedokode/pasta/blob/master/forms.md
Можно взять урок "делаем сайт на CMS/фреймворке" и повторить то, что там делается, и ты получишь готовый проект.
>>74548
Это описано в мануале по substr: https://www.php.net/manual/ru/function.substr.php
Также, substr не работает с кирилицей, вот урок по теме: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md
>>74559
По умолчанию в функции "не видны" созданные снаружи (глобальные) переменные. Надо передавать эти переменные в функцию через аргументы явно.
Как это делать, описано в мануале https://www.php.net/manual/ru/functions.arguments.php (хотя и не очень понятно описано).
>>75026
Есть куча статей про собеседования, с наборами вопросов и задач, погугли.
Там есть 2 файла: composer.json - в нем указываются примерные версии зависимостей, он создается руками, и composer.lock - в нем указаны точные версии установленных зависимостей, он создается композером автоматически, обновляется с помощью update.
composer install устанавливает точные версии зависимостей, которые прописаны в composer.lock (если его нет, install работает как update). То есть ты ставишь проверенные кем-то из коллег версии библиотек.
composer update обновляет зависимости, то есть берет composer.json, находит самые новые версии зависимостей, соответствующие условиям, ставит их и прописывает их в composer.lock. После этого необходимо тщательно все протестировать, так как в новых версиях могут быть какие-то баги или особенности.
>>69343
Это идея уровня битрикса. Посмотри пример кода:
class X
{
public function test()
{
$this->evm->on('event', function () {
$this->...
});
}
}
Здесь интуитивно ожидается, что $this указывает на объект X, а ты хочешь его поменять на что-то другое. Как тогда обращаться к полям и методам X? Не нужно проявлять тут оригинальность и придумывать нестандартные подходы. Не трогай $this и не подменяй его.
Лучше, как ниже посоветовали, передавать нужный объект через аргументы.
Этот "обработчик" выполняет роль контроллера. Если там много кода, то ты можешь сделать отдельный класс-контроллер и указать его как обработчик.
>>69284
Надо делать, как ты описал. Также, можно для вариантов завести константы, например: USER_ANONYMOUS или USER_REGISTERED.
>>68575
Браузер отправляет на сервер абсолютные URL. Если ты пишешь в HTML-коде src="../1.jpg", то браузер сначала преобразует его в абсолютный URL http://exmaple.com/images/1.jpg, и его отправляет на сервер. Апач этих двоеточий (?) не видит.
У меня есть урок по относительным URL: https://github.com/codedokode/pasta/blob/master/network/urls.md
В RewriteRule ты указываешь путь как URL, относительно DocumentRoot. Если у тебя DocumentRoot это папка /var/www/public, то твой RewriteRule ... /public/$1 добавляет второе слово "public" к ней.
Чтобы понять, как работают RewriteRule, я бы советовал:
- почитать статью https://habr.com/ru/company/sprinthost/blog/129560/
- включить режим отладки mod_rewrite директивой LogLevel warn rewrite:trace4 (взял ее из статьи https://habr.com/ru/post/264395/ ) и в логи будет писаться каждое преобразование URL.
> Я не очень понимаю что есть корень сайта для браузера в моем случае?
Корень это то, что указано в DocumentRoot. То есть при обращении к http://example.com/index.php Апач будет искать index.php в корне сайта. Апач берет путь из URL, дописывает его к DocumentRoot и по получившемуся пути ищет файл (в случае наличия mod_rewrite он сначала применяет к этому пути описанные в конфиге правила).
> Корень для браузера это $_SERVER['DOCUMENT_ROOT']
Браузер ничего не знает о настройках сервера и папках на нем. Он просто отправляет на сервер URL, а как его интерпретировать, зависит от сервера.
Я бы тебе советовал поставить DocumentRoot, чтобы он указывал на public, это надежнее и удобнее, чем возиться с mod_rewrite.
Этот "обработчик" выполняет роль контроллера. Если там много кода, то ты можешь сделать отдельный класс-контроллер и указать его как обработчик.
>>69284
Надо делать, как ты описал. Также, можно для вариантов завести константы, например: USER_ANONYMOUS или USER_REGISTERED.
>>68575
Браузер отправляет на сервер абсолютные URL. Если ты пишешь в HTML-коде src="../1.jpg", то браузер сначала преобразует его в абсолютный URL http://exmaple.com/images/1.jpg, и его отправляет на сервер. Апач этих двоеточий (?) не видит.
У меня есть урок по относительным URL: https://github.com/codedokode/pasta/blob/master/network/urls.md
В RewriteRule ты указываешь путь как URL, относительно DocumentRoot. Если у тебя DocumentRoot это папка /var/www/public, то твой RewriteRule ... /public/$1 добавляет второе слово "public" к ней.
Чтобы понять, как работают RewriteRule, я бы советовал:
- почитать статью https://habr.com/ru/company/sprinthost/blog/129560/
- включить режим отладки mod_rewrite директивой LogLevel warn rewrite:trace4 (взял ее из статьи https://habr.com/ru/post/264395/ ) и в логи будет писаться каждое преобразование URL.
> Я не очень понимаю что есть корень сайта для браузера в моем случае?
Корень это то, что указано в DocumentRoot. То есть при обращении к http://example.com/index.php Апач будет искать index.php в корне сайта. Апач берет путь из URL, дописывает его к DocumentRoot и по получившемуся пути ищет файл (в случае наличия mod_rewrite он сначала применяет к этому пути описанные в конфиге правила).
> Корень для браузера это $_SERVER['DOCUMENT_ROOT']
Браузер ничего не знает о настройках сервера и папках на нем. Он просто отправляет на сервер URL, а как его интерпретировать, зависит от сервера.
Я бы тебе советовал поставить DocumentRoot, чтобы он указывал на public, это надежнее и удобнее, чем возиться с mod_rewrite.
При использовании композера достаточно подключить 'vendor/autoload.php'. И делать это надо не в коде библиотеки, а в своем скрипте, который будет ее вызывать. Также, я думаю, что саму библиотеку тоже надо было установить через композер, а не скачивать руками.
В общем, почитай какие-нибудь руководства по композеру.
>>66573
Мапы и сеты очень полезны. Ну например, если тебе нужно взять только уникальные слова из массива, убрать повторяющиеся - сет как раз и пригодится.
>>65547
> ну вот кстати дисскасс имеет ли сейчас смысл писать в описании тип если ты его уже указал в самой функции?
Не имеет смысла, если это не несет никакой новой информации.
Я еще использую плагин для переименования файлов (так как я могу придумать класс с одним названием, а через полчаса решить, что у него должно быть другое название). Плагин, по моему, называется Rename File или как-то так. Вызываю через панель команд (Ctrl + Shift + P, затем fr, Enter).
>>62411
В данном случае список отчетов имеет смысл захардкодить в коде (а где еще?). Под каждый отчет сделать функцию либо класс.
Если я кого-то пропустил, можно напомнить о себе в новом треде.
Я постараюсь позже проверить гитхабы с задачками про студентов и фалообменник.
>Это идея уровня битрикса
Так-то и вордпресса, да и на фреймворках такое встречается. Не говоря о ноде.
Вполне себе норм идея - стоит поковырять.
ну, тип, есть переменные:
$pisechka
$huek
я хочу использовать писечку и хуёк в функции, это делается так?:
function functioname($pisechka, $huek) {}
?
Или я должен писечку и хуёк глобальными функциями для этого делать? Или я должен непосредственно в функции создавать писечку и хуёк? А если я хочу переменную, созданную вне функции, использовать в функции?
Если тебе нужны только их значения - да. Если хочешь их менять (я нуб и с этим не сталкивался), то вроде как можно передать ссылку на переменную
А вообще открой книжку какую нибудь, там все расписано. Или гайды ОПа, или гугл/ютюб
Дополню свой список:
Для документации можно еще взять DoxDoxygen он не может в нуловые переменные но зато вытаскивает эксепщены. А DocBlockr не может в типы возвращаемые методами.
LSP аводополнение по методам классов, описания к параметрам методов. Но мне что то не очень понравилось.
>>75083
SidebarEnhancements тоже может в переименование
А в чем профит пхп шторма? Есть смысл перейти на него с саблайм?
На сайте должна быть строка по которой можно найти человека и если есть совпадения, то должны передаваться его id, first_name т.д. ?
>На сайте должна быть строка по которой можно найти человека и если есть совпадения, то должны передаваться его id, first_name т.д. ?
Похоже на то, а вообще перекат был
>>76139
>На уровне php
junior/middle/senior?
Не думай что я доебался или еще чего, просто с того что ты написал не особо ясно кого ты ищешь. То ли джуна, то ли мидла.
бамп
Надо $ перед каждой переменной ставить
Под каждую задачу свой инструмент. Если тебе нужен сайт, или не овердохуя (а даже и если овердохуя) нагруженное веб-приложение, то PHP вполне подойдёт.
Банальнейшая связка nginx + phpfpm + php7 + *sql будет давать тебе достаточно производительности и возможностей для горизонтального масштабирования, пока у тебя натурально не появятся миллионы активных пользователей и десятки тысяч RPS.
Большинство хейта на пыху идёт со старых времён, когда он действительно был не очень. Сейчас же пыха очень быстрая (а скоро ещё и JIT подвезут), поддерживает строгую типизацию и в её экосистеме много очень качественныз решений. Субъективно, тот же питон она делает по всем фронтам.
Ну и, опять же субъективно, у PHP очень большой рынок, целая куча бизнес-решений было написано и пишутся на нём и приносят своим создателям нехилые деньги (мой босс недавно всех нас в Европу на корпоратив за свой счёт свозил, лол). Так что он вряд ли умрёт в ближайшие десятилетия.
Из объективного - анальная огороженность вебом. Если заебет - для переката придется становиться ждуняшкой и учить новый стек почти с нуля. Почти все прочие популярные языки, используемые в вебе, такой проблемы не имеют.
Второй объективный минус - вероятность найти хорошую контору со всеми соцплюшками и прочим стремится к нулю. Даже скайенг, который сидит на симфони, оформляет договор предоставления услуг.
Бред язык должен быть под что то если язык подо все то он уже будет иметь просадки в сферах. Это так же как с приложениями и сайтами - да они могут быть адаптивными и что то мочь и там и там но на порядок удобнее им пользоваться когда они разработаны индивидуально.
Ога, а потом получаем тонну сбегателей с пхп, бегущих куда глаза глядят (включая полный съеб из профессии), потому что развития нет, проекты однотипные, конторы - сплошные рога и копыта.
поэтому в дополнение к пхп щас надо учить как минимум гошу, и фронт знать, чтобы быть фулл-стак
>у PHP очень большой рынок
Работу на пхп ты найдешь без проблем, но вот вряд ли ты будешь ей доволен.
Это копия, сохраненная 27 сентября 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.