Вы видите копию треда, сохраненную 30 июля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
ОП довольно занят, но постарается ответить на все вопросы. Также, ответы и решения задач можно поискать в архиве тредов phpclub.
Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.
Предыдущий тред был тут: >>1998470 (OP) . Все старые треды есть в архиве: https://phpclub.tech/ (там есть поиск, можно искать решения и обсуждения задач).
С чего начать
Наши уроки по PHP собраны по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не запоминайте его, он временный). Это учебник для изучающих с нуля. Там есть задачи, их нужно решать. Но если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.
Если не знаешь как решать, запости код и попроси подсказку или поищи задачу в архиве тредов.
Ты прошел весь учебник? Молодец, но это были лишь основы языка 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
- Еще более сложная и долгая задача на Laravel/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony или Laravel
- Почитать про паттерны 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? Потому что вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а зайди на https://github.com/codedokode/phpbook, нажми зеленую кнопку Clone or Download -> Download ZIP, распакуй на рабочий стол и получи личную копию сайта, не требующую интернетов.
- Что надо знать чтобы найти работу - разработчику: 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, то там есть горячая клавиша для этого. Список клавиш для IDE: https://gist.github.com/codedokode/8759492
Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть рекомендации PSR-1 и PSR-12. Вот как надо оформлять код:
- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)
- ставим тайп-хинты на аргументы функций, результат функций и поля классов
Вот ссылка на рекомендации PSR, где все это описано подробнее и даны примеры оформления:
PSR-1 (рус.): https://svyatoslav.biz/misc/psr_translation/#_PSR-1
PSR-12 (англ.): https://www.php-fig.org/psr/psr-12/
А чего у вас в шапке так тухло с книгами?
Наверняка уже кучу годноты завезли под новые версии пыхи, а у вас только Зандстра 2009 года выпуска
>Но дальше ты заметишь, что ты делаешь в начале каждого файла одни и те же действия
+.
Из-за этого и появилась мысль сделать одним файлом.
>микрофреймворк вроде Slim.
Гляну.
Нид хелп
На вп натягиваю вёрстку бутстрепа, первое это результат, навбар вывожу через wp_nav_menu, всё отлично но вот проблема в дропдавн меню, я не знаю как задать классы для li и ul внутри дропдавна. Видел что на пхп можно заменять нужные аттрибуты и классы, но они вроде заменяются везде, а мне нужно что бы только в дропе были особенные. Кто может подсказать чем путним, как лучше сделать
Добавляешь колонку с датой записи.
Потом по крону апдейтишь как-то так
UPDATE hui SET amount = amount * 0.2, added = NULL WHERE added IS NOT NULL AND DATEDIFF(NOW(), added) >= 7;
Можно придумать какие-то анальные костыли, но нормально делается на кроне.
Например в ларе есть свой шедалер, но это калька с крона и крон там используется как точка входа.
Виндузятникам не привыкать, фигли делов-то
у меня домашняя винда,а не Профессиональная или Корпоративная с юбилейным обновлением (версия 1607) или более поздней версии.
Кнопки там ниче такие
>>063146
Ну смотрите, ввожу в поиске "php mysq(любой другой язык) простой сайт\проект" и получаю видосы по полчаса-час где сразу на практике могу сделать что-то и заебенить на гитхаб, и он не пустой и рука набита, плюс экспириенс как применить знания на практике. В книжках тебе сто страниц будут просто ебать мозг копипастой.
Я бы на твоем месте не вкатывался в айти. А то хуй отвалится
>ввожу в поиске "php mysq(любой другой язык) простой сайт\проект"
Первое видео - ускоренное видео как чел пишет код с комментариями уровня: вот тут делаем это, а там вот то. Почему, зачем, что делаем и куда двигаемся - не понять
https://www.youtube.com/watch?v=3UtB4QS6EAg
Долбоеб пишет спагетти с инъекциями.
Заебись годнота.
В HTML некоторые символы имеют специальное значение. Например, символы < и > используются для открытия/закрытия тегов, символы " и ' используются в атрибутах, а символ & используется для кодирования символов, которых нет на клавиатуре, вроде & copy; (символ ©).
Соответственно, если ты выведешь echo "<b>", то это будет воспринято браузером как тег b.
Но что, если ты хочешь просто вывести текст, как есть, чтобы спецсимвол вроде < не начинал бы новый тег, а просто выводился бы как угловая скобка? Для этого тебе надо в тексте заменить спецсимволы на HTML-сущности:
< - на & lt;
> - на & gt;
& - на & amp;
" и ' на & quot; и & #039;
Функция htmlspecialchars этим и занимается.
Всегда, когда ты выводишь какой-то текст в HTML-документ, надо применять эту функцию. Если этого не делать, то можно получить уязвимость XSS, как она работает, описано тут: https://github.com/codedokode/pasta/blob/master/security/xss.md
Вообще, это относится не только к HTML. Если ты подставляешь текст в ссылку, ты должен экранировать спецсимволы (но не с помощью htmlspecialchars, а с помощью urlencode), если ты подставляешь переменную в SQL-запрос, ты тоже должен экранировать спецсимволы и так далее.
Под WIndows тоже есть планировщик задач, и можно сделать, чтобы твой php скрипт запускался в определенное время. Только не забудь настроить, чтобы он запускался из-под нужного пользователя.
Хотя Windows, конечно, не лучший выбор для такой задачи. Ну например, если твой компьютер будет выключен в момент, когда должен запуститься скрипт, то естественно, ничего не запустится.
>>063004
Докер это корявое решение. В винде есть свой планировщик задач.
Если в видео объясняется теория, а не просто показывается как писать код, то конечно, имеет смысл его посмотреть.
Но я сомневаюсь, что за полчаса-час можно рассказать основы языка, ООП, архитектуры для начинающего. Следовательно, из такого видео ты научишься только переписывать код с экрана, и какая польза от этого "умения", я не понимаю. Не проще ли сразу скопировать код с гитхаба, и не тратить время?
>>063354
Должен запуститься сам.
Двачую, книги и документация наше всё
А есть адекватный аналог?
Head first design patterns - книга старая, но очень годная и написанная очень простым языком. Примеры там на джаве, но это не мешает. Классика жанра "Приемы объектно-ориентированного проектирования" от банды четырех. Ну и Зандстра "Объекты, шаблоны и методики программирования"
Еще можешь читануть https://designpatternsphp.readthedocs.io/en/latest/README.html
>Ну и Зандстра "Объекты, шаблоны и методики программирования"
Бля пыхыписты, у вас за 10 лет реально что ли другой книги не вышло? Какого хрена вы советуете всегда один и тот же протухший антиквариат?
мимо
Насколько вообще реально за год выучить php и вкатиться джуниором? А то я слушаю и все вокруг говорят о том что джуниоров даже за еду работать уже не берут так как программистов такая куча что без опыта работы они нахуй не нужны никому стали.
Там же дохуя обновлений вышло, буквально недавно видел под 8 спиздили переиздание.
Как повезет, я пришел вообще нихуя не зная, написав разве что кривой калькулятор, который мне итт обосрали. На собесе честно сказал что хочу и готов учиться и внезапно прокатило. А первое же задание мне дали писать на луа, а не пыхе, тут то я и охуел
Да, пилю простенькие серваки для мобильных казуалок и подумываю наконец свалить куда-нибудь, но я тот еще аутист, так что дико стремаюсь собесов.
>Докер это корявое решение. В винде есть свой планировщик задач.
Почему?
Какова вероятность, что php проект будет на продакшене на windows сервере крутиться?
Имеет же смысл осваивать то, что встретишь на работе
Все в телегу ушли
>Насколько вообще реально за год выучить php и вкатиться джуниором?
Год даже много. Бери пол года
И хули? Head first design patterns вообще 2004 года, но для новичков ничего лучше до сих пор нет
Если по 6-8 часов хуярить можно и за месяца три спокойно, но обычно ещё фреймворки и бд нужно знать
Так вся суть пыхи в бд и фреймворках. Голая пыха мало кому нужна.
И что там можно 3 месяца в голой пыхе фултайм херачить?
С нуля учебник ОПа, а потом ООП, разбирать шаблоны ООП. Ну, и помимо этого основы хтмл, цсс и жабаскрипта.
Вакансии смотрю, да.
У меня нет столько времени, работа сама себя не работает к сожалению, так что в будние дни максимум часа 2-3 смогу выделять в лучшем случае, поэтому и спросил про год.
А, ну тогда да, год понадобится, но это все равно маловато да и усталость после работы влияет
Раньше все веб давалоперы были фулстеки, потом всё дохуя усложнилось и разделились на бек и фронт, но с пхп некоторая инерция осталась.
Ну можешь попробовать еще опенкарт посмотреть и битрикс. Правда с этой тройкой ты только на лапшу и сможешь расчитывать.
Регулярно вижу вакансии на битрикс с нормальными зарплатами. Если порог брезгливости не очень высокий, то можно и там зарабатывать
Битрикс так то довольно популярен так что не так уж мало людей на нем работает.
1) Если я хочу быть верстальщиком, фронт-жабаскриптером, реакт-макакеном. То что мне нужно знать об аутентификации, сессиях и jwt токенах? Процесс аутентификации полностью лежит на плечах бэкенда или мне как фронт-жабоскриптеру что-то надо ajax,fetch-запросами куда-то посылать для аутентификации?
Я читал на хабре про jwt-токенты, РНР сессии, но нихуя не понял
2) Что мне нужно знать об web-сокетах? Если я как верстак, фронт-жабаскриптер должен буду делать чат. То что мне нужно знать об web-сокетах?
Я тоже про них читал на learnjs, но нихуя не понял.
ОЧЕНЬ СИЛЬНО ПРОШУ ПРОЩЕНИЯ ЗА СВОЁ СУЩЕСТВОВАНИЕ! ПРИНОШУ ГЛУБОЧАЙШИЕ ИЗВИНЕНИЯ!
Хз как вкатиться в этот ваш битрикс. Я пробовал его установить и потестить, так там ведь просто тонны лапшекода, в котором по идее надо хорошо разбираться и решать возникающие проблемы.
Книг по нему нет, туториалов нет, документация на сайте полное гавно и т.д.
Короче вариант не для новичков, имхо
>джуниоров даже за еду работать уже не берут
Вообще да. Только куча не программистов, а таких вот вкатывальщиков. Требования к джунам выкатывают в зависимости от запрлаты - у одних будешь за 30к Попенкарт пердолить целыми днями, другие попросят фреймворк, докер, юнит-тесты и дадут со старта 80к.
Не слушай местных зазывал - пиздят либо ошибка выжившего.
Блядь, анон, ты ёбнутый совсем местных двачеров слушать? Они тебе такого насоветуют - охуеешь. Какие фреймворки, какие, в жопу, вебсокеты?
Любой веб начинается с вёрстки - что бекенд, что фронтенд. Фронтенду вообще особенно хорошо вёрстку знать надо.
Выглядит это так: статичная вёрстка + методы + инструменты, потом чистый жаваскрипт и немного динамики, потом уже фреймворки и тд. Куда ты полез вообще, тебя тупо затроллели, либо борщехлебы хейни понаписали из манямирка?
Суть в том, что поковырял вёрстку. Немножко жабаскрипт поковырял.
Но дальше я уже ничего не понимаю. Поэтому родились вопросы:
1) Что я должен знать как верстальщик в процесс аутентификации? Я должен что-то отправлять ajax-запросами? Или я ничего не должен и всё бэкенд сам сделает.
2) Что я должен знать как верстальщик, если придется делать чат. Что я должен делать с веб-сокетами?
>поковырял вёрстку
>жабаскрипт поковырял
>дальше я уже ничего не понимаю
Плохо поковырял значит и надо больше.
>Что я должен знать как верстальщик в процесс аутентификации?
>если придется делать чат
Очень странные вопросы. Если тебе это всё нужно только для чата, то проще будет нанять кого-то или купить готовый.
>Плохо поковырял значит и надо больше.
Это уже в бэке ковыряться надо. Я пытался, на w3schools основы РНР прошёл и SQL. Читал Мэтта Зандстру про РНР ООП, но дальше главы про абстрактные фабрики не осилил. Потом смотрел вводные видео про next.js. Читал на хабре джве статьи про jwt токены. Но нихуя не понял.
На двоще меня высмеяли, что я хватаюсь за всё подряд, хотя если я хочу быть верстальщиком, то мне надо концентрироваться только на хтмл, цсс, жс и жс-фреймворке.
>Очень странные вопросы.
|Они родились из того, что я читал в learnjs тему про веб-сокеты. Я всё подряд читаю из learnjs. И я не понял, что это за хуйня, и что я должен из этой темы знать как верстальщик.
>меня высмеяли, что я хватаюсь за всё подряд
Ну да. Ты по верхам пробежался просто и думаешь, что освоил что-то. В норме опыт считается только выполненными проектами - сперва говно из палок, потом всё лучше и лучше. Туториалы, книжки и статейки никто в серьёз не воспринимает и не будет - в одно ухо влетело, в другое вылетело.
>не понял, что это за хуйня, и что я должен из этой темы знать как верстальщик
Ничего. Верстальщик верстает статические страницы, его динамика почти не касается. Фронтенд разработчик это верстальщик + динамика на js. В вебсокеты не лезь пока - тебе ещё рано.
>Они родились из того, что я читал в learnjs тему про веб-сокеты
Тебе вообще туда лезть не нужно, раз хочешь верстку. Вообще всё, что касается бека не трогай
двачую адеквата
Это вариант для говноедов
За месяц синтаксис изучаешь, пробуешь сделать что-то связанное базой данных и идешь искать работу. Жопаскрипт освоишь уже на самой работе, хотя, перед тем как устроится, желательно уметь им пользоваться в плане написания функций и вывода ajax запросов. Это не сложно, учится буквально за вечер.
Я когда пхпшником устроился, то мне вообще дали говнокод ковырять на asp classic, смачно подохуел тогда.
Смотришь PHP за час От профессионала и идёшь раскидывать заявки на вакансии - ты ж теперь у мамы синьор. Сам язык уже на работе подтянешь.
Не утрируй. Я через месяц учебы работу на пхп нашел, говорю исключительно о своем опыте. Работа правда гавно, за 25к всего.
Так тебя обычным эникеем взяли фактически, но заставили код писать. Причём тут пхп?
Ну так сначала говно делал, постепенно стали давать проекты на yii допиливать. Чем не работа?
Вопрос был о том, КАК НАЙТИ РАБОТУ, а не о заработке. Я на него ответил. К чему доеб, не понимаю?
> НО МНЕ СКАЗАЛИ, ЧТО В 2К21 ГОДУ БОЛЬШЕ ВЕРСТАЛЬЩИКОВ НЕ СУЩЕСТВУЕТ
Это не совсем так. Речь о том, что нет спроса на верстальщиков, умеющих делать только HTML-верстку с CSS без JS. Обычно от верстальщика ожидают, что он реализует и JS-код. При этом JS-код может быть в форме простых скриптов на jQuery (при нажатии на кнопку, показать попап, отправить аякс-запрос), так и в форме приложения на фреймворке вроде React, Vue. То есть предпочтительнее быть не верстальщиком, а полноценным фронтенд-специалистом.
> То что мне нужно знать об аутентификации, сессиях и jwt токенах?
Тебе надо тщательно изучить, как работают куки. Это твоя зона ответственности.
Сессии работают полностью за счет бекенда. Форма логина отправляется на сервер, и в случае успеха, сервер выставляет куку (она содержит id сессии), которая подтверждает наличие авторизации. Эта кука шлется автоматически при любом запросе (то есть и при открытии страницы, и при аякс-запросах) и автоматически проверяется сервером. От фронтенда тут требуется разве что сверстать красивую форму логина.
Отличие JWT-токена от id сессии в том, что для проверки сессии бекенд должен искать (на диске, в редисе, в БД) идентификатор сессии и проверять его правильность. Если у тебя все хранится на одном сервере - проблем нет. Но если у тебя хайлоад и куча серверов, то тебе надо выделить какое-то центральное хранилище для сессий и на него будет сыпаться куча запросов от бекендов.
JWT-токен же содержит цифровую подпись и для его проверки бекенду не надо отправлять никаких запросов в хранилище, а достаточно проверить валидность подписи в токене. Теоретически, JWT-токен можно передавать в куках так же, как и идентификатор сессии, и тогда для фронтенда вообще ничего не меняется. Но часто используют такой паттерн, когда фронтенд шлет логин/пароль на определенный URL, получает JWT-токен и далее должен слать его вместе с каждым запросом явно (а также, в случае получения ответа, что токен устарел, перенаправлять пользователя на форму логина).
Иногда усложняют еще больше и используют OAuth. В случае OAuth, сторонний сайт может перенаправить пользователя на страницу авторизации и после нее получить токен, который даст доступ к данным пользователя. Тут, очевидно, куки уже не используются.
Зачем усложнять? Наверно, чтобы получить универсальное API, к которому можно обращаться не только из фронтенда сайта, но и с других проектов. Позволять другим проектам действовать от имени пользователей.
> Что мне нужно знать об web-сокетах?
Тебе сначала хорошо бы изучить не веб-сокеты, а классические сокеты Беркли. Понять, как вообще данные передаются в сети между машинами. После этого веб-сокеты, после этого прикладные протоколы вроде Autobahn.
> должен буду делать чат.
Ты должен быть не написателем чатов, у универсальным специалистом. Веб-сокеты обычно используются не для чатов, а для синхронизации состояния клиента с сервером (один менеджер взял в работу заказ, и у всех других менеджеров этот заказ исчез с экрана).
> НО МНЕ СКАЗАЛИ, ЧТО В 2К21 ГОДУ БОЛЬШЕ ВЕРСТАЛЬЩИКОВ НЕ СУЩЕСТВУЕТ
Это не совсем так. Речь о том, что нет спроса на верстальщиков, умеющих делать только HTML-верстку с CSS без JS. Обычно от верстальщика ожидают, что он реализует и JS-код. При этом JS-код может быть в форме простых скриптов на jQuery (при нажатии на кнопку, показать попап, отправить аякс-запрос), так и в форме приложения на фреймворке вроде React, Vue. То есть предпочтительнее быть не верстальщиком, а полноценным фронтенд-специалистом.
> То что мне нужно знать об аутентификации, сессиях и jwt токенах?
Тебе надо тщательно изучить, как работают куки. Это твоя зона ответственности.
Сессии работают полностью за счет бекенда. Форма логина отправляется на сервер, и в случае успеха, сервер выставляет куку (она содержит id сессии), которая подтверждает наличие авторизации. Эта кука шлется автоматически при любом запросе (то есть и при открытии страницы, и при аякс-запросах) и автоматически проверяется сервером. От фронтенда тут требуется разве что сверстать красивую форму логина.
Отличие JWT-токена от id сессии в том, что для проверки сессии бекенд должен искать (на диске, в редисе, в БД) идентификатор сессии и проверять его правильность. Если у тебя все хранится на одном сервере - проблем нет. Но если у тебя хайлоад и куча серверов, то тебе надо выделить какое-то центральное хранилище для сессий и на него будет сыпаться куча запросов от бекендов.
JWT-токен же содержит цифровую подпись и для его проверки бекенду не надо отправлять никаких запросов в хранилище, а достаточно проверить валидность подписи в токене. Теоретически, JWT-токен можно передавать в куках так же, как и идентификатор сессии, и тогда для фронтенда вообще ничего не меняется. Но часто используют такой паттерн, когда фронтенд шлет логин/пароль на определенный URL, получает JWT-токен и далее должен слать его вместе с каждым запросом явно (а также, в случае получения ответа, что токен устарел, перенаправлять пользователя на форму логина).
Иногда усложняют еще больше и используют OAuth. В случае OAuth, сторонний сайт может перенаправить пользователя на страницу авторизации и после нее получить токен, который даст доступ к данным пользователя. Тут, очевидно, куки уже не используются.
Зачем усложнять? Наверно, чтобы получить универсальное API, к которому можно обращаться не только из фронтенда сайта, но и с других проектов. Позволять другим проектам действовать от имени пользователей.
> Что мне нужно знать об web-сокетах?
Тебе сначала хорошо бы изучить не веб-сокеты, а классические сокеты Беркли. Понять, как вообще данные передаются в сети между машинами. После этого веб-сокеты, после этого прикладные протоколы вроде Autobahn.
> должен буду делать чат.
Ты должен быть не написателем чатов, у универсальным специалистом. Веб-сокеты обычно используются не для чатов, а для синхронизации состояния клиента с сервером (один менеджер взял в работу заказ, и у всех других менеджеров этот заказ исчез с экрана).
Работа на стройке не такая простая. Во-первых, там много тяжелых вещей, которые нужно поднимать и таскать. Во-вторых там много опасных вещей. В-третьих, работа зачастую идет на большой высоте без мер безопасности. В-четвертых, может быть холодно и дуть сильный ветер. В-пятых, часто смены очень длинные и можно устать.
С другой стороны, в строительстве крутятся огромные деньги. Посмотрите цены на квадратный метр. Обычному программисту такие деньги, конечно, никто не даст, а строительным компаниям люди из последних средств платят. Очень выгодный бизнес.
> Я всё подряд читаю из learnjs. И я не понял, что это за хуйня, и что я должен из этой темы знать как верстальщик.
Ты должен знать принцип работы, как отправлять и получать сообщения по веб-сокетам, как сериализовать данные (например: тебе надо отправить объект с кучей полей), знать, какие бывают прикладные протоколы поверх WS вроде Autobahn (хотя, может он уже устарел?).
Я не использовал, но обычно middleware используют там, где надо что-то сделать с HTTP-запросом или ответом. Например: зашифровать куки, залоггировать запрос, сжать HTTP-ответ, добавить какие-то HTTP-заголовки.
Что-то более высокоуровневое там делать неудобно. Например, проверку прав доступа сделать там тяжело, хотя некоторые и пишут, что для этого можно использовать middleware.
Это не очень удачная книга. Она объясняет, как реализовать паттерн, но не объясняет, зачем он нужен. Также, там дурацкие примеры, например тут: https://designpatternsphp.readthedocs.io/en/latest/Creational/Builder/README.html
Тут в примере используются классы TruckBuilder и CarBuilder. В каком приложении тебе понадобится создавать машины с помощью билдера?
Более того, там приведен сложный код, используются интерфейсы, наследование, но нет никаких поясенений, зачем это нужно.
Работаю на фирму, которая релокейтнула пачку пыхеров в Чехию в Прагу. Т.е. большая часть команды разрабов работает из Праги. Кто-то собирается переезжать, как с ковидлом поуляжется
Тоже начинал с yii до сих пор на нем, блядь, ебаное легаси, мать его. Так что относительно неплохой старт. Главное - срыгнуть на симфу
Автор вопроса спрашивал, как ему настроить выполнение заданий под Windows, значит его интересует именно эта ОС.
Реально. Я из Беларуси и мне сейчас компания предлагает помощь с релокацией в Польшу, Литву или Украину.
Тому що нужно проверять существование ключа subject в массиве прежде чем обращаться к нему. Регулярка у тебя тоже кривая Спасибо, вернул мне мой 2005-й
>Тебе сначала хорошо бы изучить не веб-сокеты, а классические сокеты Беркли. Понять, как вообще данные передаются в сети между машинами. После этого веб-сокеты, после этого прикладные протоколы вроде Autobahn.
Очередной посылатель учить левую хрень.
В процессе учебы писать так абсолютно нормально, но не более того. Хотя возможно, что в каких-нибудь конторах, клепающих лендинги, обработка форм сделана именно так.
Тогда пиздуй учить диодно-транзисторную логику, а еще лучше начинай с квантовой механики и физики полупроводников, ведь веб-сокеты на этом основаны. Пока не выучишь не возвращайся в IT.
>Сокеты Беркли надо понимать
Тыскозал? Как это поможет накатить библиотеку и сделать по документации? Нахуй надо ковырять левые доки по другому языку, ты ебан какой-то.
>Сокеты Беркли надо понимать
Их вендору надо понимать, а не имплементатору. Сразу нуба в разработке видно. Небось ещё и на ВУЗы дрочишь - типа без вышки и знания тысяч алгоритмов только не пизди, что ты их все учил не бывает программистов.
Расскажите плиз как вкатывались, что читали/смотрели?
>>066126
По стильному-современному это будет экшен контроллера в который будет инжектиться либо реквест, из которого ты руками (не надо так) или с помощью десериализации достанешь нужные тебе данные, скормишь их валидатору и потом будешь с ними работать, либо готовая провалидированная дтошка (в ларке это из коробки, в симфони нужно запилить аргумент ресолвер) опять таки с нужными тебе данными
А зачем страдать, если можно поставить линукс в дуалбут? Все равно на работе придется иметь с ним дело. Сами себе придумывают сложности на ровном месте, а потом героически с ними сражаются
Читал доки symfony/laravel, смотрел AFUP PHP. Пошел на собес с требованиями "symfony, laravel, wordpress". На тех. собесе мне сказали: "Ты молодец, конечно, у нас проекты для тебя есть, но пока что завал с битриксом, так что подсоби". Ну я согласился: первый собес, хули. Прочитал доки и прошел тесты за неделю, поработал месяц и убежал.
laravelka
Сколько заплатили хоть за такую вилкочистию?
В том, что можно взять только то, что тебе необходимо. К примеру только контейнер зависимостей и роутер. А в ларке даже педрильный блейд гвоздями прибит по крайней мере раньше было так
Еще доктрина, если ты адепт предметного подхода в архитектуре, может ебенейшую по вложенности структуру из сущностей и вэлью обжектов подхватить без изменений. Причем тебе твою бизнес логику никак не придется переделывать под фреймворк, а элоквент так не может и заставит тебя писать кучу борлеплейта по преобразованию структур бизнес логики в модели и наоборот, либо заставит прибивать БЛ к ларавелу гвоздями.
>symfony, laravel, wordpress
Ну ты нашёл куда сунуться. Мог бы сразу на фрилансе к очередному дебилу с "нужон розробочтик на Тилда, Вопркперс, Ларавел, Опенкарт за 20к\мес" пойти в услужение.
>На тех. собесе мне сказали: "Ты молодец, конечно, у нас проекты для тебя есть, но пока что завал с битриксом, так что подсоби"
Ожидаемо.
А чем симфони не микрофреймворк?
Дошёл до задачи с палиндромом в учебнике, вроде решил её, но у меня стойкое желание что я наговнокодил, вот сам код https://ideone.com/DGq6ON
Я для отсчета символов с конца строки создал лишнюю переменную и у меня стойкое ощущение что это можно было сделать как-то по другому, но я не понимаю как. Я находил в интернете решения этой задачи через функции, но я до них ещё не добрался поэтому меня интересует более оптимальное решение из тех знаний что предоставил учебник до этого момента.
Желания => ощущениебыстрофикс*
Спасибо за подсказку, так и знал что нагавнокодил.
>Есть тут аноны, которые работают с Битрикс?
Есть. Потрогал говно, блеванул, больше с ним не работаю
Тяжело наговнокодить в функции на 5 строк. Работает и ладно
Не шизи, там такого не написано.
Шизик, тебе уже отвечали, что ты обращаешься к несуществующему ключу массива.
Короче, первая моя работа была около года в компании работающей на CMS и делающей магазинчики ебучие. Это было больно, но я работал и учился. Потом перешел в другое место и начал делать проект на Yii. Там продуктовая компания, продукт всего один. Стартапщики ебучие.
Короче, вопрос следующий: что помимо работы мне стоит делать чтобы вкачиваться в плане скилла.
Что я научился за эти полтора года:
- Ну собсна ПХП. 7ой ясен хуй. С пацанским ООП.
- Базы данных. Запросы, джойны, репликация, нормальная форма. Вообще на машке работаем, но я и на монге успел.
- Редиска и мемкэшд. Для, что характерно, кэша.
- Слегка JS. У нас в админке интерфейс простой, хуйня на бутстрапе с жиквири. Модалочки хуялочки научился делать, всякие говногулпы.
- Докер с компоузом, куда же без него.
Так вот. Что мне делать КАЖДЫЙ ДЕНЬ помимо работы чтобы дальше расти в скилле? Сейчас начал читать книжку по Yii для более глубокого понимания. Так же начал писать мелкий фронтенд на реакте чтоб научиться и этому тоже. Че ещё посоветуете?
>Что мне делать КАЖДЫЙ ДЕНЬ помимо работы чтобы дальше расти в скилле?
Бля, да много чего ещё можно делать!
1) Учить какие бывают архитектуры. Событийно-ориентированные, микроядро, микросервисы, многослойная, space-based и т.д.
2) Учить облачные сервисы - AWS, Azure, Google Cloud. Проходить воркшопы https://awsworkshop.io/ Смотреть Well Architected Framework https://aws.amazon.com/ru/architecture/well-architected/
3) Учить инструменты деплоя/автоматизации архитектуры - Hashicorp, Pulumi, Chef, Puppet, Ansible, Salt и т.д.
4) Учить стандарты PHP - https://www.php-fig.org/ PHP CodeSniffer, и т.д.
5) Учить CI/CD - тот же Сicle CI.
6) Учить Github/Github экшены.
7) Учить как отслеживать приложения - Lumigo, Dynatrace, Datadog, и проч.
8) Проджект менеджмент - ту же Asana, какие стили бывают agile, lean, scrum, kanban и т.д.
Короче учить можно до бесконечности.
Какой смысл это все учить без применения на практике?
1. Согласен, общее понимание неплохо бы иметь.
2. Особо не задрачивать, просто понимать что в принципе на рынке есть. В каждой галере всё по своему.
3. Нахуя? Во-первых это дело ДевОпсов, во-вторых, максимум нужно примерно понимать пару-тройку команд для деплоя.
4. Согласен, было бы неплохо знать.
5. Нахуя? Опять же, это работа ДевОпса, разве что общий принцип как работает в твоей компании CI/CD.
6. Ага, блядь, и пайплайны битбакета. Что там учить то? Просто конфигурируешь настройки под каждый проект (по ридми и мануалам), что конкретно ты учить там собрался-то?
7. Нахуя ты опять советуешь учить не технологии/подходы, а какие-то частные реализации? Опять же, это работа ДевОпса. Твоя работа как программиста максимум помочь в интеграции, всё. Тебе не нужно учить все сервисы которые тот или иной продукт предлагает.
8. Угу, ещё "выучи Жиру" забыл добавить.
Короче, советы не для программиста, а для девопс/кодера/продакт менеджера/архитектора/продакт оунэра комбайна. Тот, кто всё это знает, по сути не знает ничего, нахватался по верхам.
Я бы челу предложил копать глубже, а не в ширь. Посмотреть паттерны, поразбираться как устроены популярные фреймворки, попробовать написать экстеншены к ним, попробовать покоммитить в опен сорс проекты.
>3, 5, 7
В мелких фирмах/командах сеньор бекендер может быть девопсом на пол ставочки. Там как раз хватает знаний по верхам, т.к. нужно поднять дефолтный си/сд
>Что мне делать КАЖДЫЙ ДЕНЬ помимо работы чтобы дальше расти в скилле?
Как минимум начать использовать единственный нормальный фреймворк на похапе
до уровня джуна (хорошие знания php + база laravel/yii2 + mysql) за сколько подтягивается?
Оптимально за пол года фултайм (40ч в неделю) можно выйти с нуля на джуна и пойти штурмовать собесы.
Только побольше кода пиши на голой пыхе и с фреймворками.
Результатом учебы должен быть какой-нибудь пет проект на фреймворке с основными фичами (пара крудов, авторизация, хождение в сторонние апи)
rowCount, это rows affected для запроса.
А если просто количество, то через select count, очевидно же.
ну знания пыхи на базе есть в связке с бд. могу круд приложение написать. я переживаю по большей части за то, что я ебланил всё своё время. как вытекающие: 5 записей в тк (начал с веб-разработчика, потом пошёл на завод, на склад, в вуз программистом, потом блять логистом поработал, причём только в двух местах работал 5 и 12 месяцев. в остальных по две недели). это уже пиздец тотальный? даже если ахуенные знания будут, мне кажется не возбмут чела со склада блять.
мне 25 только стукнет
Symfony
<?php
$s = 2;
switch ($s){
case 1:
echo 1;
case 2:
echo 2;
case 3:
echo 3;
break;
default:
echo "default";
}
Это пиздануто из си, а там вроде было сделано, чтобы несколько кейсов хуярить, т.е.
case 1:
case 2:
hui
break;
case3:
Что мешает завести новую трудовую если тебя это так беспокоит? Да и вообще если ты по скиллам и знаниям устроишь работадателя то не похуй ли ему где ты там раньше работал?
Смотря с какого уровня. Если не умеешь кодить вообще - год с нуля. Если умеешь кодить на питоне задачи, быстрее.
>>069748
Это тебя зумера троллят чувак поопытнее? Жоска
> попробовать покоммитить в опен сорс проекты.
Кста, я хочу покоммитить куда-то. Но даже в душе не ебу как начать. Мануал есть?
>>069515
Хуйня все это. У нас люди уходили на контракт на 3 года а потом возвращались и снова в код. И нихуя. Некоторые выкатывались из айти и вкатывались обратно. Одному мне збс
> Кста, я хочу покоммитить куда-то.
Не надо "коммитить" куда-то. Обычно люди контрибьютят в те проекты, которыми они пользуются или в которых они сами заинтересованы.
Ну например: ты используешь какой-нибудь WYSIWYG редактор в своей админке, но в нем нет опции для вставки в текст картинок. Ты ее делаешь и контрибьютишь - либо как изменения в редактор, либо как плагин, если в нем поддерживаются плагины.
Или ты используешь какой-нибудь проект, но в нем есть баг. Ты его исправляешь.
Или другой пример: тебе нужно проверять на правильность какой-нибудь ИНН, а готовой библиотеки нету. Ты пишешь свою и выкладываешь в опен-сорс.
Или: есть какая-то полезная библиотека, но она платная и с жесткими условиями лицензирования. А нужна. Ты пишешь открытый аналог.
Если ты никакие опен-сурс проекты не используешь, то просто установи себе Линукс или какой-нибудь открытый софт и ты сразу найдешь кучу багов и кучу фич, которые неплохо бы добавить. Но, правда, это может потребовать высокой квалификации.
Но общая идея в том, что ты контрибьютишь в то, чем ты сам пользуешься и что тебе интересно.
А как именно контрибьютить: клонируешь проект, делаешь правки, проверяешь, если в проекте используются тесты, то покрываешь свои правки тестами, оформляешь свой код в соответствие с требованиями, делаешь пулл-реквест.
Имхо, скорее всего он был написан еще при царе горохе.
Там один класс на 2к строк, хз, какой ты интерфейс туда хочешь
и что, долго вкатываешься?
Лол, я в свои 29 лет уже понимаю, что поезд ушел, и развиваться реально только в своей, уже надоевшей, специальности, а ты в 34 такой глупый.
>уже понимаю, что поезд ушел
Ну так все правильно, ты уже выгорел, потерял интерес. Нефиг было с 14 лет кодить.
Уходи на пенсию и дай место молодым, 30+ летним, которые про кодинг узнали год назад.
Или не будет. В любом случае, сейчас 34 - слишком великовозраст для реального шанса на вкат.
>двачеродаунов
Повторюсь: https://insights.stackoverflow.com/survey/2019#developer-profile-_-age
Ну ты там другие графики посмотрел бы тоже.
>White or of European descent 70.8%
>Black or of African descent 3.6%
Ох, фсееее, бида-печаль
Если ты темнокожий, то у тебя нет шансов на вкат.
> Что делать, если я хочу написать обертку над реквестом с парой нужных мне методов?
Для этого не нужен интерфейс (зачем?), ты просто можешь унаследовать свой класс от Request. Хотя мне не нравится такая идея, так как это неожиданно, что вместо стандартного реквеста используется что-то нестандартное. Это плохая идея расширять какие-то стандартные классы, как мне кажется.
Или, как вариант, просто делаешь класс RequestUtils и в нем статические методы для работы с реквестом. Здесь нет никаких проблем с неочевидностью кода.
А так, интерфейс для реквестов есть - PSR-7. Просто он придуман позже, чем реквест из симфони.
>И при чем другие графики
Ну если ты не в состоянии это понять, то на твое место точно очень скоро вкатится успешный дедок 30+, хех.
Ну а хули ещё делать? Я все ещё девственник, все свободное время провожу за компом, тут либо самовыпил либо вкат с перспективой покупки японской секс-куклы
>все свободное время провожу за компом
Вот здесь кстати кроется серьезная ошибка.
"Проводить время" - фактически досуг, это совсем не значит, что тебе понравится/получится за компом работать. Как бы даже не наоборот.
Пет проект написал?
>Ну так объясни, что тебе дают другие графики?
Статистику они дают, такую же точно статистику.
По статистике темнокожих кодеров на стековерфлоу - 3 процента
По той же статистике кодеров в возрасте 45+ - 3 процента
Означает ли это, что у кодера 45+ такие же шансы на вкат, как у темнокожего?
Каковы шансы на вкат у темнокожего кодера в возраста 45+?
Уверен ли ты, что на графиках достаточно информации, чтобы ответить на эти вопросы?
я просто указал, что стукнет 25. без мысли, что уже поздно. Переживаю за то, что везде блять поработал
Я уверен, что эта выборка - репрезентативна.
>Означает ли это, что у кодера 45+ такие же шансы на вкат, как у темнокожего?
Ну вот пошли откровенные виляния и маняврирования. При чем здесь темнокожий, если изначально речь шла о возрасте.
Ни сы. В пхп не идут упругие зумеры. Так что еще успеешь вкатится
Что интересно, пхп появился, когда 45-летнему было 20 с не большим. А первые годы (если не десятилетие) рождения языка - это практически полное отсутствие работы на нем.
Таким образом наш 45летний пациент сам мог вкатиться в пыху ближе к 30-35 годам, а сейчас это обычный синер
>При чем здесь темнокожий, если изначально речь шла о возрасте.
Ты реально довольно тупенький.
Но это хорошо:) Больше тупых зумерков = меньше конкуренции.
Даже не буду тебе советовать прочитать одну книжку, вдруг и вправду прочтешь, лол.
Ну то есть по существу тебе сказать нечего и ты отчаянно переводишь стрелки с неприятной темы возраста
>Таким образом наш 45летний пациент сам мог вкатиться в пыху ближе к 30-35 годам,
Это с хуя ли вдруг? "Вкатываются" в любые языки в основном молодые упругие зумеры.
Даже hh вам ебалаям уже открыто говорит видимо совсем доебали, что для смены сферы деятельности в 30+ ты уже староват, нееш подумой, а если всё же долбоеб решился - ищи блядь по связям:
https://hh.ru/article/28696
Это возрастное! Как сменить профессию после 30 лет
>Ищите работу через нетворкинг: расскажите всем, что хотите перейти в новую сферу, через личный контакт вам будет проще объяснить ваше решение. Напишите в социальных сетях и поиске.
Твое мнение очень важно для нас, оставайся на связи.
>Анна Чуксеева
>карьерный психолог
>hh
Лол
Какие же зумеры дегенераты, пиздец просто.
Мне нет выгоды объяснять тебе простейшие положения статистики и теории вероятности.
>>hh
Да, что не так? Первой будет оценивать твоё резюме такая же анна - и для неё в свои 30+ ты уже возрастной и вообще лучше поискал бы по знакомым.
>>070531
Простейшие положения статистики и теории вероятности: из общего количества профессиональных разработчиков 71,7% младше 35 лет, а 85% — младше 40 лет. Это необычно по сравнению почти с любой профессией в мире.
Приходит такой зумер устраиваться пыхарям, а у них легаси возрастом старше этого зумера
>Да, что не так? Первой будет оценивать твоё резюме такая же анна - и для неё в свои 30+ ты уже возрастной и вообще лучше поискал бы по знакомым.
Ирония в том, что такой зумер может оказаться твоим начальником:
https://youtu.be/I92pAqNe-4Q?t=524
Я не могу ничего унаследовать, поскольку некоторые симфонивские штуки требуют именно этот самый реквест, вместо интерфейса.
>мне не нравится такая идея, так как это неожиданно, что вместо стандартного реквеста используется что-то нестандартное.
Если при наследовании код может работать с потомком наследуемого класса так же как с предком какая буква из солид? лол, то никакой проблемы в этом нет
>почему у класса Request нет интерфейса
наследие
>хочу написать обертку над реквестом
класс открыт для наследования
напиши что конкретно ты хотел сделать и зачем?
Я хочу чисто поконтрибутить во что-то небольшое, где нужна помощь. Мне для рил практики не нужно, я не решаю че мы в проект вносим. Хочу хотя бы с мелких багов начать.
Но нужно что-то где есть норм баги, а не где все стабильно и их воспроизводить 100к. И хотелось бы не в либу контрибутить на самом деле а в продукт. Я бы в блендер хуярил есл бы кресты зн
мимо30лвл-начал-изучать-только-только
Короче, если эти карьерные психологи будут выебываться на собесах, сразу на фриланс уйду, на англоязычные биржи.
>Нахуй вы меня демотивируете своими сообщениями, что диды не нужны???
Это порриджи развлекаются, не обращай внимания.
На фрилансе нужны уже опытные, с нуля нахватаешь за щеку таких минусов, что проще будет самому удалить аккаунт
не до 6, а до 10 поставил просто потому что так захотел. я не кубики бросаю!!!
Какой там код, лол.
По оформлению лучше ифы со скобками и юзай интерполяцию вместо конкатенации.
>для смены сферы деятельности в 30+ ты уже староват
Так тут не о смене сфере деятельности базар, а о первой работе после 30+ вообще.
Не проецируй на взрослых дядек то что мамка тебя из дома выгоняет на работку и у тебя встал выбор между маком и выгоранием в 25. Я могу хоть до пенсии дома просидеть.
«Ну так-то любой год на пхп это говноедство.
Такой уж у вас язык» — раздался пронзительный голос со стороны параши.
Но пацаны, как всегда, не обратили внимания на это визгливое кукареканье. Пусть кукарекает, что с него взять?
Перекладыватель жсончиков на других языках — не человек, и сегодня ему предстоит очень трудная ночь. У него уже в течение полутора лет каждая ночь была очень трудной, и теперь его анус был разработан настолько, что он без труда мог спрятать в нём макбук.
Я не очень тебя понял. Допустим, в Симфони есть функция
doSomething(Request $req) { ... }
В соответствие с принципом Лисков, в эту функцию можно передать объект-наследник Request и это не нарушит тайп-хинты:
class MyRequest extends Request { ...}
doSomething(new MyRequest(...));
По моему, проблема есть. Допустим, у нас есть функция Symfony, которая возвращает реквест:
function getReq(): Request { ... }
И код, который ее использует, вызывает какой-то метод из твоего кастомного реквеста:
getReq()->doSomething();
при чтении кода здесь возникнет непонимание: откуда в реквесте из Симфони взялся метод doSomething()?
IDE и статический анализатор тоже здесь укажет на ошибку.
Или я что-то не понял?
А вот и тот самый рисователь кнопочек/перекладыватель жсончиков/крудоеб на петухоне/жопаскрипе нарисовался. Видимо, в самую точку, раз с копипастой заговорил.
Назрел такой вопрос: масса книг и не знаю какую выбрать первой для изучения пыхи. Посмотрел учебник ОПа, который в шапке, мне не понравился. Мало конкретизации даже по типизации, а как по мне, это немаловажно.
Какую книжку выбрать? Котерова? Или видео-курсы какие-нибудь скачать или на ютубе вкуривать и параллельно гуглить?
А что если смотреть курсы или книги по пхп7, а щас уже 8, это не хуёво?
Сори за тупые вопросы, без них никак.
>>070997
Что-то ты не туда разговор уводишь. Повторяю, что моя проблема состоит в том, что я не могу использовать наследник реквеста, так как симфони в разных местах требует тот самый конкретный реквест. И попытка подменить его наследником во фронт контроллере не прокатила.
PHP Fatal error: Declaration of App\ArgumentResolver\BlaBlaBlaResolver::supports(App\Request\Request $request, Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata $argument): bool must be compatible with Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface::supports(Symfony\Component\HttpFoundation\Request $request, Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata $argument)
Например, раздутым на пустом месте самомнением. Но юным петушкам-максималистам это объяснять бесполезно.
То же самое можно сказать про любой другой язык.
>>070725
У тебя слишком длинные строки и это тяжело читать. Также, не надо забывать фигурные скобки. Надо писать так:
if (...) {
код 1;
} elseif (....) {
код 2;
} else {
код 3;
}
Также, подстановка переменных в строку ("число $number") читается лучше, чем склеивание строки из кусочков.
Приведенная тобой ошибка возникает не из-за того, что в Симфони нет интерфейса для реквеста. Если бы для реквеста был интерфейс, она бы точно так же возникла.
Если у тебя есть класс A, в нем метод принимает объект класса B, то при наследовании ты не можешь поменять тип аргумента на C (наследника B). Так как это нарушило бы принцип подстановки Лисков: старый код, передающий в метод объект B, сломался бы.
То же самое было бы, если бы аргумент имел тайп-хинт RequestInterface. Как только ты бы попытался заменить его на MyRequest, ты бы получил ту же самую ошибку.
>Посмотрел учебник ОПа, который в шапке, мне не понравился. Мало конкретизации даже по типизации, а как по мне, это немаловажно
На пыхе можно писать без типов.
У ОПа учебник для самых маленьких. Если ты уже можешь написать круд с/без фреймворка, то тебе учебник вряд ли пригодится.
>А что если смотреть курсы или книги по пхп7, а щас уже 8, это не хуёво?
1. 8ка еще не в продакшене и будет там не раньше чем через пару лет
2. В 8ке ввели 1.5 фичи, которые можно за вечер пощупать
Можешь взять котерова, но это по сути вольный пересказ документации
с php.net
Либо попробовать ларакасты - серии коротких видео по темам, там есть и основы пыхи и ооп
В любом случае твоя задача писать код, а не книжки читать и видео смотреть
Спасибо большое. Да, я знаю, что надо шкодить, просто я всегда привык прочитать что-то, например, когда тернарный оператор пробовал, а потом уже хуевертил с ним всё подряд. Мне проще запоминается, когда я что-то прочту, не пойму, попробую сделать, пойму наполовину, прочту ещё раз 10 и пойму окончательно, после чего ещё закеплю на практике. Ебанутый способ наверно, но для меня он рабочий.
> не надо забывать фигурные скобки
Я когда-то наткнулся на статью, что скобки можно опустить, если одна операция в них идёт.
>чем склеивание строки из кусочков
Просто привык к конкатенации ещё с вуза (пиздец блять, 4 года почти прошло, как в вузе прогал и забросил это дело, и щас по новой учусь. какой же я бездарь, блять.)
>Я когда-то наткнулся на статью, что скобки можно опустить, если одна операция в них идёт.
Почитай этот момент в PSR. Насколько помню, скобки нужны, чтобы можно было зрительно распознать конструкцию. Без скобок это выглядит как обычная строчка вызова метода или присвоения
Лучше всего, конечно, контрибутить в то, чем ты пользуешься или в чем заинтересован сам. Так ты и себе пользу сделаешь, и людям поможешь.
То есть процесс обычно такой: тебе что-то нужно -> готового решения нету -> ты либо пишешь свое, либо дорабатываешь чужое. Или ты используешь какой-то проект, видишь, что можно его улучшить, и улучшаешь.
В любом случае, тебе придется потратить время и разобраться в проекте, в котором ты хочешь что-то сделать.
Ты можешь зайти в список багов и сделать поиск по меткам. Во многих проектах есть метки вроде "help-wanted" или "up-for-grabs", которыми помечают баги для начинающих. Ты можешь использовать поиск на гитхабе для поиска таких багов. Тут есть список ссылок и меток для начинающих: https://gist.github.com/stefanmaric/d5a03eeb89af81e5537e2efe7dd479cf
Язык позволяет пропускать скобки, но рекомендация PSR не рекомендует так делать, так как это ведет к ошибкам вроде такой:
if (...)
....action1;
....action2; // это действие выполняется независимо от условия!
Здесь кажется, что оба действия внутри if, а по факту только одно. Чтобы такого не было, надо ставить скобки.
Да я ж не про кодинг писал, а про свою профу, я вообще юрист.
Это печально. А есть ли способы обойти такое поведение? В принципе у меня сейчас нет необходимости делать эту штуку, но просто интересно.
Посмотри зарплаты симфонистов на том же джинне (все свои четыре места работы на данный момент я находил именно там) и твой мирок пошатнется.
> 8ка еще не в продакшене и будет там не раньше чем через пару лет
С марта на восьмерке живем. Брат жив
>И что? Хороший способ отсеять необразованную падаль.
В рф много продуктовых с русскоязычными командами
Такая у вас специфика рынка и не факт, что это хорошо. Я сам из Беларуси и иногда вижу российские вакансии на сеньерские позиции с такими вилками, что хочется плакать. Удивительно, как они вообще умудряются кого-то нанимать
Не за одного, а как минимум за полтора.
Ты пишешь какую-то ерунду. Он бы работал за двоих, если бы работал по 16 часов в сутки. Если он работает 8 часов в сутки, то он работает за одного.
Он фулкек - выполняет работу фронтендера и бекендера
Так ему нужно сначала выдрочить скилы с двух проф, потом поддерживать их актуальными. Так что хотя бы х1.5 должна быть зп
Можно подумать, что колупание форм, кнопочек и запросиков требует каких-то неимоверных умственных усилий. Да там любая макака справится. А со времен появления vue.js это даже перестало вызывать особое отвращение
Получаю жалкие полтара косаря, не являясь синьором помидором
Потоиу что за работу с жопаскрипом принято доплачивать за вредность, типа как в совке сварщикам молоко выдавали.
Придумал, как обойти это ограничение с помощью наследования интерфейсов.
http://sandbox.onlinephpfunctions.com/code/8e3b5e08edf0b131fbfe63e83ac30d595b031a61
Как минимум тем, что на современном похапе жсончики перекладывать в разы приятнее, чем на пятоне или, прости Господи, жопаскрипте
Ты что-то переусложнил. По моему, тут можно было бы обойтись и наследованием:
class Request {}
class BetterRequest extends Request {}
function test(Request $r) {}
test(new BetterRequest()); // работает
Интерфейс нужен там, где есть 2 разных реализации. Ты же хочешь не делать реквест с нуля, а доработать стандартный, значит тебе нужно наследование.
Поднял бабла ЛАМПУ, на неё накатил вордпресс. Хотел бы обращаться на неё по имени http://235, но не судьба.
По ip фурычит.
Что я делаю не так?
Это скорее вопрос в софтач или в веб. Резолвер у тебя на компьютере, с которого обращаешься, какой? Винда там? В настройки роутера зайди, там должна быть возможность настроить разрешение кастомных адресов в конкретные ip.
>>071705
>>071192
Бля, ну вы и кукаретики канеш. Давно уже все за вас придумали https://refactoring.guru/ru/design-patterns/adapter . И для симфони тоже https://symfony.com/doc/current/components/psr7.html
> Это скорее вопрос в софтач или в веб.
Пока посижу тут, а потом подсяду к ним.
> Резолвер у тебя на компьютере, с которого обращаешься, какой? Винда там?
Отдельная машина в локалочке, а на ней стоит Ubuntu.
> В настройки роутера зайди, там должна быть возможность настроить разрешение кастомных адресов в конкретные ip.
Гляну.
>>071965
1. Изменил настройки пермалинка на "дружелюбные"
2. включил в апаче rewrite
3. отредактировал файл по пути /etc/apache2/sites-available/000-default.conf
4. Перезапустил апач
Единственное, что приходит на ум - это составление функции, которая будет принимать аргументом уже проставленные пользователем значения, собирать форму по элементам и возвращать её код. Но это будет именно функция, а не шаблон. Наверняка тут есть какой-то конвенциональный подход. Как это лучше запилить?
> 1. Изменил настройки пермалинка на "дружелюбные"
> 2. включил в апаче rewrite
> 3. отредактировал файл по пути /etc/apache2/sites-available/000-default.conf
> 4. Перезапустил апач
И как компьютер, с которого ты вводишь этот адрес, должен узнать, что где-то в каком-то апаче отредактирован конфиг?
Если я сейчас у себя отредактирую /etc/apache2/sites-available/000-default.conf и напишу туда хост BBC.COM -- у тебя он начнёт открываться с моего компа? очевидно нет
Читай про DNS, редактируй файл hosts на машине, с которой обращаешься.
Все я прочитал. В симфони по старинке используется https://symfony.com/doc/current/components/http_foundation.html
В то время как стандартом является PSR-7 https://www.php-fig.org/psr/psr-7/
И давным давно написали конвертер под этот стандарт https://github.com/symfony/psr-http-message-bridge
А написал я что вы велосипедите хуйню, в то время как все уже сто лет как по полочкам разложено. Что использовать в качестве реквеста, как делаются кастомные обертки над объектами, как какать и как писоть.
И как то, что ты написал, поможет подменить симфонивский реквест другой реализацией и использовать эту реализацию там, где различные штуки явно требуют симфони реквест?
Через imagesetpixel у меня это чёт не получается, как я понял если указать в imagecolorallocatealpha прозрачность, он тупо этот(прозрачный) цвет и прибавит, нихуя в итоге не изменив.
Как зделоть-то?
Ты там угашенный что-ли? Попустись, пивка глотни.
Симфонивский реквест используется в симфони. А вне симфони используется PSR-7 реквест. ВНЕ, блядь. В НЕ симфоневском роутере, например. В собственных классах или бандлах. Каким хуем ты собрался менять код в штуках, которые "явно требуют симфони реквест"? Ты там vendor что-ли правишь?
Создается во фронт контроллере, а потом инжектится при необходимости
...
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
...
Сам ты, блядь, угашенный. Посмотри на https://github.com/symfony/symfony/blob/5.4/src/Symfony/Component/HttpKernel/Controller/ArgumentValueResolverInterface.php и увидишь, что там явно требуется симфонивский реквест. И при написании своего резолвера хуй ты свой реквест туда засунешь. По крайней мере у меня не получилось, поэтому и задал вопрос.
Какой же ты тугой. Прямо носом нужно тыкать, пиздец просто
https://github.com/symfony/psr-http-message-bridge/blob/main/ArgumentValueResolver/PsrServerRequestResolver.php
Так ты не декларацию этих методов правь, а передавай, где надо, свой класс вместо симфонивского
576x304, 0:08
В резолвер инжектится ФАБРИКА. Фабрика принимает симфоневский реквест, а возвращает PSR реквест. Ты можешь прокинуть эту ФАБРИКУ в ЛЮБОЙ резолвер, пусть он хоть DTO возвращает, хоть АЛЛАХА.
640x360, 3:23
Очевидно что альфа-канал не влияет на сам цвет.
Что (какой цвет) должно остаться под альфа? оно само за тебя должно придумывать, что ли?
Простановка атрибута selected делается так. Пусть $value - это выбранное пользователем значение, которое надо пометить:
<select>
<option value="x" <?= $value === 'x' ? 'selected' : '' ?></option>
<option value="y" <?= $value === 'y' ? 'selected' : '' ?></option>
...
(тут использован тернарный оператор)
Если ты не пишешь <option> руками, а генерируешь из массива опций, то код будет еще проще.
Так анону требовался наследник симфореквеста с дополнительной функциональностью, а не PSR.
Так я ему и объясняю что он пытается дрочить вприсядку. Если тебе нужен именно реквест, то PSR-7 это отраслевой стандарт, он покрывает все что ты только можешь с реквестом сделать. А если тебе нужна производная от реквеста, то это уже нихуя не реквест и нахуй не надо что-то там наследовать или имплементировать.
Корявое говно. С таким же успехом я могу просто инжектить в резолвер сервис с нужной функциональностью. Именно этого я и пытался избежать в попытке подменить реквест на уровне приложения. Ну и нихуя не удивительно, что от человека, который хотел кого-то удивить адаптером, ускользнул основной смысл моего вопроса.
>С таким же успехом я могу просто инжектить в резолвер сервис с нужной функциональностью. Именно этого я и пытался избежать
А нахуя?
>в попытке подменить реквест на уровне приложения
Зачем?
Да все, все. Пену вытри. Ты охуенный программист. Верю. Только про PSR не в курсе. Да и di с композицией у тебя говно корявое, а вот подменять вендорские объекты для всего приложения это заебись идея. Ну заебень рефлексией или трейтом, как там у вас гениев принято.
Чел, речи про ПСР реквест изначально не шло вообще, это ты его приплел. Касательно подмены объекта, я же не изменяю старое поведение, а добавляю новое. Все в соответствии с заповедями Варвары. Рефлексию я, конечно же, использовать не буду да и вообще уже отказался от этой идеи. Извини, если погорячился.
Да я просто подъебываю. Ты понимаешь что только ты решил следовать заповедям варвары? Ты не контролируешь процесс, что там с этим реквестом будет происходить, и кто че подменял и ещё подменит не знает никто.
Поэтому трогать вендорную хуйню нельзя ни в коем случае. В реальном проекте я бы определил твой реквест в di контейнере и прокидывал бы в контроллер просто через конструктор. И сразу начнет вырисовываться что это нихуя не реквест. Потому что реквест, даже симфонивский может делать все что нужно http запросу - возвращать пришедшие на сервер данные. А все остальное это уже обработка запроса.
Просто смотри на зарплату. Иногда с джуна просят докеры, ПСР, ООП, юнит-тесты, и плотят 80к со старта, а иногда уметь вордпресс\опенкарт настроить и плотют 30к.
Главное не перепутать: прогинг за 80к, имплементация за 30к. Работодатели же обожают просить ВСЁ за 30к.
Спасибо за подсказку, я никак не мог до этого додуматься.
в плохом смысле?
спасибо за совет
>Вот как раз я не хочу редактировать файл hosts.
Как бы ты или покупаешь домен и направляешь на ip, или поднимаешь в локалке DNS свой, в нём делаешь редирект(будет работать только внутри локалки, и то только если ты этот днс укажешь в том роутере который за интернеты отвечает), или редактируешь hosts. Как ещё это по твоему может работать?
На обработку одного item-а приходится где-то 1-6 запросов в бд. Item-ов может прийти до 10к.
Офк это всё происходит в фоне, запускается с ребита, но даже так джоба задыхается и повисает.
Есть какие-то паттерны оптимизации синхронизации данных?
Раньше делал вместо обработки по 1 айтему сразу пачкой (по 100 или 1000), соотв объединял операции вставки, получалось на порядок быстрее.
Можно ли что-то еще тут придумать или идти проверенным путем?
1 -- непонятно, что ты делаешь, распиши подробнее
2 -- непонятно, почему синхронизация БД на уровне РНР, а не СУБД
Получаю данные апи, потом актив рекордом пишу в базу в несколько таблиц-сущностей, соответственно проверяю, чтоб не было дубликатов перед записью.
Тут скорее не синхра, а фетч данных.
Потому что данные получаю по апи в непригодном для записи формате, их нужно обработать, раскидать по разным сущностям
>>077377
>джоба задыхается и повисает.
оптимизировать вывод на уровне RabbitMQ;
понизить приоритет вставки;
> раньше делал сразу пачкой
так и делай, в чём проблема
>какие-то паттерны оптимизации синхронизации данных
>какие-то
это вообще не про программирование
конкретизируй
> раньше получалось на порядок быстрее
вообще непонятно, в чём проблема
Проблема в том, что нужно оч быстро переделать, т.к. сроки давно проебаны. А переписывать нормально + тестировать займет несколько дней
Так добавь, зачастую из-за этого тормозят массовые вставки и апдейты. Если ещё инсерты переделать на много записей на один запрос, то вообще будет летать.
Спасиб, попробую. Не думал в таком ключе транзакцию использовать. Да и добавить недолго
Столько времени не могут пофиксить баг, который делает работу на нем невозможной - работа замедляется раз в 10 из-за ебли с виртуальными виртуалками и абстракциями абстракций
>Владимир Дронов: Laravel 8. Быстрая разработка веб-сайтов на PHPНа
Анончики, можно ли с этой книжкой вкатиться в написание простых бложеков с админкой? (не фриланс, конечно, а просто личные пет прожекты) Пхп почти не знаю, ООП не понимаю.
Есть ещё подробная литература по свежему пхп и какому-нибудь фреймворку?
Книжки по пхп - тупое говно тупого говна, особенно от наших авторов, лучше посмотри любой курс для новичков (Кудлая, например), а потом шлифани Елисеевым, если терпения хватит.
Если тебе нужен правда простой бложек с админкой, то тебе хватит вот этого видоса:
https://www.youtube.com/watch?v=0Be0fX9wbXc
Автор тут явно мудак ибо даже я, не прогавший на ларавеле и только пару дней назад решивший его изучить для прохождения ТЗ на РАБоту очередную вижу кучу косяков. Но такие базовые вещи как шаблонизатор, роутинг, работа с БД тут рассмотрены. А больше особо и не надо, всё равно практика решает.
Я про баг (или это фича) оч медленной работы, если проект запускается из под wsl2, но лежит в примонтированной директории (/mnt/d/dev/...).
Вчера пытался перенести проект в home раздел, но чуда не произошло. Так же идут простейшие запросы по 30-40 секунд.
У коллеги на макоси всё хорошо работает 1-2 секунда на запрос.
По ходу только убунту накатывать и ебаться с видео дровами
Да лучше б не было. Мб как человек сидел на линуксе
Насколько я понмю, всл1 это была виртуалка, а всл2 какой-то слой эмуляции апи и он обсирается как раз, в первом работало лучше. Так что можешь поставить виртуалку и пробросить свои файлы два раза из хоста в гест и из геста в докер, будет всё равно лучше, лол.
>Вчера пытался перенести проект в home раздел, но чуда не произошло.
Вообще по идее должно нормально работать. Конвертни обратно в всл1 и посмотри результат.
На ssd всё крутится.
С hdd несколько лет назад охуевать начал, когда вин10 накатил, подкопил на сосунг ево и забыл про тормоза
Док предельно прост и нагляден: https://api-platform.com/docs/core/subresources/#access-control-of-subresources
Я нашел операцию через дебаг, проверил через attributes реквеста, прописал пикрил, а оно не работает.
Зачем мне куча? Советуй конкретный.
>>077636
Спасибо, попробую с этой хуйни начать
>>077577
https://webformyself.com/laravel/
Этот? И что, он годный? Учитывает НОВШЕСТВА пхп 8?
На рутрекере не нашел :С
так что лучше не начинай, анон. лучше js или джанго
Что ты собрался на винде делать, когда рабочее окружение линупс в основном?
Есть на NoNameClub, но учти, он ознакомительный, для обезьянок-астронавтов, уровня "так падажжи ебана".
Можешь этого чела глянуть, но он вроде Yii разбирает.
https://www.youtube.com/c/ВикторЗинченкоА/featured
Зачем тебе инсталлер, еси ты можешь просто распаковать архив и запускать php.exe?
Докер это не инсталлятор пэхэпэ, довен. У всех норм языков есть свой инсталлер.
>>078578
XAMPP это не инсталлятор пэхэпэ, довен. XAMPP это комбайн из кучи говна, в числе которого есть и пэхапэ. У всех норм языков есть свой инсталлер.
>>078743
Потому что я не в 1987 году, чтобы что-то руками распаковывать. Еще и в PATH руками добавлять? Лол, ты точно из 2021?
Фуххх.. Разобрался. Как обычно тупняк на ровном месте был, время устанавливал не как time() + 10 лет, а просто как 10 лет, получалось кукисы истекали в 1980 году. А так вместо локалхоста домен прописал как ".app.localhost" и схавало.
Грац
Есть такой менеджер пакетов для винды chocolatey, им можно одной строчкой пхп установить как в лине
А зачем тебе standalone установщик php то? Что ты с ним делать будешь без вебсервера?
А если с вебсервером-есть куча готовых инсталлеров.
Алсо нахуя тебе на винде пыха?
Не ну если так... То огромной ему удачи, чо.
Да, я знаю про него. И по-прежнему, у пэхапэ нет своего инсталера.
>>079144
> Что ты с ним делать будешь без вебсервера?
То же, что и с джангой без вебсервера.
>А если с вебсервером-есть куча готовых инсталлеров.
Васянских говносборок типа XAMPP?
>>079182
Могу. Но не хочу. Это знаешь, как ездить на ручной коробке, когда все нормальные люди уже давно пользуются акпп.
>Васянских говносборок типа XAMPP?
А вот сами создатели пхп XAMPP не считают васянским...
https://www.php.net/manual/ru/install.windows.tools.php
А еще nginx нельзя на винде запустить
>Денвер они не так давно убрали из доки, да?)
Может и так. Но это прям оф. позиция разрабов языка. А значит ты идёшь на хуй.
>После установки языка без веб сервера я сам выберу подходящий мне веб сервер с нужными мне модулями и параметрами и установлю его отдельно.
Ну значит распакуешь из архивчика, не обломаешься.
Алсо выход есть. WSL накатываешь, apt-get install php.
Винда? Винда. Пхп? Пхп.
>Может и так. Но это прям оф. позиция разрабов языка. А значит ты идёшь на хуй.
Но в итоге-то пошли нахуй они, а не я.
Что ты всё еще тут делаешь? Давай иди в тред с языками, у которых есть инсталлер
Одно другому не мешает!
Прям цитата из документации
Открывал я этот исходный говнокод, методы на 500 строк с кучей вложенных if и циклов, передача массивов по ссылке, хуй чего найдешь. А подключение шаблонов это прям искусство говнокода. Да и в целом 3 разных подхода, функциональный с глобальными переменными, ООП старый и ООП новый с неймспейсами и хуй пойми что из них работает, что нет, на что положили хуй, а чего ещё не дописали.
Ну если тебе нужно все сделать за минимум времени, получить деньги от заказчика и съебаться, ебись оно все конём, гори синим пламенем, как делают большинство битриксоидов и алкашей фрилансеров, то говнокод это твой выбор.
Если ты выпускает продукт с длительной поддержкой, над которым работают много разработчиков и который будут использовать тысячи разработчиков по всей стране, то писать чистый код это должно быть чем-то само собой разумеющимся.
>Почему?
Большую часть времени приходиться не писать код, а именно читать. Когда у тебя есть какой-то метод в виде лапши на 300 строк кода, то после 100 строки ты уже забываешь что было выше и понимание как работает этот код усложняется, приходиться несколько раз перечитывать, тот же код вынесенный в отдельный класс и разбитый на методы в пару строк каждый читать в разы проще и проще вносить изменения. Плюс можно использовать различные паттерны, разбивать на сервисы и тп, в таких проектах сразу знаешь что где искать, а не блуждаешь в куче файлов и куче станок кода.
>Когда у тебя есть какой-то метод в виде лапши на 300 строк кода
>тот же код вынесенный в отдельный класс и разбитый на методы в пару строк каждый читать в разы проще и проще вносить изменения
Частным случаем лапшичного кода является как раз слишком сильное разбитие.
Нормальная длинна метода варьируется в зависимости от назначения оного от 1 строки(геттер, сеттер, ЕТС) до где то 40.
Но уж точно не по 2 строки на каждый. Я бы даже сказал что 20-40 строк более нормальный размер в большинстве случаев.
Но да, больше 40-перебор(хотя тоже есть исключения. Но крайне редкие).
Если работаешь с битриксом, то планка качества кода автоматом опускается к ядру земли
Лазанья кода, кстати, не видел. В основном перекос в сторону спагетти кода
>Правда ли, что php лучший язык для фриланса на ангоязычных биржах вроде upwork?
Конечно нет. Порог входа самый низкий, а значит самая высокая конкуренция. Не обладая синьорскими знаниями, делать на апворке с пхп нечего.
Аноны, это про чистый пхпх?
Не нашел в оглавлении ничего про фреймворки.
Кто-то еще пишет веб-приложухи на чистом пхп? И полезно ли это для начинающего?
Глянул английскую версию, это чисто про core, про веб вообще там минимально для демонстрации некоторых фич.
Классная книга, надо будет читнуть как спиздят тру пдфку английскую.
На чистом вряд ли пишут, оно слишком быстро превратится в неподдерживаемый пиздец.
> про веб вообще там минимально для демонстрации некоторых фич.
Пиздец, учитывая название книги
Какой-то вольный пересказ php.net
Грац. Только что ты тут делаешь?
подрубал бутстрап так:
composer require laravel/ui
php artisan ui bootstrap
npm install && npm run dev
Всё работало. Но в какой то момент он пропал из app.css и app.js И повторно не врубается. Как так?
Всё, починил. СОрре.
Хули непонятного-то?
Ты хочешь получить DTO, в свойстве у которого коллекция сущностей? Есть прекрасный оператор new
Я знаком с челом, который на апворке делает 200-300к деревянных в месяц, работая по 4 часа в день. Ни разу в жизни не работал в офисе.
Нет. Мне нужно что-то типа https://www.thinktocode.com/2019/09/12/hydrating-query-objects-with-dtos/
https://ideone.com/GRUQrs
Бля, чел, пиши в пхпшторме. Ну серьезно.
Сколько раз вы будете обсираться на том, что за вас может машина сделать?
пик 1 функция mc_rand - погугли что ли)
пик 2 натыкал exit-ов я надеюсь с целью дебага?
Спасибо. Проиграл чет с mc_rand.
Запили библиотеку с авторами, книгами (чтоб учитывалось количество экземпляров) и читателями, которые могут брать книги домой. Можешь придумать систему уведомлений и штрафов за просроченные книги. Итд итп
На любой работе)
В пхп та же хуйня что и в джаве с мелкими отличиями, так что читать классиков типа Фаулера и Мартина, попробуй допустим Patterns of Enterprise Application Architecture
Я не уверен, что это возможно. В Доктрине ты настраиваешь маппинг (соответствие) между сущностью и таблицей и Доктрина не будет загружать данные в какие-то другие объекты.
Я не очень понимаю, зачем тебе здесь понадобился DTO, и зачем тебе иметь 2 разных класса, которые представляют одну и ту же сущность. Разве это не дублирование кода? Доктрина и так возвращает объекты.
Если тебе нужно именно DTO, то придется копировать данные из объекта в объект руками или как-то еще. Или загружать Доктриной массив и заносить его в объект.
Нужно было просто сказать что для преобразования из/в DTO достаточно пары статических методов у Entity - fromDto, toDto. Разделение на dto и entity делается кода у нас rich model в entity инкапсулирующая бизнес правила, а dto заполняется symfony из реквеста.
В шапке есть задача про тестхаб. Но там гораздо больший объем работы.
>>080319
Еще мне не нравится, что он создал кучу классов: репозиторий (с интерфейсом), класс для представления id, Query (с интерфейсом). Страшно представить, сколько классов будет в реальном приложении с таким подходом. Лишнее усложнение, по моему.
И, что самое главное, не объясняет, зачем это сделано. Зачем нужно абстрагироваться от базы данных или зачем нужен репозиторий и объект Query на каждый запрос. Или зачем он делает интерфейсы на каждый класс. Или какая польза от его DTO и зачем нужно создавать его из массива.
Более того, идея абстрагироваться от БД за счет Query Object гиблая. Тебе понадобится сделать какую-то хитрую выборку, где Доктрина неэффективна - и тебе понадобится писать SQL-запрос. Без всяких абстракций. А это в его схему просто не встраивается.
Он не приводит никаких аргументов, кроме "так проще читать". У меня другие взгляды. По моему, так проще читать простой и короткий код. А не раскиданный по 5 классам и интерфейсам. Плюс, если на каждый запрос делать по 5 классов, то у тебя будет в 5 раз больше файлов и трудно в них ориентироваться. И в 5 раз сложнее редактировать такой код.
По моему, удобнее сделать сервис, а в нем find-методы. Просто и читабельно.
Еще мне не нравится метод byAuthorId() в FindLatestArticlesQuery. Он меняет состояние Query. Вызывая execute(), ты не знаешь: есть ли там фильтр по автору или нет. Может, кто-то его ранее поставил и тогда твой код начнет выдавать неправильный результат.
Также, мне не нравится метод hydrateSingleResultAs(). А как же типизация? Почему не указан возвращаемый тип? Получилась просто обертка над массивами в итоге.
И еще. У него получилось три объекта, представляющих статью: Article, ArticleDTO и LatestArticleDto. Допустим, мы хотим написать функцию, считающую число слов в статье. Как мы это сделаем, если статья имеет три разных представления? Еще один интерфейс сделаем?
И еще мне не нравится что он (или, скорее всего, какая-то кривая IDE) ставит бессмысленные аннотации вроде такого:
@return string
function x(): string {}
Такая аннотация не несет никакого смысла.
В шапке есть задача про тестхаб. Но там гораздо больший объем работы.
>>080319
Еще мне не нравится, что он создал кучу классов: репозиторий (с интерфейсом), класс для представления id, Query (с интерфейсом). Страшно представить, сколько классов будет в реальном приложении с таким подходом. Лишнее усложнение, по моему.
И, что самое главное, не объясняет, зачем это сделано. Зачем нужно абстрагироваться от базы данных или зачем нужен репозиторий и объект Query на каждый запрос. Или зачем он делает интерфейсы на каждый класс. Или какая польза от его DTO и зачем нужно создавать его из массива.
Более того, идея абстрагироваться от БД за счет Query Object гиблая. Тебе понадобится сделать какую-то хитрую выборку, где Доктрина неэффективна - и тебе понадобится писать SQL-запрос. Без всяких абстракций. А это в его схему просто не встраивается.
Он не приводит никаких аргументов, кроме "так проще читать". У меня другие взгляды. По моему, так проще читать простой и короткий код. А не раскиданный по 5 классам и интерфейсам. Плюс, если на каждый запрос делать по 5 классов, то у тебя будет в 5 раз больше файлов и трудно в них ориентироваться. И в 5 раз сложнее редактировать такой код.
По моему, удобнее сделать сервис, а в нем find-методы. Просто и читабельно.
Еще мне не нравится метод byAuthorId() в FindLatestArticlesQuery. Он меняет состояние Query. Вызывая execute(), ты не знаешь: есть ли там фильтр по автору или нет. Может, кто-то его ранее поставил и тогда твой код начнет выдавать неправильный результат.
Также, мне не нравится метод hydrateSingleResultAs(). А как же типизация? Почему не указан возвращаемый тип? Получилась просто обертка над массивами в итоге.
И еще. У него получилось три объекта, представляющих статью: Article, ArticleDTO и LatestArticleDto. Допустим, мы хотим написать функцию, считающую число слов в статье. Как мы это сделаем, если статья имеет три разных представления? Еще один интерфейс сделаем?
И еще мне не нравится что он (или, скорее всего, какая-то кривая IDE) ставит бессмысленные аннотации вроде такого:
@return string
function x(): string {}
Такая аннотация не несет никакого смысла.
Идея разбиения кода на части не в том, чтобы сидеть и отмерять ровно N строк на метод. Идея в том, что ты можешь описать алгоритм в общих чертах, не вдаваясь в частности. Ну допустим, тебе надо синхронизировать данные с каким-то удаленным сервисом и ты можешь писать высокоуровневый код вроде:
получить список данных;
найти измененные данные;
для каждого элемента:
-- синхронизировать элемент;
Это легко читается и понимается. А если ты будешь писать все в одном методе стеной, то разобраться будет сложно. Плюс в коде-стене легко сделать ошибку, случайно перезаписав переменную, которая используется где-то выше и ниже этого места.
>>079750
Проблема таких CMS как битрикс в том, что они (по лицензионным соображениям) пишут свой код с нуля, но они не вкладывают в проектирование столько усилий, сколько, например, вложили разработчики Симфони или Доктрины, и получается какая-то написанная в спешке самоделка.
Вопрос на самом деле интересный. Бывает, что для какой-то задачи нет необходимости в доступе ко всем свойствам модели (а она может быть очень жирной да еще и с поведением), в таком случае читать только нужное из базы и создавать дтошку, пропуская этап создания сущностей - это то, что доктор прописал.
>Идея разбиения кода на части не в том, чтобы сидеть и отмерять ровно N строк на метод. Идея в том, что ты можешь описать алгоритм в общих чертах, не вдаваясь в частности.
Ля ты умныыыый. Проблема в том, что определить допустимый уровень разбиения не так то просто даже опираясь на это утверждение. У некоторых гениев на выходе получается вместо стены текста в 500 строк разбитая на 550 функций по одной строке в 50 классах с 50 интерфейсами каждый из которых применён 1(один) раз стена текста в которой ориентироваться ещё труднее, а некоторые места дублируются просто потому что он ЗАБЫЛ что это уже делал. Всё хорошо в меру. Тысяча слоёв-абстракций не сделает твой код читабельнее сама по себе. Как и тупое сваливание кода в одну кучу. И да, "отмерять N строк на метод"-один из эффективных способов привести код в подобие "разумной слоистости". Особенно если этот код будет писать джун, который не понимает ещё всех прелестей будущей поддержки кодовой базы, и не чует нутром что вот тут вот лучше добавить слой, а вот там-не стоит.
<!Doctype html>
<html lang = "ru">
<head>
<meta charset = "utf-8">
<title>test zaprosa</title>
</head>
<body>
<form action="/" method="get">
<input type='text' name='ball'><br>
</form>
<input type='submit' value='send'>
</body>
</html>
<?php
($grade >= 50 ? 'Сдал' : 'Не сдал')
Аноны, может кто-то за работу веб-сервера на пальцах пояснить или дать книжку/видос. Я вкатывальщик в пхп, уже почти 2 недели гуглю инфу и нихуя не понимаю - книжки по пхп тупое говно и видосы от инфоциган, где ничего не объясняется.
В каком формате приходит ответ и запрос от клиента? Апач слушает порт? Пришел запрос а дальше кто «разбирает» - апач или пхп? Сервер висит в оперативе, а пхп периодически поднимается? Как между собой взаимодействуют веб-сервер и пхп – какая-то служба в операционной системе, а в линуксе это демон называется? Пхп возвращает хтмл на сервер, а тот отправляет клиету? И зачем нужен сервер на локалке? Почему другие ЯП спокойно без него работают?
Самое главное - где все это гуглить?
В шапке в уроках от опа есть, глаза разуй.
Раньше был мод_пхп, т.е. пхп в виде модуля сервера, работал в его контексте.
Современный вариант это fastcgi. В фоне сидит процесс-менеджер и держит пул запущенных процессов пхп и открытый сокет. Основной сервер сидит мордой в интернет и ту же статику отдает сам, а пхп запросы кидает по сокету и получает ответы. В принципе, примерно так же работет современный веб и в других языках.
Лично тебе вряд ли это вообще надо знать в деталях. Ты себе высираешь ответы, а как они там ходят это вообще не принципиально.
Отправку куда? Что ты вообще делать пытаешься? Работа с формами нормально описана у опа в шапке.
Спасибо
А как прописывать? Сделал так, не работает
<?php
$_POST['ball'];
($grade >= 50 ? 'Сдал' : 'Не сдал')
<form action="action.php" method="post">
<input type="text" name="ball"><br>
</form>
<input type='submit'>
ACTION.PHP:
($_POST['ball'] >= 50 ? 'Сдал' : 'Не сдал');
echo $_POST['ball'];
Ну вот эта конструкция постоянно возвращает введенное число, в чем ошибка?
if (($_POST) > 50) {
print($_POST['ball']);
} else {
print 'Не сдал';
}
Зависит от заказчика и почасовой ставки.
Очевидно, что к дешёвым одноразовым скриптам требования ниже.
> предпочитаю
ЛОЛ
Только в фулстакомакаку, то есть еще хуже чем фронто макака, которая хотя бы понимает что делает.
Лучше не быстрее вкатывайся, а нормально.
1. Изучай по минимуму алгоритны и структуры данных. Нужно для собесов в нормальные компании и для более глубокого понимания матчасти.
2. Изучай немного архитектуру компьтера и сетей, чтобы не быть совсем крестьянинов в IT. Изучи линукс и unix команды. Научись пользоваться докером.
3. Изучай хорошо пхп по докам. Как ты будешь писать на языке не зная его?
4. Изучай глубоко БД.
5. Все время пиши код.
Нет, в том и дело, что нравится и фронт и бэк. Один день фронт дрочу, второй пыху и чувствую, что от этого пиздец моя продуктивность страдает
> В каком формате приходит ответ и запрос от клиента?
Клиент (это может быть браузер или другая программа) соединяется с веб-сервером и отправляет запрос по протоколу HTTP. Он немного описан тут: https://github.com/codedokode/pasta/blob/master/network/http.md
Если упростить, то браузер посылает на сервер запрос вида "дай мне файл, расположенный по адресу http://example.com/some/page". Далее веб-сервер анализирует запрос (в зависимости от того, как он настроен) и определяет, что надо сделать:
- или отдать запрошенный файл
- или запустить какой-нибудь PHP скрипт и отдать результат его выполнения (то, что выведет этот скрипт)
Веб-сервер и PHP могут взаимодействовать по-разному.
Если веб-сервер это Апач, то интерпретатор PHP можно встроить в него в виде модуля mod_php. Модуль загружается при запуске Апача в его процесс как динамическая библиотека, расширяющая возможности Апача. То есть, когда понадобится выполнить PHP скрипт, Апач обратится к этому модулю. При этом не запускается никаких новых процессов ОС, выполнение PHP кода происходит внутри процесса Апача.
Минус этого подхода в том, что если, например, Апач грузит процессор, то непонятно: это сам Апач или PHP-код который он выполняет. Также, нельзя запускать PHP и Апач под разными пользователями. Нельзя вынести выполнение PHP кода на другой сервер.
Также, можно запустить PHP с помощью PHP-FPM. В этом случае запускается отдельный демон PHP-FPM, который в свою очередь запускает несколько процессов-рабочих. Демон слушает порт и принимает соединения от веб-сервера по протоколу FastCGI. Веб-сервер при этом может быть любым: Апач, Nginx или любой другой. Используя FastCGI, веб-сервер может попросить PHP-FPM выполнить PHP-скрипт и прислать результат его выполнения.
Когда браузер посылает HTTP-запрос, веб-сервер посылает FastCGI запрос к PHP-FPM. PHP-FPM дает задачу одному из рабочих выполнить PHP-скрипт, тот его выполняет, ответ посылается в веб-сервер, который перенаправляет его в браузер.
Плюсы этой схемы такие:
- можно использовать любой веб-сервер, например nginx
- выполнение PHP-кода никак не нагружает веб-сервер
- можно запускать PHP-FPM из под другого пользователя, а также можно вообще вынести его на другой сервер или группу серверов. Если есть несколько сайтов, то можно для каждого запустить свой демон PHP-FPM под своим пользователем и выставить ему индивидуальные лимиты.
- можно легко увидеть, сколько процессора и памяти потребляет веб-сервер, а сколько PHP
Обычно в такой схеме Апач становится не очень-то и нужен, и используют комбинацию Nginx + PHP-FPM.
> В каком формате приходит ответ и запрос от клиента?
Клиент (это может быть браузер или другая программа) соединяется с веб-сервером и отправляет запрос по протоколу HTTP. Он немного описан тут: https://github.com/codedokode/pasta/blob/master/network/http.md
Если упростить, то браузер посылает на сервер запрос вида "дай мне файл, расположенный по адресу http://example.com/some/page". Далее веб-сервер анализирует запрос (в зависимости от того, как он настроен) и определяет, что надо сделать:
- или отдать запрошенный файл
- или запустить какой-нибудь PHP скрипт и отдать результат его выполнения (то, что выведет этот скрипт)
Веб-сервер и PHP могут взаимодействовать по-разному.
Если веб-сервер это Апач, то интерпретатор PHP можно встроить в него в виде модуля mod_php. Модуль загружается при запуске Апача в его процесс как динамическая библиотека, расширяющая возможности Апача. То есть, когда понадобится выполнить PHP скрипт, Апач обратится к этому модулю. При этом не запускается никаких новых процессов ОС, выполнение PHP кода происходит внутри процесса Апача.
Минус этого подхода в том, что если, например, Апач грузит процессор, то непонятно: это сам Апач или PHP-код который он выполняет. Также, нельзя запускать PHP и Апач под разными пользователями. Нельзя вынести выполнение PHP кода на другой сервер.
Также, можно запустить PHP с помощью PHP-FPM. В этом случае запускается отдельный демон PHP-FPM, который в свою очередь запускает несколько процессов-рабочих. Демон слушает порт и принимает соединения от веб-сервера по протоколу FastCGI. Веб-сервер при этом может быть любым: Апач, Nginx или любой другой. Используя FastCGI, веб-сервер может попросить PHP-FPM выполнить PHP-скрипт и прислать результат его выполнения.
Когда браузер посылает HTTP-запрос, веб-сервер посылает FastCGI запрос к PHP-FPM. PHP-FPM дает задачу одному из рабочих выполнить PHP-скрипт, тот его выполняет, ответ посылается в веб-сервер, который перенаправляет его в браузер.
Плюсы этой схемы такие:
- можно использовать любой веб-сервер, например nginx
- выполнение PHP-кода никак не нагружает веб-сервер
- можно запускать PHP-FPM из под другого пользователя, а также можно вообще вынести его на другой сервер или группу серверов. Если есть несколько сайтов, то можно для каждого запустить свой демон PHP-FPM под своим пользователем и выставить ему индивидуальные лимиты.
- можно легко увидеть, сколько процессора и памяти потребляет веб-сервер, а сколько PHP
Обычно в такой схеме Апач становится не очень-то и нужен, и используют комбинацию Nginx + PHP-FPM.
> Апач слушает порт?
Да, веб-сервер (например, Апач или nginx) слушает порт 80 или 443, на который приходят запросы от клиенат (браузера).
> Пришел запрос а дальше кто «разбирает» - апач или пхп?
Веб-сервер (Апач или nginx). Запрос приходит по протоколу HTTP.
> Сервер висит в оперативе, а пхп периодически поднимается?
Сервер постоянно запущен, да. Если PHP встроен в Апач как mod_php, то он тоже постоянно запущен вместе с ним. Если PHP запущен как демон PHP-FPM, то он тоже постоянно находится в оперативной памяти.
То есть, и сервер и PHP уже запущены и ждут запроса.
> Пхп возвращает хтмл на сервер, а тот отправляет клиету?
Да.
> И зачем нужен сервер на локалке?
Тебе не нужен Апач для локальной разработки. В PHP встроен встроенный HTTP-сервер для этих целей: https://github.com/codedokode/pasta/blob/master/soft/web-server.md#встроенный-в-php-сервер
> Почему другие ЯП спокойно без него работают?
На других языках ты обычно подключаешь в свою программу библиотеку, которая реализует веб-сервер. На PHP можно сделать точно так же, но это никто не делает, потому что есть встроенный веб-сервер.
> Апач слушает порт?
Да, веб-сервер (например, Апач или nginx) слушает порт 80 или 443, на который приходят запросы от клиенат (браузера).
> Пришел запрос а дальше кто «разбирает» - апач или пхп?
Веб-сервер (Апач или nginx). Запрос приходит по протоколу HTTP.
> Сервер висит в оперативе, а пхп периодически поднимается?
Сервер постоянно запущен, да. Если PHP встроен в Апач как mod_php, то он тоже постоянно запущен вместе с ним. Если PHP запущен как демон PHP-FPM, то он тоже постоянно находится в оперативной памяти.
То есть, и сервер и PHP уже запущены и ждут запроса.
> Пхп возвращает хтмл на сервер, а тот отправляет клиету?
Да.
> И зачем нужен сервер на локалке?
Тебе не нужен Апач для локальной разработки. В PHP встроен встроенный HTTP-сервер для этих целей: https://github.com/codedokode/pasta/blob/master/soft/web-server.md#встроенный-в-php-сервер
> Почему другие ЯП спокойно без него работают?
На других языках ты обычно подключаешь в свою программу библиотеку, которая реализует веб-сервер. На PHP можно сделать точно так же, но это никто не делает, потому что есть встроенный веб-сервер.
Ты пишешь бессмысленные команды, которые ничего не делают.
Например, вот это:
$_POST['ball'];
обозначает: "взять из массива $_POST элемент с ключом ball, и ничего с ним не делать".
Или вот это:
$_POST['ball'] >= 50 ? 'Сдал' : 'Не сдал'
значит "в зависимости от значения в массиве $_POST, взять одну из двух строк. И ничего с ними не делать".
Мне кажется, тебе рановато браться за работу с формами. Тебе сначала надо выучить основы языка: переменные, массивы.
>А скажи, насколько вообще хорошо-плохо делать php код без вьюх? То есть пхп возвращает json и все. А рендерит реакт в отдельном приложении?
В современных spa так делают. Бекенд отдельно, фронтенд отдельно.
Такой подход больше плюсов несет беку - не нужно лезть во фронт, слой представления упрощается с иерархии шаблонов до json/xml/другой формат.
Хорошо-плохо зависит от области применения. Если на фронте нет сложного интерфейса, то такой подход может быть избыточен. Применять реакт к лендингу с одной формой - оверинжиниринг. Быстрее на php шаблон сделать и пару строчек на жс написать.
Ну, например, при таком подходе сильно увеличивается время загрузки страницы.
При "стандартном" подходе браузер отправил запрос, получил отрендеренную страницу, подгрузил минимальные CSS и JS файлики (содержащие нужные только этой странице стили и скрипты) и отобразил.
При подходе с использованием реакта браузер сначала грузит страницу-прелоадер, CSS и JS для нее. Затем он грузит огромное тяжелое реакт-приложение. Затем оно запускается и отправляет аякс-запросы для загрузки данных. И только затем рендерится.
Разумеется, такое тяжелое приложение потребляет больше памяти компьютера и создает большую нагрузку на процессор.
Конечно, если ты делаешь какое-то приложение, в которое пользователь заходит и весь день работает, то, наверно такой подход приемлем. Можно немного подождать ради более быстрой работы в дальнейшем. Это подходящая технология для корпоративных приложений.
Но если ты делаешь сайт вроде блога, учебника, то по моему, это плохой подход. Человек ищет информацию, открывает все ссылки подряд из гугла и хочет получить эту информацию как можно быстрее, а не смотреть на прелоадеры.
Сколько я не видел SPA-приложений от крупнейших компаний - все тяжелые и тормозные, и с прелоадерами.
Сап, ПХПач
Таинственная проблема с Laravel:
есть веб-сервис на ларавел, последние изменения в его код вносились в начале 2020 года, всё работало, его не трогали
Внезапно оно перестало работать, в логах Nginx указана 500 ошибка
Любой route с любыми параметрами возвращает пустую страницу
Пробовал в контроллерах прописывать строки вроде "echo 'asd'; exit(); ", никакого результата
То же самое делал в Index.php - тоже никакого эффекта
Пытался включить debug mode в env и config/app файлах, нет результата
В общем, веб-сервис выдаёт пустую страницу на любой запрос. Изменений в код не вносили.
Куда копать? У меня нет идей
> в логах Nginx указана 500 ошибка
Как правило там же и написанно чем она вызвана.
Раз изменение в public/index.php(ты же его пробовал) не помогло-ты или не тот сайт редактируешь, либо конфиги вебсервера по пизде пошли. Это первый файл запускающийся же.
ошибка до автолоадера или после? До бута Kernel или после? Ты дебаг делал вообще или мы тут псайкеры дохуя?
Идиократия
public static function foo($arg) : Something
тайп хинтинг
в public/index.php в первой же строке после <?php ставь пробел, и пиши die('qq'); Если после этого твой сайт начал отдавать qq вместо ошибки-проблема в сайте, если нет-в веб сервере. Но вообще с таким уровнем знаний ты её не решишь.
Спасибо. Пихал dd() куда только мог, нет результата
Посмотрел версию ПХП - 5.4
Долбоёбский хостинг произвольно сменил версию ПХП. Уже год так не делали, я и расслабился...
Возвращаемый тип
Не стоит вскрывать эту тему
>интерфейсы
Чтобы код был завязан на контрактах, а не конкретных реализациях.
>абстрактые классы
Чтобы определять какую-то абстрактную логику.
Задумайся для начала зачем вообще нужные классы, если можно процедурки хуярить и всё будет отлично работать
Чтобы организовать большие объемы кода
Интерфейс нужен, когда есть несколько независимых классов, выполняющих похожую задачу. Например: тебе надо принимать адрес от пользователя и преобразовывать его в координаты. Для этого существуют службы геокодирования (допустим, Яндекс и Гугл). У каждой из них свой формат обмена данными. Но действие выполняется всегда одинаковое: преобразование адреса в координаты. Тебе не хочется, чтобы код был привязан к одной какой-то службе, а хочется, чтобы он мог работать с любой.
Ты можешь сделать интерфейс для геокодера, и написать 2 класса, реализующих этот интерфейс для каждой службы. Теперь, если твой код завязан на интерфейс, то ты можешь передать в него любой из классов и он будет корректно работать. Если завтра появится необходимость подключить третью службу, тебе достаточно будет дописать еще один класс, реализующий интерфейс. Остальной код переделывать не потребуется.
Еще немного про интерфейсы тут: https://github.com/codedokode/pasta/blob/master/php/interfaces.md
Абстрактный класс нужен когда есть несколько схожих классов, у которых есть общий функционал, а есть различающийся. Например, ты делаешь систему скидок. Один вид скидок зависит от дня недели, другой от суммы покупки, третий от истории покупок. Ты можешь каждый вид скидки представить классом. При этом у них будет как общий функционал, так и различающийся (общее у них то, что их можно применить к корзине и получить скидку, разное у них то, как они определяют скидку). Ты можешь сделать базовый класс, общий для всех скидок, и от него унаследовать конкретные классы для каждого вида скидки.
>если можно процедурки хуярить и всё будет отлично работать
Так и делаю, мне норм.
мимо луакодер
> 9 июля 2020 года Дэйл Хирт (англ. Dale Hirt), менеджер проекта PHP в Microsoft, в рассылке php.internals выпустил сообщение[36] о том, что после выпуска версии PHP 8.0 Microsoft прекратит поддержку разработки этого языка программирования для Windows[37]. Специалисты Microsoft занимались компиляцией бинарных версий интерпретатора для ОС Windows и тестированием их безопасности. В сообществе разработчиков PHP сообщили, что примут все необходимые меры, чтобы найти в ближайшее время альтернативный вариант для организации поддержки PHP 8.0 и выше для Windows, например, своими силами[38].
Ну шо, аноны, пыха всё?
C#?
За 4 конторы не встречал таких
Изредка запускаю пхп из под винды. Хотя в шторме настроен запуск через докер
Два чаю. Я хоть и шиндузятник, но как только понял как работать с виртуалОЧКОй сразу туда перекатился, а уж теперь то при живом всл и дешевых впсках вообще грех на шинде запускать. Тестовая среда всёж таки должна быть максимально похожа на ту в которой прод будет, а прод на шинде держать-кретинизм.
Пхп прод держать на винде в некоторых случаях невозможно.
Некоторые экстеншены к пхп на неё тупо не ставятся.
Сколько же я намучился с имейджмеджиком...
Крад, рега, сторонние айпиай... Спасибо. А можно тыкнуть конкретных пару примеров, а то все равно в голову ничего не приходит, особенно со сторонними айпиай :/ Фантазии нет совсем, не быть дизайнером фронтенда мне.
Сделать сайт, который бы предлагал юзеру пройти тесты по разным областям знаний
На первом экране сайта юзер авторизуется (регистрируется) и выбирает тест из нескольких
На втором экране он отвечает на вопросы, заполняет форму (с формами я разобрался - здесь имеется ввиду выпадающий список)
На третьем экране тоже отвечает на вопросы, заполняет форму (но уже форма другого вида ставит галочки)
Надо связать ответы юзера из разных форм и занести в БД
На последнем экране юзер видит свои ответы и ему показываются правильные ответы.
Стоит ли браться за такое тестовое задание если ни о Симфони ни о Доктрине раньше не слышал, но готов их усердно изучать?
На ютубе есть начальный курс как запилить приложение на Симфони - простейший блог, но с БД.
Я его освоил (скопировал код и запустил) Сложность для меня как для новичка это реализовать саязывание ответов из второго и третьего шага.
Заранее спасибо за любую подсказку)
для мультишаговой формы есть готовое решение, которое до сих пор работает (я ставил себе тестовую демку)
https://github.com/craue/CraueFormFlowBundle
Но там во первых CRUD, во-вторых я думаю это не совсем правильно собирать по кусрчкам себе приложение
тот же
$this->subsystem1 = $subsystem1 ?: new Subsystem1();
$this->subsystem2 = $subsystem2 ?: new Subsystem2();
}
Что здесь за схлопнувшийся тернарный оператор "?:" Что это значит?
А понятно, посмотрел тот же код на нормальном языке, это оператор ||
Учить шарп и развиваться в этом направлении? (десктоп разработка)
Учить пыху и ларавельку и развиваться уже там?
да отстань от меня говноед
Шарп/ява на сегодняшний день не оставят без заработка, в будущем вероятнее тоже. РНР только поддержка легаси. Новых, востребованных рынком, продуктов нет и не предвидятся. Я бы рассматривал РНР в ознакомительных целях исключительно. Связывать свою жизнь с веб-пердолингом для тех, кто не может в нормальные языки и умение программировать.
>поезд ушел
Надо сказать знакомым 35 и 38 лет, чтобы увольнялись со своих мест и шли обратно на старые работы - поезд-то всё, ту-ту, ушёл, а они и не знают.
>34 - слишком великовозраст для реального шанса на вкат
Я эту хуйню про ПОЗДНО ВКАТЫВАТЬСЯ кроме двача нигде не видел почему-то. Есть, конечно, ебучие конторы, которым надо вчерашнего студента, который еще не понимает, что такое деньги и зачем они ему, кроме как купить приставку, пивас и пиццу, чтобы недоплачивать ему. Но такого говна и вне айти дохуя. Вопрос, нахуя туда вообще идти работать. Ответ, возможно, кроется в народной мудрости - свинья грязь везде найдет.
Я сейчас работаю саппортом в конторе, где есть грейд до c# разраба. Они мне говорят, что на этой позиции засиживаться не надо. Хотят, чтобы я дальше развивался. Веба в этой конторе нет.
Разрабам-шарпистам платят до 150, но не меньше 100. Мне на саппорте сходу платят 60, через год 80 планируют, если я не перейду в разработку.
Начитался в соседних тредах, что если ты в саппорте, то ты и останешься в саппорте. Почему все так думают?
Я работал уже в веб-студии когда-то, работал в тестировании. Сейчас пошёл в саппорт потому что график 2-2 (одна ночная смена есть и там тикетов дай бог 2-3 за ночь будет). Ну и при таком графике мне будет удобнее что-либо учить. Вот сейчас пиздец не знаю. Либо шарп и в этой конторе дальше за ~150 работать шарпистом, либо пыха и дальше ларавельку ебашить и найти что-нибудь за 80 jun+ уровня.
К слову, на пыхе могу простенькое круд-приложение запилить с MySQL. И Ajax ебануть, но это уже с гуглом.
Может что дельное подскажешь/подскажете?
>Начитался в соседних тредах
Не читай советских газет двач. Тут какой-то иной мир, параллельная вселенная. Кто-то где-то что-то услышал, или кого-то пидорнули, и теперь ОСТАНЕШЬСЯ В САППОРТЕ.
>Они мне говорят, что на этой позиции засиживаться не надо
Тебя практически приглашают разрабом стать, ты понимаешь это?
Да я первую неделю работаю только. Они сразу сказали, что есть куда расти и через год можно смотреть в сторону c# или программист АСУ ТП. Про второе не знаю даже что это такое. Если реально есть такая возможность, то при своём графике 2 дня после 2 смен готов въёбывать.
Просто не очень хочется наебаться с выбором ЯПа.
>Аноны, что можно сделать в качестве пет-проекта?
Верстай копию вот этого:
http://www.12542.ru/pg_0003.htm
>Разрабам-шарпистам платят до 150, но не меньше 100
Если там свеженький нет кор, то збс, потом можно будет срулить на х2.
>Начитался в соседних тредах, что если ты в саппорте, то ты и останешься в саппорте. Почему все так думают?
Потому что пока ты сидишь в саппорте ты не развиваешься как разраб - опыт кодинга для прода не капает, петы ты явно не пишешь, а время идет
>Я работал уже в веб-студии когда-то, работал в тестировании
Та же история. Чтобы стать разрабом надо писать код
>Вот сейчас пиздец не знаю. Либо шарп и в этой конторе дальше за ~150 работать шарпистом
Неплохой вариант, но запрыгивать надо поскорее
>ибо пыха и дальше ларавельку ебашить и найти что-нибудь за 80 jun+ уровня.
Если б у меня в своё время был варик идти в шарп бекенд вместо пыхи, я бы пошел не задумываясь.
В пыхе сплошное легаси и даже на относительно свежих проектах (которых практически нет) не веет новизной технологий, а с кода хочется плеваться. Из плюсов пыхи пожалуй слабенький возрастной ценз - можно спокойно заходить в индустрию хоть в 30, хоть в 35 лет. И относительная простота по сравнению с дот нетом
>Они сразу сказали, что есть куда расти и через год можно смотреть в сторону c# или программист АСУ ТП
Это могли сказать, чтобы ты сидел на саппорте и не рыпался. А потом то время не то, то проекта под тебя не будет, то еще чего.
>Просто не очень хочется наебаться с выбором ЯПа.
Пхп не от хорошей жизни выбирают
- Крайне низкий ценник относительно других стеков
- Система написана армией школьников/студентов, качество кода соответствующее, архитектура отсутствует
- Система очень глючная, тормозная и тяжело поддается дебагу
- Среди других разрабов считается зашкваром ковыряться в битриксе
Подробнее можешь сам почитать:
https://habr.com/ru/post/282333/
А, может, кто-то уже подумал и где-то просто и доступно написано, зачем нужны классы?
Есть какие-то пруфы, что якобы "PHP не используется в новых проектах"? По моему, это просто ничем не подтвержденное вранье от использующих какие-то другие, не особо востребованные языки программирования.
PHP на сегодняшний день активно используется в вебе. Он лучше JS тем, что у него не течет память, как у приложений на Ноде, в нем есть тайп-хинты и ООП, и можно писать удобный, легко читаемый синхронный код вместо нечитаемой лапши из промисов, await и что они там еще придумали, лишь бы не писать нормально. Он лучше Го тем, что в нем нормальный ООП, и PHP не пытается быть "не таким как все". В PHP удобнее и проще работать с массивами, чем в Го. В PHP не надо явно возвращать ошибки, как в Го.
А уж запускать и разворачивать приложения на PHP куда как проще, чем на JS и Go, и поганый Докер не требуется (Докер это штука, которая запускается из-под рута, создает тонны неужных образов на каждую строчку докерфайла и может менять настройки вашего фаерволла, открывая хост для доступа снаружи. Например, у одной компании Докер после выгрузки на прод открыл доступ к монге, и вандалы дропнули ее содержимое).
Тут есть немножечко по MVC с примером кода, но не знаю, подойдет ли: https://github.com/codedokode/pasta/blob/master/arch/mvc.md
>>087891
Не знаю, почему так. Попробуй проверить в другом браузере. Также, ты можешь писать код в редакторе, и только копировать в ideone для запуска.
>>087960
Там без знания Си делать нечего.
Забудь про "просто и доступно написано", если это касается чего-то сложнее чем "Hllwrld". Ты программист или может быть однажды им станешь - привыкай думать головой, не опираясь на слова Васи с форума.
Если не понимаешь, зачем нужны классы - значит они тебе не нужны. Пиши без них. как же заебись, что можно говнокидить дома и техлид не убьет
Как только поймешь, что что-то не так и вспомнишь про классы - пойди и прочитай доку еще раз. Если в голову ебнет мысль "ля, так оно мне и нужно" - круто. Если нет - жди дальше.
Если коротко: ставьте скобки, чтоб все работало "как надо".
В консоли(терминале) хоть запускаешь?
Ты не понимаешь что феминизм победил и сейчас везде тянки - хрюши, тимлиды, начальницы всех мастей и т.д. Как думаешь к кому они будут более благосклонны - гречневику за 30 или молодому шутливому зумерку?
Используй PHP_EOL
Да. Умирающее неговно.
>Пхп не от хорошей жизни выбирают
Мне кажется, потратить полгода на изучение голой пыхи и ларавельки с sql и ты уже спокойно джун в дс за 60к и больше. В шарпе я буду год только учиться, как минимум.
Если ты запускаешь свой скрипт через веб-сервер и браузер, то выводимый скриптом текст браузером воспринимается как текст в формате HTML, а там перевод строки равносилен пробелу.
Чтобы переносы строки работали, поставь в начало скрипта
header("Content-Type: text/plain; charset=utf-8");
Это выдаст заголовок, который заставит браузер воспринимать текст как обычный текст, не в формате HTML.
Или ты можешь изучить HTML и использовать теги HTML для форматирования.
Более того, ты выучишь основы C#, придешь на собеседование, а там будет умник с вопросами по Си вроде "расскажите, где хранятся локальные переменные? Почему именно там, а не где-то еще", "расскажите, что такое куча и как она устроена", "расскажите, почему используется JIT и почему не используется AOT компиляция", "расскажите, почему программа компилируется в байткод".
А в PHP таких вопросов не будет.
И, кстати, если у кого-то есть вопросы про кучу, байткод или локальные переменные, в нашем треде на них ответят.
Зашел в фл.ру. Там много заказов за 1000 р. на Битриксе. На апворк не пускают.
изначально думал еще проверять слово английское или нет путем подсчитывания количества английских/русских букв, но это не очень эффективно, потому что в таких, например, словах: всем, оно, мы, меня, тогда и т.д. Здесь программа может решить, что это английское слово, ведь тут могут быть все буквы английскими. Хотя мой вариант: проверка по уникальным буквам типа "d, v, b, h, t" - тоже не 100% вариант, но выглядит, кажется, лучше, потому что слово "всем", написанное чисто английскими буквами определится как русское и, соответственно, все ангельские буквы заменятся на русские, а в первом варианте не заменятся. Можно конечно сделать и ту проверку и эту проверку, то есть всё объединить и получится, наверное, более достоверно. В общем, устал уже думать, как достичь 100% варианта. Надо переходить к некст задачам и темам. Что скажете? Сами как решили? Буду благодарен за фидбек.
>ведь тут могут быть все буквы английскими
с и c-разные символы так то, хоть и выглядят идентично, и даже одной кнопкой печатаются...
так в задаче как раз такой вид ошибок и есть, что в тексте встречаются русские слова с английскими буквами, которые выглядят идентично, и английские слова с русскими буквами, а суть задачи в том, чтобы исправить это, сделать так, чтобы русские слова были написаны только русскими буквами, а английские только английскими
ещё один хоронильщик
>в чем отличия
В подходе архитектурном.
>и какие сферы применения
Весь спектр веб приложений у обоих.
>На какой лучше потратить время для изучения
На тот который на рынке лучше себя будет чувствовать через 5 лет.
Скорее всего оба, если судить по тому, что на yii до сих пор полно работы, хотя он уже лет 6 как не развивается. А на лару и симфу регулярно выкатывают обновления
>Это который?
А этого тебе точно никто не скажет. Если всё пойдёт хорошо-оба как выше отписали. Но может внезапно появиться конкурент который обоих выпиздит, или заставит меняться так сильно что старые знания станут малополезными. ИМХО оба примерно одинаково перспективны. Но вроде как у ларки побольше работодателей прямо здесь и сейчас (по крайней мере я за последний год на неё больше получил предложений, чем на симфони).
Вот это хоть убейте - нагуглить не могу, пытался вставлять как получается, либо отправляется как есть "$name", либо вообще пустое тело письма
<?php
$to = '
$subject = Subject';
$message = 'Hello, it's a message.';
$headers = 'From:
'Reply-To:
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
?>
Заранее спасибо
>может внезапно появиться конкурент который обоих выпиздит, или заставит меняться так сильно что старые знания станут малополезными
Не, технологии веба достигли своего предела. Ничто уже не появится, никто никого никуда уже не выпиздует.
Заниматься матешей в соло я пробовал, начал с нуля, хотя знания в принципе были вплоть до 11 класса, но хотелось, чтоб было без пробелов, поэтому начал с книги для 5-6 классов. Прочитал ее, дальше не смог заставить себя читать. Это нереально скучно.
Спасибо, уже сам разобрался
Максимум пригодится, если на собесе попадется алгошизик. А так графы на проде не встречал
>Пхп не от хорошей жизни выбирают
А какой от хорошей жизни выбирают? Лисп ебучий борщехлебный?
По моим наблюдениям фреймворки просят вообще чтобы, типа, тыжпогроммист был хороший. Периодически встречаю вордпресс-вакансии с требованиями знания фреймворка, причём почти всегда перечисляют их через строку. Скорее всего у тебя нерелевантно - нужно считать количество проектов, а не хотелки кабанчиков.
кто будет пользоваться - платите по 100$ лично мне, спс
Стандартный сценарий такой:
1) Пользователь делает заказ.
2) Скрипт работает, сохраняет заказ в базе данных, пишет емейлы пользователю а так же десятку сотрудников. Всё это время пользователь ждет.
3) Когда вся работа завершена, пользователь получает подтверждение заказа.
Цель:
1) Пользователь делает заказ.
2) Мгновенно получает подтверждение заказа.
3) Скрипт продолжает работать, сохраняет заказ в базе данных, пишет емейлы пользователю а так же десятку сотрудников.
Можно конечно же сделать что-то подобное при помощи кронджобов, но мне не нравятся кронджобы.
Есть еще другой вариант с отправкой джаваскрипта всместе с подтверждением. И этот джаваскипт сделает аякс запрос другому скрипту, который доделает работу с отправкой емейлов. Впрочем такой вариант тоже имеет массу недостатков.
Как же быть?
>Господа, в какой момент понадобится математика выше школьного уровня? Всякие графы, дискретки и т.д.
В тот моменнт, когда ты решишь начать заниматься чем то что требует графов, дискреток, итд.
Это не про типичный веб. У меня за 9 лет практики было ноль ситуаций когда его бы не хватало (вкатился со школы).
Я вижу 2 варианта:
1)Ты попадёшь на проект в котором предметная область требует знаний (и то я хуй знает в какой предметной области всё это может понадобиться в рамках веб-приложения).
2)Ты попадёшь в другую ветку программирования(разработка движка для игры там, или что нибудь алгоритмически дохуя сложное).
Если же ты планируешь сайтики клепать-нахуй не нужно.
Можно клонировать процесс. В ларавеле есть стандартные средства для очереди задач. Можно самому на каком нибудь реддисе, или мемкешде организовать очередь, из которой задачи забирать демон-процессом отдельным.
По факту возразить сможешь? Программирование это не естественная, а абстрактная наука. Все важное что могло быть изобретено для веба, уже было изобретено. Дабы времени было предостаточно. Разве что маленькие косметические улучшения будут.
Не надейся на какое чудо, которое вот-вот придумает, и которое все поменяет.
>Все важное что могло быть изобретено для веба, уже было изобретено
Чел, от того что ты и я не видим развитие наперёд оно не останавливается. Технологии развиваются, и развиваются постоянно. Вебу всего 30 лет, какое нахуй "предостаточно времени"?
Ебучие ДВС которым 100 лет в обед всё ещё развиваются, хотя "всё что было можно изобрести было изобретено" ещё в 70/80/90/00х годах в зависимости от твоей любимой эпохи машиностроения.
Хуевое сравнение. ДВСы это объекты реального мира, чтобы их как-то исследовать и улучшать нужны большие и ресурсы и время на эксперименты.
Код - это блять просто написанные символы. Единственный ресурс, необходимы для его улучшений - это мозговитые ребятки. И 30 лет этим ребяткам было достаточно для того чтобы выжать около-максимум.
Не жди каких-нибудь значимых улучшений.
>И 30 лет этим ребяткам было достаточно для того чтобы выжать около-максимум.
С одной стороны 95+процентов современных концепций программирования были изобретены ещё в 80х и ранее. С другой-мы периодически переживаем то очередную контейнерную революцию, то массовое внедрение нейронок благодаря прогрессу в железе, то серьёзное смещение в балансе парадигм программирования (элементы функциональщины всё больше и больше проникают в прикладное ПО).
Плюс может поменяться модель потребления смартфоны изменили этот наш веб крайне сильно, например.
Да банально:нейронки могут улучшить автокомплишен до состояния "ввёл название функции, тело сгенерилось само", что позволит ещё выше в абстракциях подняться, быстрее и эффективнее генерить объёмы кода, и благодаря этому могут новые подходы возникнуть. Совершенно не принципиально материальный у нас продукт или нет, эволюция инжинернойили говнокодерской мысли происходит постоянно.
Я не говорю что будет обязательно что то революционное, но я говорю что появление новых инструментов, или эволюция текущих может координально поменять твою работу, и отрицать это-глупо и недальновидно.
>сохраняет заказ в базе данных, пишет емейлы пользователю а так же десятку сотрудников. Всё это время
>Всё это время
это должно занимать примерно 0 секунд
>Можно ли в php отдать ответ пользователю, но продолжить работать еще некоторое время?
Можно, session_write_close() и fastcgi_finish_request(). Но в твоем случае лучше очередь.
>нейронки могут улучшить автокомплишен до состояния "ввёл название функции, тело сгенерилось само"
Скорей бы
>fastcgi_finish_request
Судя по описанию это именно то что я ищу.
Правда у меня появляется фатальная ошибка
Call to undefined function fastcgi_finish_request()
Видимо причина этого кроется в том, что FastCGI у меня не используется.
Неужели разработчикам PHP было так сложно написать функцию
finish_request, которая работала бы всегда, не зависимо от того, используется ли FastCGI или не используется?!
Легаси тоже нужно кому-то поддерживать
Я бы шарпы взял, а там в нет кор
В общем удалось решить проблему следующим образом:
Первый скрипт, тот который подтверждает заказ, отправляет
запрос второму скрипту при помощи curl с таймаутом в одну секунду.
Второй скрипт имеет директиву ignore_user_abort(true); и выполняет всю долгую и сложную работу.
В итоге пользователь, который запустил первый скрипт, ждет всего-лишь секунду таймаута и несколько мгновений подключения через curl.
Я конечно понимаю, что это решение - костыль. Но оно работает и это главное.
Как повезет.
Обычно либо блейд, если там какой-то древний проект или денег на фронтов не хватило. Либо вуе, что тоже такое себе, при чем фронт тоже беки пишут
>фронт тоже беки пишут
Представляю какая там хуйня понаписана.
Проще взять бутстрап для UI и не ебать мозг.
Ебать, ты к нам из 2010 года?
>PHP на сегодняшний день активно используется в вебе
Перевожу на русский. Кроме веба нигде нельзя использовать. Охуенный плюс, безоговорочная победа.
>Он лучше JS тем, что у него не течет память, как у приложений на Ноде
Ясен хуй, если писать не приложение, а просто скрипт, который последовательно выполняется и умирает.
>в нем есть тайп-хинты и ООП
Даже в сраном го есть тайпхинты и ооп. Напиши кста тайпхинт для метода, принимающего функцию, которая принимает строку, а возвращает число.
>можно писать удобный, легко читаемый синхронный код вместо нечитаемой лапши из промисов
Перевожу на русский. Нельзя писать асинхронный код. Опять только выиграли.
>Он лучше Го тем, что в нем нормальный ООП
Щас в го подвозят дженерики, а ты и дальше пиши по стопицот классов на каждый пердеж.
>В PHP удобнее и проще работать с массивами, чем в Го
В пхп нет массивов, только хеш мапы
>В PHP не надо явно возвращать ошибки, как в Го
Праильно, а нахуя явно возвращать? Мы же НОВЫЙ проект пишем, пущай с этими ошибками ебуться когда он станет легаси (через месяц)
>А уж запускать и разворачивать приложения на PHP куда как проще, чем на JS и Go, и поганый Докер не требуется (Докер это штука
Нам он и нахуй не нужон, докер ВАШ! У Пятровны вишь эта хуйня магическая САМА доступы открыла. В фаерволе шебуршит безбожник. Сладу с ним нет. Не по нашенски енто. Тут закал столетний, виртуалбоксовский. Тут вагрантом фонит по низам. Тут мужик свою виртуалку, свою bsd стережет накрепко.
>В итоге пользователь, который запустил первый скрипт, ждет всего-лишь секунду таймаута
Ты сука гонишь что ли, всего лишь секунду...
У меня самые тяжелые скрипты секунды полторы отрабатывают, и каждый раз я проверяю точно ли не нужно воркер заюзать в этом месте.
PHP решает свои задачи и решает их отлично - рыночек порешал, а что там пердит очередной борщехлеб всем насрать. Нечего там разъёбывать. Да и не написал он ничего конкретного - манька себя "погроммистом считает", а остальных - говном.
Запилил по учебнику простейшую форму заказа с магазина и их обработку, но при этом не выводится цена и сумма, может кто проверить и посдказать?
http://sandbox.onlinephpfunctions.com/code/49ad22cddd2fa4d61bc080570e933814a2471605
А все, забыл прописать ПОСТ к переменным
ООП обязательное требования для современной промышленной разработки.
МОЙ ВОПРОС ПО РНР. Насколько в 2к21 году популярна верстка на РНР-шаблонизаторах типа twig? Мне как вонаби верстальщику надо учить twig и учиться верстать на РНР-шаблонизаторах?
Короче, проблема проста, на на простейший get реквест получаю 401 unauthorized.
На сайте логин не требуется, прозреваю что ему нужны Куки.
На моём языке в сетевых либах есть возможность заСэттить кукисы, крайне много дрочился с этим, но после сеттинга валится ошибка что-то в стиле "already connected" соотв header засеттить не могу. Да и продебажить толком не получается.
Дальше пока сумбурные мысли о том, что нужно послать какой-то хитровыебанный header в реквесте. Хуй его знает. Что думаете? Где я жидко обосрался?
Смотри в браузере, в инструментах разработчика что там отдаётся и принимается. Нам отсюда не видно куда ты пытаешься попасть и как, да и влом, если честно.
Времени у меня заняло неможечко ДОХУИЩА!
Потому что я учился в компьютерной шараге, не знал кем и куда я хочу пристроиться.
Я вообще не думал о будущем. Я думал о том как сдать предметы в шараге и не угодить защищать сапоги. Преподы всех вечно пугали отчислением, только я омежка сыч на это вёлся. Когда остальные Ерохи хуй ложили и были правы! Потому что моя шарага МухГУ в итоге выпустила с дипломами всех, кто тупо ходил на пары и не терялся подолгу!
Другие ребята думали о будущем, один челик, например, уже с 2 курса компьютерной шараги решил для себя, что не будет ничего делать по учебе, потому что учеба учит какой-то хуйне, а будет только вкатываться в веб.
Так вот, во время шараги я как лох занимался деланием домашки по мутным предметам, которые реально ничего не дают!
Так что постепенно вкатываться в вёрстку я начал аж 5 лет назад, когда поступил в шарагу! Я тогда начал дрочить штмл, цсс и пытаться верстать лендосы. Но я всё время бросал, потому что учеба в шараге требовала делать вообще другое. В шараге решали математику, физику, было море гуманитарных предметов не относящихся к специальности, учились паять, изучали устройство ПК правда устаревшее, мы, например, дискеты изучали.
Я закончил шарагу год назад. Меня пытались уволочь в армию. И пришлось в дурку ложиться. 10 дней в дурке провисел.
Извините, за изливание душе. Я искренне извиняюсь за своё существование. Я просто очень долго уже 5 лет не могу вкатиться в вёрстку. Извините.
Поддерживаю молодого человека выше. Анон, что за настрой?
Соберись, возьми себя в руки и иди покорять что угодно.
Все у тебя получится.
Анон возьми себя в руки, че ты в самом деле. У многих в жизни ситуации бывает хуже. Я например, чуть ли не бомж. И это никак не оправдывает, моё бездействие. Нужно дальше действовать. И в армейке отслужил итд. Решай проблему постепенно, разделив на более мелкие задачи. Так проще будет, и удачи.
У html задан затемненный фон, body - основное рабочее поле, и оно сейчас половину снизу подрезано затемненным фоном. Как body до конца продлить вниз без абсолютных величин?
Ладно, похуй.
Это неправильное решение. strrev работает только с устаревшими 1-байтными кодировками и не переворачивает строки, закодированные в utf-8. Попробуй сам проверить свою программу на строке с русскими буквами в utf-8.
height: 100% сработает только если у родителя height жестко задан - в %, пикселях или другой величине. Причем, если у родителя height в %, то соответственно у его родителя тоже должен быть задан height.
У тебя скорее всего не задан height у html. И еще, скорее всего, на body тебе нужен не height, а min-height.
Это может быть связано с чем угодно, если у тебя например в инкогнито заходит на страницу, то возможно что сервер смотрит на юзер агент, а твой хттп клиент отправляет или своё имя, или вообще ничего. Но вообще скорее всего или какие-то куки ставятся, или еще какой-то хитровыебанный хедер. Тебе правильно посоветовали, открой девтулз и посмотри какие там ответы приходят
>анон, что за настрой... ты хоть попробывал вкатиться?
Извините, просто я чет бомбанул, теперь неловко за свою пасту. Нет, я не пробовал вкатываться в работу, чувствую, что не готов, надо готовиться, учиться. Спасибо большое за совет, буду настраиваться быть ровнее и чётче.
>>092740
Благодарю, буду стараться
>>092748
Блин, ты крут, что в армейке отслужил, красавчик. А я зассал, что меня там Ерохи напихвают и через дурку закосил, 10 дней там зависал, потом тесты проходил. Врач спрашивает вопросы, я отвечаю, она в компьютере заполняет. И когда вопросы закончились, я хотел заглянуть в монитор, какой там результат. И врач отвернула монитор, чтоб я не видел, что там. Так и не узнал что мне написали, чем я болен. Хотя мне пофиг, главное, что перестали меня после этого вызывать защищать сапоги. Ещё был мужик прикольный пациент, он когда узнал, что я от военкомата, то он стал пританцовывать и говорить стишки типа "мама - поликлиника, отец - военкомат".
Прошу прощения, что-то меня понесло. Большое спасибо за совет, я буду стараться.
Получается, что у меня есть немного знаний, к ним добавляется шизоидное желание писать клин код, а в результате получается обфускейтед поебота типа FizzBuzzEnterpriseEdition, только все-таки не особо расширяемая.
Например флоу такое: в контроллер инжектится http-реквест. Контроллер преобразует http-реквест в дто (в laravel есть FormRequest, а в symfony я его сымитировал через ParameterResolver). Сервисы получают дто-запрос, отдают дто-ответ. Контроллер перобразует дто-ответ в http-респонс. Сервисы - это домен-сервисы, которые инжектятся через интерфейсы.
Воот, в моей реализации получаются следующие проблемы:
1. Жирные интерфейсы (как бы с нарушением interface segregation). В них просто круды прописаны, но вот захочу я завтра создавать-сохранять модели по-другому: мне весь круд переписывать надо будет (ну можно старый декорировать конечно, но все-равно мне кажется, что это не правильно). При этом не хочется впадать в другую крайность: дохуя интерфейсов (один - для сохранения, другой - для удаления и т.п.) - кажется, что это плохая идея. Че делать?
2. Также не понимаю как сделать легкозаменямые дто. У меня получается привязка к очень конкретным типам (вплоть до new в контроллерах). Кажется тут может помочь фабрика, но в них я еще, не шарю. Не понимаю как через них дто делать (и надо ли?), потому что в случае фабричного метода нужна логика на уровне фабрики, а в случае абстрактной фабрики дто будет на уровне интерфейса, что по-моему, не имеет смысла, так как дто нужно будет что-то делегировать, а нахуя ему что-то делегировать?
3. Когда я вернулся через две недели к своему коду, я тупил как я там собираю ошибки и откуда берется этот дто. Это говорит либо о моей тупости, либо о том что код реально запутанный, либо, что последнее - это следствие первого.
Примерно так я и мучаюсь. Может на реальных проектах научат как делать надо? Или наоборот - надо сперва уметь, чтобы туда попасть?
Получается, что у меня есть немного знаний, к ним добавляется шизоидное желание писать клин код, а в результате получается обфускейтед поебота типа FizzBuzzEnterpriseEdition, только все-таки не особо расширяемая.
Например флоу такое: в контроллер инжектится http-реквест. Контроллер преобразует http-реквест в дто (в laravel есть FormRequest, а в symfony я его сымитировал через ParameterResolver). Сервисы получают дто-запрос, отдают дто-ответ. Контроллер перобразует дто-ответ в http-респонс. Сервисы - это домен-сервисы, которые инжектятся через интерфейсы.
Воот, в моей реализации получаются следующие проблемы:
1. Жирные интерфейсы (как бы с нарушением interface segregation). В них просто круды прописаны, но вот захочу я завтра создавать-сохранять модели по-другому: мне весь круд переписывать надо будет (ну можно старый декорировать конечно, но все-равно мне кажется, что это не правильно). При этом не хочется впадать в другую крайность: дохуя интерфейсов (один - для сохранения, другой - для удаления и т.п.) - кажется, что это плохая идея. Че делать?
2. Также не понимаю как сделать легкозаменямые дто. У меня получается привязка к очень конкретным типам (вплоть до new в контроллерах). Кажется тут может помочь фабрика, но в них я еще, не шарю. Не понимаю как через них дто делать (и надо ли?), потому что в случае фабричного метода нужна логика на уровне фабрики, а в случае абстрактной фабрики дто будет на уровне интерфейса, что по-моему, не имеет смысла, так как дто нужно будет что-то делегировать, а нахуя ему что-то делегировать?
3. Когда я вернулся через две недели к своему коду, я тупил как я там собираю ошибки и откуда берется этот дто. Это говорит либо о моей тупости, либо о том что код реально запутанный, либо, что последнее - это следствие первого.
Примерно так я и мучаюсь. Может на реальных проектах научат как делать надо? Или наоборот - надо сперва уметь, чтобы туда попасть?
Ты хотя бы один реальный рабочий пет-проект сделал? Все эти траханья с архитектурой имеют смысл, когда ты шишек набил, а без опыта это всё называется интеллектуальная мастурбация. Завязывай - с этим долго и бесполезно играться можно. Поверь моему опыту.
Ну и да - не гонись за идеальным кодом. Хороший программист знает где почище надо сделать, а где говна поднакинуть, но побыстрее чтоб. Это у тебя ещё детские какашки после стерильных туториалов не вышли - как увидишь реальный проект, так сразу отпустит.
пофигу, зависит от вакансии
Мы тут обсуждаем как бэк делать. С таким вопросами в тред по фронту.
Когда как. От 6 до 12 часов. Стараюсь чтобы последнее было как можно реже. В среднем 7-8 стараюсь.
Это если про работу.
Иногда сижу-пержу делаю своим мутки для души. Плюс на них в зависимости от усталости/времени/желания от 1 до 4. Но это не каждый день
Это без учета прокрастинации и пинания хуев? 7-8 чистого эт очень серьезная производительность.
Самый большой секрет - не слушать музыку и не смотреть никакого говна на фоне.
Ну и плюс высыпаться.
Правда сегодня у меня на работе новой пинания хуев официальные, ибо мне для проекта api ещё не завезли для бизнес логики (ТМ).
>не слушать музыку
Хз мне под пситранс или эмбиент норм делается. Что-то в этом стиле:
>не смотреть никакого говна на фоне
А как его можно смотреть? У меня, например, концетрация с потоком в процессе и я просто не вспомню о чём там было.
Алсо, советую после каждой выполненной задачи делать небольшие перерывы.
>>093590
Я сам в процессе обучения, если я только читаю или смотрю видосы, то если за день 4 часа наберется, то это очень хороший результат для меня. Больше читать/смотреть меня мой мозг нахуй посылает. Если пишу что-то для практики, то 5 часов чистого написания уже супер, в среднем часа 4 за сутки. Больше не получается из себя выжать. Без выходных каждый день занимаюсь.
Хз почему так, может я ленивая жопа, может со временем когда это до автомата все дойдет будет легче выходить и получится больше по времени работать, но меня моя продуктивность не устраивает. Хотел бы тоже часов по 6 хотя бы хуярить в день.
>Самый большой секрет - не слушать музыку и не смотреть никакого говна на фоне.
Сегодня попробовал и охуел. Это реально работает, лол. Спасибо.
>если за день 4 часа наберется
Да нормально будет, больше и не надо, можно меньше даже.
Тут нужно учесть один немаловажный фактор, который многие постоянно упускают - учёба всегда тяжелее даётся, чем применение уже развитых умений. Т.е. 5 часов пилить код это в целом легче чем 2 часа учёбы - ты там над задачей думаешь и доки читаешь, а не думаешь над элементарными вещами. Учишься, понятно, постоянно, но в соотношении 75% уже умеешь и 25% новое.
Короче, 2 часа в день для учёбы достаточно - главное регулярность. За 3 месяца и один инфоциганский курс разработчиками не становятся.
> >не слушать музыку
> Хз мне под пситранс или эмбиент норм делается. Что-то в этом стиле:
Ну я тут не скажу за всех, но мой опыт - пробовал я эмбиент слушать, пробовал чил степы там всякие и прочее прочее. И вроде бы сначала работает. А потом начинает отвлекать мозг.
> >не смотреть никакого говна на фоне
> А как его можно смотреть? У меня, например, концетрация с потоком в процессе и я просто не вспомню о чём там было.
Многие, когда я в офисе был, так делали. Да и я сам. Ставишь какой нибудь подкаст на Ютубе / видос и слушаешь. Либо в окошко мелкое сворачиваешь.
Здесь как бы многие моменты индивидуальны. Не претендую на истину.
Как можно реализовать универсальные категории, к которым потом можно отнести как записи в блоге, так и, например, товары. Или сделать проще - на каждый модуль(блог, магазин и тд) заводить свою категорию?
Чёт туплю на этом месте. Как обычно делают?
Так-то я не про связи спрашивал, а как делают.
Порт смотри и доступы. Все серваки имеют один общий адрес, но у каждого свой портпри условии что они выполняют разные функции.
Всё, решил
Спасибо тому анону, что 7 лет назад уговорил меня уйти с работы и заняться самообразованием. Это время прошоо незаметно. Джун в 35 это нормально.
Молодец, поздравляю с удачным вкатом. Я вот только 3 года учу и на работу не берут ещё.
Пошёл велосипедить джуном на laravel свежей версии после двух месяцев дрочки пхп, в чем я не прав?
А ты красава. Не то что этот говноед битриксоид
Уметь выбирать архитектуру, конечно, было бы хорошо. Но одно дело это осознанно выбирать тот или иной подход, а другое дело - бездумно скопировать архитектуру из какой-то книги.
Не стоит слепо копировать какие-то решения. Стоит смотреть: какие есть варианты решения задачи, какие у них есть плюсы и минусы и выбирать исходя из этого.
Ну например: ты пишешь, что используешь DTO и инъекцию через интерфейсы. А для чего это нужно? Какие плюсы дает? Может быть, в твоем простом проекте без этого будет проще?
> Сервисы получают дто-запрос, отдают дто-ответ.
Здесь может получиться, что сервис залезает в зону ответственности контроллера. Ну, например, пусть у тебя есть функция поиска книги по id. И ты возвращаешь DTO с полями вида success = true, name=Название, author=Автор .... Твой сервис по сути занимается формированием view, его просили просто найти книгу, а он занимается переводом ее в JSON. В MVC это задача не сервиса, а View, представления, преобразовывать объекты в нужный пользователю формат.
>В них просто круды прописаны, но вот захочу я завтра создавать-сохранять модели по-другому
Тогда тебе надо не спешить писать интерфейсы, а посмотреть: может быть, проще без них? Может, без них придется переписывать меньше кода при изменениях?
> Также не понимаю как сделать легкозаменямые дто.
Зачем может понадобиться заменять DTO? Его делают для задачи передать данные из A в B. Зачем тебе понадобится его на что-то заменять?
> Кажется тут может помочь фабрика,
Мне кажется, ты делаешь ошибку начинающего, который прочитав про паттерн, стремится всюду его использовать, даже если проще без этого.
> Может на реальных проектах научат как делать надо?
Нет, на реальных проектах будешь писать так, как нравится ведущему программисту.
Уметь выбирать архитектуру, конечно, было бы хорошо. Но одно дело это осознанно выбирать тот или иной подход, а другое дело - бездумно скопировать архитектуру из какой-то книги.
Не стоит слепо копировать какие-то решения. Стоит смотреть: какие есть варианты решения задачи, какие у них есть плюсы и минусы и выбирать исходя из этого.
Ну например: ты пишешь, что используешь DTO и инъекцию через интерфейсы. А для чего это нужно? Какие плюсы дает? Может быть, в твоем простом проекте без этого будет проще?
> Сервисы получают дто-запрос, отдают дто-ответ.
Здесь может получиться, что сервис залезает в зону ответственности контроллера. Ну, например, пусть у тебя есть функция поиска книги по id. И ты возвращаешь DTO с полями вида success = true, name=Название, author=Автор .... Твой сервис по сути занимается формированием view, его просили просто найти книгу, а он занимается переводом ее в JSON. В MVC это задача не сервиса, а View, представления, преобразовывать объекты в нужный пользователю формат.
>В них просто круды прописаны, но вот захочу я завтра создавать-сохранять модели по-другому
Тогда тебе надо не спешить писать интерфейсы, а посмотреть: может быть, проще без них? Может, без них придется переписывать меньше кода при изменениях?
> Также не понимаю как сделать легкозаменямые дто.
Зачем может понадобиться заменять DTO? Его делают для задачи передать данные из A в B. Зачем тебе понадобится его на что-то заменять?
> Кажется тут может помочь фабрика,
Мне кажется, ты делаешь ошибку начинающего, который прочитав про паттерн, стремится всюду его использовать, даже если проще без этого.
> Может на реальных проектах научат как делать надо?
Нет, на реальных проектах будешь писать так, как нравится ведущему программисту.
Это исторически там сложилось, что браузер пытается отобразить любой HTML код, как бы он не был написан. Это привело к тому, что появились сайты с кривым HTML. Новые браузеры не хотят ломать совместимость и такие сайты. Потому в новом стандарте HTML даже описаны правила обработки ошибок:
- https://html.spec.whatwg.org/#parse-errors
- https://html.spec.whatwg.org/#an-introduction-to-error-handling-and-strange-cases-in-the-parser
Был такой стандарт XHTML, основанный на XML, который при ошибке в коде выдавал страницу с ошибкой.
> Не логичнее ли, если тег не закрыт и он парный, интерпретировать его как текст?
Вообще, правила HTML чуть сложнее. Такой HTML вполне валиден:
<p>Текст<p>текст<p>текст
Так как теги <p> нельзя вкладывать друг в друга, то открывающий тег<p> автоматически закрывает предыдущий. Аналогично работает тег <li>.
Ты должен указывать адрес хоста, где расположена БД, и порт, который она слушает. Апач тут вообще не при чем. Pgsql является сервером и сам принимает запросы.
Как вы им пользуетесь вообще?
Пробовал Eclipse с год назад - там похожее было, но там решается всё сборкой проекта и тогда ИДЕ видит всё что надо. А тут как? Не поверю, что есть такие говноеды, которые юзают ИДЕ как редактор.
Почему когда речь идёт о ИДЕ обязательно вылезет кто-то и пукнет про шторм? Ты считаешь, что про него кто-то не знает что ли или как? С какой целью ты это написал?
Я спрашивал тех, кто умеет в Нетбинс вообще-то.
>Почему когда речь идёт о ИДЕ обязательно вылезет кто-то и пукнет про шторм
Потому что к сожалению в нашем веб болоте у тебя из альтернатив только "ломанный" шторм, и лицензия шторма. Не? Всё остальное либо для фанатиков свободного по, либо для нитакихкавсе. Шторм-к сожалению единственная адекватная ИДЕ для этих наших похапе.
>Нетбинс
В этом вообще невозможно писать, только начинаешь, появляются какие-то окна на пол экрана сверху и снизу, вообще не видно где пишешь. Ещё и пространство имён не воспринимает, говно в общем какое-то.
Так я и спрашиваю - как в этом работают, потому, что на первый взгляд это убогое говно даже для бесплатного редактора. Как-то видел даже тех, кто за него срачи устраивал. Может это я чего-то не понимаю с ним?
>>094702
>>094706
Я это десятки раз уже слышал. Завязывайте в попугаев играть - я не про шторм спрашивал.
>А зачем тогда они который год новые версии этой недоделки выпускают?
Вероятно оно в другие языки может лучше чем в пыху.
>А зачем тогда они который год новые версии этой недоделки выпускают?
Мб бюджет инвесторов распиливают, хз. Будто мало софта делается в стол
Гайд с шапки по основам языка, потом доки пхп, потом задача про студентов, потом ларавель по документации. до пхп писал на си, с++, шарпе, питоне в качестве развлечения, так что как работает код и принципы ооп знал, гитом давно пользовался, как и линуксом в дуалбуте
Вообще, должно бы хватать информации из учебника.
Для этой задачи нужно уметь работать с массивами. Общая идея примерно такая: создаем массив с значениями-номерами 1, 2, 3, ... и затем в цикле удаляем из него элементы по одному, пока в нем не останется нужное количество элементов.
Единственная сложность тут - как определить, какой именно элемент удалить. Допустим, в считалке 5 слогов. Если ключи в массиве начинаются с нуля (0, 1, 2, 3...), то первым надо удалить элемент с ключом 4 (он пятый по счету с начала), потом с номером 9, и тд. Когда мы дойдем до конца массива, у нас получится "дырявый" массив, в котором нет элементов с ключами 4, 9, итд. Мы можем его переупорядочить с помощью array_values, так что ключи снова будут идти по порядку без "дырок", и дальше продолжать удалять из него элементы.
Если есть какие-то конкретные вопросы, спрашивай.
И если вдруг тебя заинтересовали задачи на алгоритмы, то ты можешь найти множество их на сайтах вроде codeforces или leet code.
>>094464
Эклипс относительно юзабельный, если с ним повозиться и настроить. Хотя, как я помню, там есть какие-то баги.
>>094500
Обычно используют mod_rewrite. Этот модуль позволяет "переписывать" URL, если он соответствует/не соответствует правилам. Документация есть, но на английском, и я бы советовал для начала почитать про этот модуль. Иначе ты не поймешь то, что написано ниже.
Используя mod_rewrite, мы пишем правило вроде: если URL не соответствует js/css/png/статическому файлу, то переписать его на index.php. Это позволяет нам делать "красивые" URL, а также защитит нас от ситуации, если злоумышленник смог загрузить на сервер свой php-файл и хочет его запустить.
Правила можно прописать в конфиг Апача (более надежно, так как он защищен правами доступа) или в файл .htaccess (чуть менее надежно, так как при наличии уязвимости его можно переписать) . Типичные правила выглядят так:
RewriteBase /
# Если в URL index.php - не переписывать его
RewriteRule ^index\.php$ - [L]
# Если URL ссылается на существующий файл или каталог - не перепиысыыать
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Иначе, заменить URL на указанный
RewriteRule . /index.php [L]
Кстати, тонкость в том, что Апач исполняет эти правила не один раз, а много раз подряд до тех пор, пока URL не перестанет меняться.
Конфиг выше не защищает от запуска других PHP файлов, если в URL прописать путь к ним. Чтобы защититься от этого, нужно поменять правила с -f и -d, чтобы они проверяли еще расширение файла. Сейчас правило выглядит как:
- если URL указывает на файл или каталог, не переписывать URL
Соответственно, если указать URL вида /upload/photo.php и такой файл есть, то он запустится.
А должно быть:
- если URL указывает на файл И этот файл имеет расширение css/js/jpg/png/... то не переписывать URL.
Думаю, что эти правила надо заменить на примерно такое:
# Если URL заканчивается на css/js/png - не переписывать
RewriteRule \.(css|js|jpg)$ - [L]
В общем, почитай про mod_rewrite, напиши конфиг, протестируй:
- что вызывается index.php,
- что статика отдается корректно,
- что посторонние php-файлы не запустить по прямой ссылке или используя трюки вроде /upload/photo.php/styles.css
Если есть какие-то вопросы - спрашивай.
И если вдруг тебя заинтересовали задачи на алгоритмы, то ты можешь найти множество их на сайтах вроде codeforces или leet code.
>>094464
Эклипс относительно юзабельный, если с ним повозиться и настроить. Хотя, как я помню, там есть какие-то баги.
>>094500
Обычно используют mod_rewrite. Этот модуль позволяет "переписывать" URL, если он соответствует/не соответствует правилам. Документация есть, но на английском, и я бы советовал для начала почитать про этот модуль. Иначе ты не поймешь то, что написано ниже.
Используя mod_rewrite, мы пишем правило вроде: если URL не соответствует js/css/png/статическому файлу, то переписать его на index.php. Это позволяет нам делать "красивые" URL, а также защитит нас от ситуации, если злоумышленник смог загрузить на сервер свой php-файл и хочет его запустить.
Правила можно прописать в конфиг Апача (более надежно, так как он защищен правами доступа) или в файл .htaccess (чуть менее надежно, так как при наличии уязвимости его можно переписать) . Типичные правила выглядят так:
RewriteBase /
# Если в URL index.php - не переписывать его
RewriteRule ^index\.php$ - [L]
# Если URL ссылается на существующий файл или каталог - не перепиысыыать
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Иначе, заменить URL на указанный
RewriteRule . /index.php [L]
Кстати, тонкость в том, что Апач исполняет эти правила не один раз, а много раз подряд до тех пор, пока URL не перестанет меняться.
Конфиг выше не защищает от запуска других PHP файлов, если в URL прописать путь к ним. Чтобы защититься от этого, нужно поменять правила с -f и -d, чтобы они проверяли еще расширение файла. Сейчас правило выглядит как:
- если URL указывает на файл или каталог, не переписывать URL
Соответственно, если указать URL вида /upload/photo.php и такой файл есть, то он запустится.
А должно быть:
- если URL указывает на файл И этот файл имеет расширение css/js/jpg/png/... то не переписывать URL.
Думаю, что эти правила надо заменить на примерно такое:
# Если URL заканчивается на css/js/png - не переписывать
RewriteRule \.(css|js|jpg)$ - [L]
В общем, почитай про mod_rewrite, напиши конфиг, протестируй:
- что вызывается index.php,
- что статика отдается корректно,
- что посторонние php-файлы не запустить по прямой ссылке или используя трюки вроде /upload/photo.php/styles.css
Если есть какие-то вопросы - спрашивай.
Не всем нужен PHPStorm, и даже те, кто его использует, зачастую не пользуется, а то и не знает про все его возможности. Зачем покупать программу, которую ты будешь использовать на 5%? Потому стоит посмотреть и на альтернативы:
- VS Code с плагином intellisense, с lint-плагином для проверки корректности кода
- Eclipse (с багами)
>Зачем покупать программу, которую ты будешь использовать на 5%?
Потому что даже эти 5% работают лучше на 2 головы чем у всех конкурентов, не?
Да и изредка даже у 5процентника возникает таки запрос на редко используемые штуки. И вот в случае если он сидит на другой иде-он будет как то терпеть и жить как жил. А если на шторме-погуглит, и начнёт использовать уже 6%. Внезапно:да, процесс изучения инструментов тоже зависит от практики.
Допустимо конечно, иначе этого бы не было во ВСЕХ шаблонизаторах.
Тут, конечно, тонкая грань(что есть бизнес логика, а что допустимо и в шаблоне), но в целом-ничего страшного в условных операторах в шаблоне нет.
>>095283
>Хотя, как я помню, там есть какие-то баги.
Тоже встречался пару раз. Но там достаточно разобраться с плагинами - какие норм, а какие жопоруки писали и использовать нормальные. Вообще Эклипс мне именно своей гибкостью понравился - плагинов очень много разных и из ИДЕ собрать можно даже троллебус. Ну и да - он выполняет свою функцию помощи при написании кода, в отличие от.
>>095368
>даже эти 5% работают лучше
Эти 5% это как раз и есть обычный редактор да модуль гита. Такое сегодня везде есть искаропки, и везде отлажено.
>Эти 5% это как раз и есть обычный редактор да модуль гита
Как минимум это ещё переход к дефайну функции, корректная работа с неймспейсами, удобный ssh клиент встроенный.
>переход к дефайну функции, корректная работа с неймспейсами, удобный ssh клиент встроенный
Тоже везде есть - это базовые фичи. Переход к дефайну ещё в 2002 году встречал в ИДЕ для Дельфи.
Есть то он есть, но с этими нашими неймспейсами и автолоадами не всегда и не всё корректно отрабатывает.
Важно чтобы:
а) Не требовал сбора тонн информации
б) Не требовал годы на разработку
в) Привлек немного пользователей
Логику можно разделить на бизнес-логику и логику отображения. Например:
- если пользователь зарегистрировался менее 7 дней назад, то он получает скидку на товар - это бизнес-логика, ей место в модели.
- если пользователь VIP, то около его ника рисуется корона - это логика отображения, ей место во view. То есть просто во view пишем: if ($user->isVip()): .... endif.
>>095488
Дело может быть в неправильном домене для кук, пути (по которому видна кука), или времени жизни куки.
>>095481
А зачем в IDE поддержка git? git абсолютно удобно использовать из консоли. Наоборот, в IDE часто поддержка git реализована плохо. Например, в PhpStorm при разрешении конфликтов, если я не путаю, используется 3-панельная система сравнения в то время, как сторонние программы вроде KDiff3 имеют 4 панели.
>>095498
Переход к определению есть в Eclipse, VS Code + intellisense. зачем нужен SSH клиент в IDE, не очень понятно - можно просто в консоли набрать ssh user@host.
>git абсолютно удобно использовать из консоли
Нет, не удобно. Я никому не рекомендую начинать знакомство с гитом с консольного варианта.
>используется 3-панельная система сравнения в то время, как сторонние программы вроде KDiff3 имеют 4 панели
Да? А что через консольку не разгребаешь? Тебе ведь удобно.
>можно просто в консоли набрать ssh user@host
Алсо IDE предполагает наличие консоли, сразу настроенной под проект. Вообще сам идея IDE это когда есть один инструмент, заменяющий собой пачку различных инструментов. Так-то никто не мешает взять их все в отдельности и использовать - я сам такое иногда вытворяю.
А где конкретно в девтулс это? (в хроме?)
>отправляет или своё имя, или вообще ничего.
Да, я же пишу c нуля реквест по сути.
То есть юзер агент и всякие дефолтные поля (как бы для эмуляции браузера) могут помочь?
Но всё-таки не въехал до конца с механизмом передачи кукисов. Может Postman заюзать, он такое умеет? Просто ленив пока. Вообще это мой сраный ПЕТ, поэтому всегда можно забить.
Задал куки вот так:
setcookie("uniqueID", $cookieValue, ["expires"=>time() + 315576000, "domain"=>"localhost"]);
Делаю var_dump($_COOKIE) из одного места в коде под одним урл:
array(2) {
["uniqueID"]=>
string(13) "60eeab98e6208"
["PHPSESSID"]=>
string(26) "5f2gptrshcnltvi6b1l6kjf110"
}
И из другого под другим урл:
array(1) {
["PHPSESSID"]=>
string(26) "5f2gptrshcnltvi6b1l6kjf110"
}
Че это вообще за нахуй, как такое возможно
Аноны, сории за полотно, через пару минут разобрался сам. Нужно было в опциях "path"=>"/" прописать чтобы куки было видно по всему домену.
>если за день 4 часа наберется, то это очень хороший результат
Двачую, тоже вкатываюсь, третий месяц, за все это время 4 часа чистой учебы у меня получилось всего пару раз, обычно 2 часа выходит.
/(.)/igm
>это мой сраный ПЕТ, поэтому всегда можно забить
А я вот даже на петах на 100% всё выполняю. А если на реальном проекте встретится? Это вызов для меня скорее - могу много времени потратить, порой переделывая и прикидывая как лучше. Благо с петами рамок по времени нет.
>А если на реальном проекте встретится? Это вызов для меня скорее - могу много времени потратить, порой переделывая и прикидывая как лучше
На реальном проекте никто не даст время на выдрачивание кода. Сделал - заработало - в прод
Так в это и смысл пета - лампово выдрачивать свои навыки в комфортной обстановке.
Все навыки заранее не выдрочишь. В разработке масса узких специализаций, где можно годами выдрачивать. А какие из них придется использовать на проде - чистая лотерея. Могут дать ETL, могут работу с платежами, а могут какую-нибудь аналитику строить. На каждый случай будешь код задрачивать?
Тебе 12 лет что ли - что за фатализм "все навыки заранее не выдрочишь" и, типа, нефига даже заниматься. Любишь на месте велосипеды писать как получится - твоё дело, но чё ты до меня-то доебался?
Алсо таких как ты нельзя подпускать к критическим системам - такого нахуевертишь. Приходилось общаться с людьми для которых сроки на втором месте и важнее именно качество и вот ты туда не проходишь потому, что сделал - заработало - в прод. Это подход хуятора в подвальной галере.
>к критическим системам
Мань, критические системы не пишут на пхп.
Максимум это финтех, где всё покрывается пачкой тестов и ревьюится.
>Приходилось общаться с людьми для которых сроки на втором месте и важнее именно качество и вот ты туда не проходишь
Вряд ли выбирая качество люди будут писать на пхп
Прихожу на новое место работы - там своя предметка и архитектура, так что мои знания сразу ополовиниваются, пока в проект въедешь, пока в бизнесовой части разберешься.
Ну и я заранее не знаю, какая фирма даст оффер и какой проект в фирме придет. Может это сервис доставки, может инет магаз, может какая-то црм. Заранее дрочить предметку - если на мамкиной шее сидеть, мб и можно. Но обычно погружение происходит в первые пару месяцев работы. А там уже пишешь норм код как остальные разрабы
Начинать как раз стоит с консоли и проекта из 3 файлов, так как там нет ничего лишнего, что может отвлечь или запутать. Простые команды, каждая из которых делает одно действие. Это лучше для изучения, чем сложные формы с кучей информации и кнопок.
Тем более, что эти формы - это лишь интерфейс к тем же самым консольным командам.
> А что через консольку не разгребаешь?
Для разных задач удобнее разные инструменты. Сделать коммит или посмотреть, кто и как менял функцию x, удобнее через консоль. Разрешать конфликты удобнее специально сделанной для этого программой (а не в консоли или в PhpStorm).
В Kdiff3 используются такие панели:
Вверху:
- оригинальный код, от которого были отпочкованы две конфликтующие ветки
- код после твоих правок
- код после правок на сервере
Внизу:
- результат мерджа (он включает твои принятые правки, принятые правки с сервера и ручные исправления).
То есть, если был код $x = 1; и ты его поменял на $x = 2, а кто-то другой на $x = 3 то в трех верхних панелях будут эти три версии кода, а внизу - итоговый результат (который в том числе можно править вручную, например вписать $x = 4).
В PhpStorm, как я понял из мануала, нету панели с оригинальным кодом. Нельзя увидеть, как код выглядел до правок.
.*
Точка значит "любой символ, кроме перевода строки". Звездочка значит "предыдущий символ может повторяться от 0 до бесконечности раз".
Тестовое задание на вакансию PHP-Программист.
Здравствуйте! Высылаю вам тестовое задание на должность PHP-программист.
Плановый срок решения задания: 3-4 дня. Сообщите, пожалуйста, когда приступите к тестовому заданию, на почту
Если при выполнении задания у вас возникнут вопросы, обращайтесь на почту
1. Дан массив "категории". Каждая категория имеет следующие параметры:
"id" — уникальный числовой идентификатор категорий
"title" — название категории
"children" - дочерние категории (массив из категорий)
Вложенность категории неограниченна (дочерние категории могу иметь свои вложенные категории и т.д.)
Пример массива :
$categories = array(
array(
"id" => 1,
"title" => "Обувь",
'children' => array(
array(
'id' => 2,
'title' => 'Ботинки',
'children' => array(
array('id' => 3, 'title' => 'Кожа'),
array('id' => 4, 'title' => 'Текстиль'),
),
),
array('id' => 5, 'title' => 'Кроссовки',),
)
),
array(
"id" => 6,
"title" => "Спорт",
'children' => array(
array(
'id' => 7,
'title' => 'Мячи'
)
)
),
);
Необходимо написать функцию searchCategory($categories, $id), которая по идентификатору категории возвращает название категории.
2. Даны три таблицы:
таблица `worker` (работник) с данными — id (id работника), first_name (имя), last_name (фамилия)
таблица `child` (ребенок) с данными — worker_id (id работника), name (имя ребенка)
таблица `car` (машина) с данными — worker_id (id работника), model (модель машины)
Структура таблиц:
CREATE TABLE `worker` (
`id` int(11) NOT NULL,
`first_name` varchar(100) NOT NULL,
`last_name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `car` (
`user_id` int(11) NOT NULL,
`model` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `child` (
`user_id` int(11) NOT NULL,
`name` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Небходимо написать один SQL запрос который возвращает: имена и фамилии всех работников, список их детей через запятую и марку машины. Выбрать нужно только тех работников у которых есть или была машина (если машина была и потом её не стало то поле model становится null).
3. Написать функцию, которая на входе принимает массив из открывающихся или закрывающихся тегов (например “<a>”, “</td>” ), а возвращает результат проверки корректности: т.е. является ли принятая функцией последовательность тегов структурой корректного HTML документа. Например, последовательность “<a>”, “<div>”, “</div>”, “</a>”, “<span>”, “</span>” - корректная структура, а последовательность “<a>”, “<div>”, ”</a>” - некорректная структура.
Необходимо использовать нативный php без использования библиотек DOMDocument, Simplexml и тд.
4. Написать класс-оболочку хранилища «Box».
В хранилище можно установить данные (setData($key, $value)), получить данные (getData($key)), сохранить данные (save()) и загрузить данные (load())
$key — произвольный идентификатор данных
$value — скаляные данные или массив
Хранилище состоит из:
- Интерфейс описывающий методы установки данных, получения данных, сохранения и загрузки
- Абстрактный класс AbstractBox содержащий реализацию необходимых общих методов
- Класс FileBox расширяющий абстрактный класс AbstractBox. При вызове save() сохраняет заданные в класс данные в файл. При вызове load() достает данные из файла.
- Класс DbBox расширяющий абстрактный класс AbstractBox. При вызове save() сохраняет заданные в класс данные в базу. При вызове load() достает данные из базы.
Функция load не должна ничего возвращать, должна лишь сохранять полученные данные внутри объекта. Для получения данных служит функция getData($key).
При сохранении данных необходимо учитывать ключи новых данных и тех данных что хранятся в базе(файле), если значение с ключом в базе(файле) уже существует, то нужно его значение заменить на новое.
Классы FileBox и DbBox должен быть реализованы таким образом, чтобы нельзя было создать более одного экземпляра каждого из классов.
Общие пожелание по выполнению всех заданий: по 1 и 3 заданию необходимо в отдельном файле создать одну функцию с необходимой логикой, если необходимо какую-либо из функций разбить не несколько, делать все в этом же файле, по 2 заданию, необходимо в отделльном файле написать один sql запрос и больше ничего, по 4 заданию в отдельной папке создать необходимые классы. Никаких index.php, html разметки и тем более стилей добавлять не надо.
Желаем вам удачи в выполнении задания!
Спасибо.
Тестовое задание на вакансию PHP-Программист.
Здравствуйте! Высылаю вам тестовое задание на должность PHP-программист.
Плановый срок решения задания: 3-4 дня. Сообщите, пожалуйста, когда приступите к тестовому заданию, на почту
Если при выполнении задания у вас возникнут вопросы, обращайтесь на почту
1. Дан массив "категории". Каждая категория имеет следующие параметры:
"id" — уникальный числовой идентификатор категорий
"title" — название категории
"children" - дочерние категории (массив из категорий)
Вложенность категории неограниченна (дочерние категории могу иметь свои вложенные категории и т.д.)
Пример массива :
$categories = array(
array(
"id" => 1,
"title" => "Обувь",
'children' => array(
array(
'id' => 2,
'title' => 'Ботинки',
'children' => array(
array('id' => 3, 'title' => 'Кожа'),
array('id' => 4, 'title' => 'Текстиль'),
),
),
array('id' => 5, 'title' => 'Кроссовки',),
)
),
array(
"id" => 6,
"title" => "Спорт",
'children' => array(
array(
'id' => 7,
'title' => 'Мячи'
)
)
),
);
Необходимо написать функцию searchCategory($categories, $id), которая по идентификатору категории возвращает название категории.
2. Даны три таблицы:
таблица `worker` (работник) с данными — id (id работника), first_name (имя), last_name (фамилия)
таблица `child` (ребенок) с данными — worker_id (id работника), name (имя ребенка)
таблица `car` (машина) с данными — worker_id (id работника), model (модель машины)
Структура таблиц:
CREATE TABLE `worker` (
`id` int(11) NOT NULL,
`first_name` varchar(100) NOT NULL,
`last_name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `car` (
`user_id` int(11) NOT NULL,
`model` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `child` (
`user_id` int(11) NOT NULL,
`name` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Небходимо написать один SQL запрос который возвращает: имена и фамилии всех работников, список их детей через запятую и марку машины. Выбрать нужно только тех работников у которых есть или была машина (если машина была и потом её не стало то поле model становится null).
3. Написать функцию, которая на входе принимает массив из открывающихся или закрывающихся тегов (например “<a>”, “</td>” ), а возвращает результат проверки корректности: т.е. является ли принятая функцией последовательность тегов структурой корректного HTML документа. Например, последовательность “<a>”, “<div>”, “</div>”, “</a>”, “<span>”, “</span>” - корректная структура, а последовательность “<a>”, “<div>”, ”</a>” - некорректная структура.
Необходимо использовать нативный php без использования библиотек DOMDocument, Simplexml и тд.
4. Написать класс-оболочку хранилища «Box».
В хранилище можно установить данные (setData($key, $value)), получить данные (getData($key)), сохранить данные (save()) и загрузить данные (load())
$key — произвольный идентификатор данных
$value — скаляные данные или массив
Хранилище состоит из:
- Интерфейс описывающий методы установки данных, получения данных, сохранения и загрузки
- Абстрактный класс AbstractBox содержащий реализацию необходимых общих методов
- Класс FileBox расширяющий абстрактный класс AbstractBox. При вызове save() сохраняет заданные в класс данные в файл. При вызове load() достает данные из файла.
- Класс DbBox расширяющий абстрактный класс AbstractBox. При вызове save() сохраняет заданные в класс данные в базу. При вызове load() достает данные из базы.
Функция load не должна ничего возвращать, должна лишь сохранять полученные данные внутри объекта. Для получения данных служит функция getData($key).
При сохранении данных необходимо учитывать ключи новых данных и тех данных что хранятся в базе(файле), если значение с ключом в базе(файле) уже существует, то нужно его значение заменить на новое.
Классы FileBox и DbBox должен быть реализованы таким образом, чтобы нельзя было создать более одного экземпляра каждого из классов.
Общие пожелание по выполнению всех заданий: по 1 и 3 заданию необходимо в отдельном файле создать одну функцию с необходимой логикой, если необходимо какую-либо из функций разбить не несколько, делать все в этом же файле, по 2 заданию, необходимо в отделльном файле написать один sql запрос и больше ничего, по 4 заданию в отдельной папке создать необходимые классы. Никаких index.php, html разметки и тем более стилей добавлять не надо.
Желаем вам удачи в выполнении задания!
Спасибо.
Так и че? Задание для джуна адекватное вполне. За вечер делается. Бери и делай, хули еще надо? Как ты работать собрался если ты эти мелкие задачки сделать не можешь сам?
да мне некогда ебать, завтра уезжать надо короче в другой город, а работы нет нихуя, да и мне онли 2 задание бы
>проекта из 3 файлов
Где ты такие проекты видел и зачем им гит?
В общем у тебя консолька ради консольки, а когда не консолька, тогда можно, но почему-то только тебе. Все остальные зачем-то тоже должны вводить буковки вместо того чтобы пару раз кликнуть мышкой.
Использование консоли удобно только для более хитровыебанных операций, а базовые все давно уже прокликивают. Та же работа с ветками - набери, посмотри, переключись. Через интерфейс же все ветки сразу видно.
Я сам большой любитель попердолить консолечку, но когда надо писать код и думать о проекте, то посторонних движений должно быть минимум - Это хорошо экономит время.
>В PhpStorm, как я понял из мануала, нету панели с оригинальным кодом. Нельзя увидеть, как код выглядел до правок.
Есть такое, да. Хотя не очень часто нужно обычно резолвишь конфликт и дальше идешь. А в случае чего можно откатиться
Ты троллишь нас что ли? Кого должно ебать что тебе там что-то некогда?
Ну ты борзый канеш. Некогда ебать. Одно дело помочь, а другое сделать за какого-то охуевшего черта его работу, на которую ему к тому же поебать.
>astrio
Видел как они искали разработчиков в вкшечке, постоянно меняя аватарки и имя херочки. Глянул на их требования и в целом - мутная контора, которая, похоже, просто торгует курсами для вкатывальщиков. По крайней мере у меня такое впечатление сложилось.
А ты просто хуй с горы и думаешь вкатиться таким хитрым способом, лол. Они же там обещают обучение вроде как.
Ну и пошел нахуй тогда
Да хер знает.
Меня лично мотивирует только потенциальный доход от работы над ПЕТом, а ламповость в самом процессе, как впрочем и мозготрах.
Много всяких тонкостей изучал в том году, а теперь вижу что я долбоеб и просто въебал время вникуда, в знания, которые ВОЗМОЖНО когда-то пригодятся или нет. Ну такое.
Нужно четко структурировать кодинг и условно гуглинг различных техник в каждый момент времени, постоянно перепроверяя и соотнося это с реальными проблемами на земле, которые ты способен решить.
И как вариант набить гитхаб перед собесом.
MVC не про глобальные переменные, а про архитектуру. Глобальные переменные вообще лучше не использовать нигде.
Собери из них объект реквеста и передавай в контроллеры. Например даже древний Опенкарт при инициализации делает этот Реквест и очищает глобальные чтобы никому моча в голову не ударила их использовать при создании плагинов.
>Возможно ли с такими навыками найти подработку\стажировку за еду или даже бесплатно
Думаешь один такой?
На стажерские вакансии километровые очереди стоят.
Так что дрочи скилы дальше, пиши пет проекты, пробуй собесы на джуна/мидла
>где можно дрочить скилы, чтобы не я сам оценивал свой говнокод, а мне могли указать на ошибки?
Для начала возьми какой-то пет проджект, хоть банальный интернет магазин.
А оценить его могут в тематических чатах в телеге. Некоторых разрабов бывает заебывает работа и хочется отвлечься - могут поревьюить твоё поделие.
Но что-то я понял, что создать отдельно каждое место в таблице мест как-то глупо.
Вопрос - как сделать, чтобы при создании авиарейса, в зависимости от типа самолёта(в таблице которое есть поле с числом максимальных мест), таблица мест автоматически заполнялась в каком-то соотношении типов мест? Как это вообще приблизительно реализовывать?
Лучше всего никак. Зачем тебе в базе незанятые места? Подтягивай занятые и общую конфигурацию самолета и возвращай клиенту актуальную инфу.
А зачем для каждого рейса создавать записи в таблице мест? Если во всех самолетах одного типа всегда одинаковое количество и типы мест, то можно сделать список типов самолетов, и к типу самолета привязать список мест, которые в нем есть.
То есть, в самолете типа 1 есть места A1, A2 ... и так далее. Если тебе понадобится оформить билет, то ты в нем указываешь id рейса и id места.
>>098138
В принципе, можно. Но все зависит от ситуации. Если ты имел в виду "у меня есть функция регистрации пользователя. Можно я просто в нее передам $_POST целиком?", то это плохая идея. Так как функция регистрации пользователя должна заниматься именно регистрацией, а не разбором переменных из _POST или валидацией форм. У тебя же эта функция должна "знать", как выглядит форма регистрации пользователя, какие поля из нее приходят.
Обычно такую задачу разделяют на подзадачи:
- разбор данных, пришедших из формы и преобразование этих данных в объект какой-то стандартной структуры (например: User или UserRegisterForm)
- проверка правильности данных
- создание пользователя
Здесь каждая функция занимается своим делом и ничего не знает о других функциях. Функция валидации или регистрации ничего не знает о форме регистрации.
"реальные задачи" отличаются от учебных упражнений следующим:
- во-первых, в реальных задачах используется много готового кода, а именно: фреймворки уровня Symfony/Laravel, плагины к ним, шаблонизаторы вроде Twig, ORM вроде Doctrine. Все фреймворки учить бесполезно, но познакомиться с одним из них стоит.
- во-вторых, в реальных задачах гораздо больше "фич" и больше объем кода. В учебной задаче ты делаешь сайт из 3 страниц с 5 элементам (кнопки, ссылки, таблицы) и на каждой. В реальной задаче будет сайт из 300 страниц с 5000 элементами.
Ты не написал, какие задачи ты делал, потому непонятны твои навыки. Если максимум, что ты делал - это задачи про переворачивание строк, то наверно тебе надо учиться больше. Если ты делал какие-то веб-приложения на фреймворке, то наверно можно попробовать поискать работу.
В шапке есть задача про сайт Testhub, она по сложности приближается к реальным приложениям. Можешь посмотреть ее.
Проект из 3 файлов и консоль - это нужно для изучения гита. Потому что изучать гит удобнее на маленьком числе файлов и без перегруженного графического интерфейса.
Ты предлагаешь: не изучать гит, а сразу взять интерфейс с кнопками из phpstorm и пользоваться им. Те, кто умеет только нажимать на кнопки, не понимая толком, что они делают, в итоге ломают код при мерджах, при конфликтах. Это глупый подход.
>умеет только нажимать на кнопки, не понимая толком, что они делают
Как это должно изменить набирание команд через консольку?
Понимать гит как раз легче через интерфейс т.к. там базовые операции разделены по типам: работа с коммитами, ветками, удалёнными репами, тегами и тд.
>ломают код при мерджах, при конфликтах
Через консольку всё точно так же ломается, если ты не знал.
>Это глупый подход.
У тебя позиция дурачка, который считает, что копипастить код нельзя и нужно всё набирать руками.
Вообще понимание как работать с гитом это в первую очередь понимание его подходов и возможностей, которые он даёт, а не заучивание консольных команд - их в справке посмотреть всегда можно.
И ты так и не сказал - почему в одном случает нужно пользоваться только командами, но в определённых случаях ты лезешь в интерфейс? У тебя логика с двойным дном.
Null object pattern, чтобы об нулл не спотыкаться.
Алсо, вроде как пользователь оказался нужен только в шаблонах, поэтому расшарил переменную через View.
Может хватит оператора ?? который вернет пустого юзера?
$(document).on('click', '.elem', function() {
let id = $(this).attr('id');
$.post('index.php' , {
elem_id: id
} , function(data){
location.reload();
})
});
Сама строка таблицы: <tr id='{$id}' class='elem'>;
$id точно не пуст.
Таблица выводится в Index.php, скрипт подключён туда же.
Я не понимаю, как нужно принимать $_POST? Могу ли я его принимать в том же самом index.php вот так:?
if ($_POST) {
$my_object= new MyObject($db);
$my_object->id = $_POST['id'];
$stmt = $my_object->запрашиваюСодержимоеДругойТаблицы();
include "другаяТаблица.php";
}
Где ошибка? Неправильно отправляется $_POST? Или он неправильно принимается? И почему чёртова перезагрузка срабатывает?
>чтобы об нулл не спотыкаться
Для этого существуют проверки как в коде, так и в шаблонах. Если дёргать его через нулл-объект, то будут на выходе левые данные из этого нулл.
Не надо тащить паттерны туда, где их не надо.
Блять, гений, спасибо за такое ценное замечание. Только вот post c id нихрена не приходит, и вообще, то что внутри if не срабатывает, даже если я там просто что-то вывожу с подставленным id.
Шиз, спок. Удали код и иди на завод - тебе нельзя в программизм.
В зависимости от способа объявления скрипта, возможно, у тебя в $this не элемент, а всё окно целиком -- проверь. В таком случае лучше передавать в функцию event.target.
> Могу ли я его принимать в том же самом index.php вот так:?
Да
Почему ты не отлаживаешь сам? добавь отладку с ответом от скрипта, вместо перезагрузки страницы.
Зачем понадобилось делать такую ебанутую навигацию через $_POST-параметры вместо $_GET? При всех очевидных минусах, какие плюсы?
- во-вторых, в реальных задачах гораздо больше "фич" и больше объем кода. В учебной задаче ты делаешь сайт из 3 страниц с 5 элементам (кнопки, ссылки, таблицы) и на каждой. В реальной задаче будет сайт из 300 страниц с 5000 элементами.
Можно, пожалуйста, пример такого реального проекта. 300 страниц это имеется ввиду 300 шаблонов для 300 видов страниц же? Что-то не могу себе представить ни один сайт с такой вариативностью.
>Можно, пожалуйста, пример такого реального проекта. 300 страниц это имеется ввиду 300 шаблонов для 300 видов страниц же? Что-то не могу себе представить ни один сайт с такой вариативностью.
Например у меня сейчас 130 файлов шаблонов и это только в ядре, еще больше в модулях и либах лежит.
Тот анон привел гипертрофированный пример.
Если обобщить, то на учебном проекте у тебя условно 5к строк кода. На рабочем будет 100к-500к, а может и больше (больше я сам не встречал, на текущем 500к с копейками). Соответственно большая часть проблем будет с тем, как справиться с разросшейся кодовой базой
Изучать удобнее и лучше именно в консоли, потому что там ты делаешь действия по одному. Сначала add, потом commit. Нет никаких лишних прослоек или абстракций.
Новичка может привлечь GUI, так как он ошибочно думает, что так как перед нами кнопки, то ничего учить не надо и думать не требуется - просто нажимай кнопки и все само заработает. Только вот этого не будет. Наоборот, интерфейс с большим количеством кнопок и опций собьет новичка с толку.
Более того, GUI обычно рассчитаны не на новичков, а именно на тех, кто уже знает гит (и изучил его, например, с помощью консоли). Ты, наверно, просто не способен поставить себя на место новичка и понять его образ мышления.
> И ты так и не сказал - почему в одном случает нужно пользоваться только командами, но в определённых случаях ты лезешь в интерфейс? У тебя логика с двойным дном.
Читай внимательнее. Третий раз приходится писать одно и то же. Во-первых, я написал, что консоль лучше годится при изучении гита, а не в любой ситуации. Во-вторых, некоторые действия удобнее делать в консоли, а некоторые сторонними программами. Что тут непонятного. Мне удобнее коммитить в консоли, а конфликты разрешать сторонней программой.
> который считает, что копипастить код нельзя
Тут ты пишешь чушь. Конечно, это плохая идея, копипастить код, так как потом тебе придется делать правки в нескольких местах. И ты бессмысленно увеличиваешь объем кода.
Наведи мышь, и может быть появится подсказка, почему.
>>101394
По моему, это плохая идея. Так как не будут работать проверки вроде if ($this->user) ...
Обычно для авторизованного пользователя и анонимного показывается разный интерфейс и потому нужды в null object нету. Ну например, авторизованному пользователю ты показываешь "Здравствуйте, Иван", а гостю - "Войти на сайт".
>>101783
При клике в this будет не tr, а элеимент, на который кликнули, наверно в этом дело?
Также, у тебя плохо сделана отправка аякс-запросов. Нет индикации, что выполняется аякс-запрос, и нет обработки ошибок. У тебя при ошибке на странице ничего не меняется и вообще непонятно, что произошла ошибка.
> Неправильно отправляется $_POST? Или он неправильно принимается?
Открой инструменты разработчика в браузере на вкладке Network, и посмотри, какой запрос отправляется.
Также, у тебя плохой PHP код. Ты как-то странно передаешь id через свойства объекта. Надо передавать его явно в метод:
$object->findData($id);
Зачем ты придумал какое-то свое вывернутое ООП? Лучше на функциях писать код, чем в таком стиле.
Запросы, которые меняют данные на сервере (удаление, правка контента) должны отправляться через POST, а не через GET.
> 300 страниц это имеется ввиду 300 шаблонов для 300 видов страниц
Да. Такое количество страниц легко набирается: личные кабинеты, админки с кучей разделов, лендинги, промо-страницы. Вот представь админку блога. Только для таблицы постов нужно несколько страниц: список постов, редактирование поста, статистика просмотров поста. А таблиц может быть сотня.
>потому что там ты делаешь действия по одному. Сначала add, потом commit
Мы точно про интерфейс говорим? Ну, там, где вместо набора буковок просто нужную кнопку выбрать и получить тот же результат.
>Новичка может привлечь GUI, так как он ошибочно думает, что так как перед нами кнопки, то ничего учить не надо и думать не требуется - просто нажимай кнопки и все само заработает
Вот этот никак кроме бреда не назовёшь. На чём основано твоё утверждение, что при наличии кнопок человек даже не попытается узнать что же эти кнопки значат?
>Более того, GUI обычно рассчитаны не на новичков, а именно на тех, кто уже знает гит (и изучил его, например, с помощью консоли)
Более того IDE обычно рассчитаны не на новичков, а именно на тех, кто уже знает язык(и изучил его, например, с помощью блокнота)
Так что ли?
>Конечно, это плохая идея, копипастить код, так как потом тебе придется делать правки в нескольких местах
>ты бессмысленно увеличиваешь объем кода.
Ясно - это троллинг такой. Я не поверю, что кто-то до сих пор переписывает код вместо того, чтобы скопировать нужный кусок и подправить под конкретную задачу.
>Я не поверю, что кто-то до сих пор переписывает код вместо того, чтобы скопировать нужный кусок и подправить под конкретную задачу.
Так ты любой проект похоронишь, постепенно увеличивая число багов и кол-во времени на доработки. А кодовая база будет расти как на дрожжах
Джун, иди и посмотри любую библиотеку на гитхабе - там в документации специально примеры для копипасты существуют.
И больше не рассказывай тут про баги и время доработки - смешно выглядишь.
Анон выше говорит про копипаст уже существующего твоего кода, и подпиливания под новое требование, а ты про копипаст пяти строчек из примеров разных либ, это вообще разные случаи
>Анон выше говорит про копипаст уже существующего твоего кода
Давай ты не будешь за меня выдумывать что я там говорил?
Копипаст кода из документации или когда кто-то решил схожую проблему это нормальное явление. Требовать чтобы код переписывали вручную - дурость. Как и рекомендация прописывать команды гита вручную - к обучению самому гиту и его подводных камней это имеет самое отдалённое отношение.
>Требовать чтобы код переписывали вручную - дурость
Про это никто не говорил.
Есть у тебя в методе кусок кода, который хочешь заюзать в другом месте.
Копипаста в этом случае - взять этот кусок кода и вставить куда надо.
Не копипаста - вынести этот кусок кода в отдельный метод, добавить в исходный и туда, куда тебе надо.
Это в простейшем случае.
Бывает такое, что копипасту приходится терпеть, т.к. не заложили достаточно времени на проработку решения. Соответственно техдолг растет
>вынести этот кусок кода в отдельный метод, добавить в исходный и туда, куда тебе надо
Не всегда целесообразно выносить кусок кода в метод или библиотеку. Только бойлерплента может выйти в разы больше.
Ты не совсем понимаешь что такое копипаста в контексте разработки. Одно дело, когда 10 строк у тебя на проекте то тут, то там мелькают - тогда надо убирать куда-то, и другое, когда время от времени на разных проектах эти строки мелькают - для такого библиотеку городить это уже показатель скуки и большого количества свободного времени.
И совсем уже третье это когда у тебя декларативный язык - тот же HTML например. Ну убери давай Бутстрап-компоненты в метод, чтоб без копипасты. Тут народ уже просто сниппеты юзает без задней мысли, что по-сути является аж целой автоматизацией копипасты.
Есть ли способ заставить запущенные докер-контейнеры ходить в интернет через впн запущенный на хост-машине?
>>094072
>>094090
>>094143
>>094201
>>094714
Ебать вы токсичные, пиздец. Кстати, двух недель не прошло и меня выгнали. Сказали, что я недостаточно квалифицирован. Откуда я мог знать, что нужно знать git, rest, api, ajax, JavaScript, css, html, всякие babel, jquery и прочие аббревиатуры, которые я даже не запомнил. Мало того ещё нужен макбук и уметь в линуксе работать. Я маки с линуксом в глаза никогда не видел. Вынесли мозги какими-то докерами, виртуализацией, вагрант... вы реально это всё знаете??? Только без пиздежа, пожалуйста.
Сколько тебе зп то пообещали за макакинг джуном фулстеком?
все что ты перечислил кроме жопаскрипта и ксс учится за сутки
Скажу по себе
>git, rest, api, ajax, JavaScript, css, html, всякие babel, jquery
>докерами, виртуализацией, вагрант
git - мастхев, без него ты не сможешь ни проект себе скачать, ни обновить, ни изменения свои залить в рпеозиторий.
rest - там 5 методов всего и пара рекомендаций, можно пару статей прочесть, станет понятно, что за зверь
api (в контексте веба) - помимо рендера хтмл страничек бекенд может по апи общаться с другими бекендами, например ты шлешь запрос на сайт погоды, чтобы получить текущую температуру
ajax - способ сделать запрос из жс к твоему или внешнему бекенду и получить ответ, надо знать, там несколько методов всего (в нативном жс и в жиквери)
JavaScript, css, html - хотя бы основы надо знать, не везде есть фронты, да и нужны они редко, уметь сверстать кнопку или форму с нуля или из готовых блоков собрать, навесить на неё обработчик через жс.
babel - это необзяательно, на месте разберешься, какая там сборка жс
jquery - легаси проекты на нем плотно сидят, так что если попал на легаси, то пользуйся, дока у него подробная, любые вопросы легко гуглятся
докерами, виртуализацией, вагрант - сейчас докер мастхев, удобный способ развернуть рабочее окружение одной командой, хотя бы простенький докер компоуз нужно уметь писать
>уметь в линуксе работать
как правило сервера живут на линукс дистрибутиве. Поставь себе убунту и попользуйся месяцок. На работе обычно требуется подключиться по ssh на сервер и что-то там посмотреть, проверить, мб дамп бд забрать. Деплоем заниматься ты вряд ли будешь.
>вы реально это всё знаете???
Получается, что да, это те знания, которыми должен обладать джун, не супер глубоко, но справиться с помощью гугла и доки, если возникнет потребность.
Я из этого только бабелем не пользовался и вагрантом.
Скажу по себе
>git, rest, api, ajax, JavaScript, css, html, всякие babel, jquery
>докерами, виртуализацией, вагрант
git - мастхев, без него ты не сможешь ни проект себе скачать, ни обновить, ни изменения свои залить в рпеозиторий.
rest - там 5 методов всего и пара рекомендаций, можно пару статей прочесть, станет понятно, что за зверь
api (в контексте веба) - помимо рендера хтмл страничек бекенд может по апи общаться с другими бекендами, например ты шлешь запрос на сайт погоды, чтобы получить текущую температуру
ajax - способ сделать запрос из жс к твоему или внешнему бекенду и получить ответ, надо знать, там несколько методов всего (в нативном жс и в жиквери)
JavaScript, css, html - хотя бы основы надо знать, не везде есть фронты, да и нужны они редко, уметь сверстать кнопку или форму с нуля или из готовых блоков собрать, навесить на неё обработчик через жс.
babel - это необзяательно, на месте разберешься, какая там сборка жс
jquery - легаси проекты на нем плотно сидят, так что если попал на легаси, то пользуйся, дока у него подробная, любые вопросы легко гуглятся
докерами, виртуализацией, вагрант - сейчас докер мастхев, удобный способ развернуть рабочее окружение одной командой, хотя бы простенький докер компоуз нужно уметь писать
>уметь в линуксе работать
как правило сервера живут на линукс дистрибутиве. Поставь себе убунту и попользуйся месяцок. На работе обычно требуется подключиться по ssh на сервер и что-то там посмотреть, проверить, мб дамп бд забрать. Деплоем заниматься ты вряд ли будешь.
>вы реально это всё знаете???
Получается, что да, это те знания, которыми должен обладать джун, не супер глубоко, но справиться с помощью гугла и доки, если возникнет потребность.
Я из этого только бабелем не пользовался и вагрантом.
Меня на собесе спрашивали про знание языка, про алгоритмы, про разные хитрости навроде отличия print от echo, про базы данных. Обещали чистыми 30к. Взяли на должность младшего разработчика. Говорили про джуна бэкэнд.
В первый же день такая оказия вышла. Посадили за стол, а на нем только моники. Я коллег спрашиваю мол как работать то, а они ебала вытянули и гогочат что куропатки. Через пол часа какой-то ушатанный комп притащили, сказали, чтобы я со своим ноутом приходил. Блядь, у меня ноута нет. Показали confluence, jira. Там «тикеты». «Роудмап» показали, работают agile. Что блядь? чо к чему... Блядь, это пизда просто. Я даже не думал, что настолько выебут мозг.
Короче, два дня сидел читал код, все жти хтмл/цсс/джава скрипт... если с первыми двумя вроде как веатуре за неделю можно разобраться, то с джавой... ебанутый какой-то язык. По самому РНР я начал вникать на 3и сутки, тут менеджер он же старший разраб говорит, хули у меня в джире тикеты копятся, весь процесс им руиню. я столько новых слов узнал... открываю джиру, а там просто нескончаемый поток каких-то писем, хуй пойми что мне, а что не мне. Попросил коллег помочь как работать с этой системой. Они то суки походу и начали меня высиживать. Я за 1 день закрыл 3 заявки. Код оставил в комменте к тикету, коммент удетает в вики конфлюэнса. Мне говорят какого хуя не через гит отправляю правки.
Я ЕБУ БЛЯДЬ КАК ЭТОЙ ЗАЛУПОЙ ЕБАНОЙ ПОЛЬЗОВАТЬСЯ??? Я пришел код писать, баги править. Ну короче вчера утром меня рассчитали. Грустно до соплей. Но объём знаний ебанись какой. Я вот даже и не знаю чо дальше делать.
Нихуя. Как ты этим всем владеешь?! Я вообще не понимаю ни хуя. Я на ютубе начал смотреть про виртуализацию и тупо поплыл. Скачал virtualboz , установил в него линукс минт, пишут, что он для новичков самое то. А чо с ним дальше делать я хз. Как там программы ставить? Я качаю дистрибутивы с оф сайтов mysql/php — пишет не может установить, предлагает какую-то программу поставить для запуска win32 приложений. Я поставил эту программу, вроде установил. Ярдыков для запуска нет, структура диска не такая как в винде, как там ориентироваться в душе не ебу.
Про гит почитал, но так и не понял про ветки и прочее. Рили надо знать? Неужели он так строго нужен? Почему в виде комментария на той джире не принимают?
Ну да, все это надо знать. А в некоторых конторах надо еще и начальнику в жопу по понедельникам и пятницам давать.
На хорошем проекте (там битрикса не будет) постараются разделить бек и фронт: тогда бек точно сможет забыть про babel, но jquery, возможно, все-равно понадобится.
А вот наезды на девопс менее оправданы: от виртуалок, лиуксов и докеров никуда не деться.
Гит, рест, апи, Аякс Великий - это база, без этого совсем никуда. Последние три учатся меньше чем за день.
>>102935
>Попросил коллег
За редким исключением, программистишки - тупые токсики, по-сути, нихуя не знающие и не умеющие: Вероника все по-фактам разъяснила в соответствующем видео.
Мимовыкатился после двух лет.
Похоже, кодинг - не твоё.
Тут нужно уметь копнуть глубоко, разобраться в проблеме, если не шаришь
>Как ты этим всем владеешь?!
Постепенно осваивал инструменты один за другим, практиковался
>установил в него линукс минт, пишут, что он для новичков самое то. А чо с ним дальше делать я хз
Попробуй поднять на нем веб сервер nginx+php-fpm, настроить в nginx чтобы на твой сайт вел локалхост. Гайдов как это сделать тонны.
>Как там программы ставить?
Троллишь? Погугли
>Я качаю дистрибутивы с оф сайтов mysql/php — пишет не может установить, предлагает какую-то программу поставить для запуска win32 приложений
Ну ты совсем необучаемый. Не думал, что на лине софт по другому работает?
>Ярдыков для запуска нет, структура диска не такая как в винде, как там ориентироваться в душе не ебу.
На ютубе полно видосов про ввод в линукс системы, если сам не можешь разобраться
>Про гит почитал, но так и не понял про ветки и прочее
Не читать надо, а пробовать. Создай гит репу, добавь пару файлов, закомить, запуш в гитхаб, создай ветку и её запуш
>Рили надо знать? Неужели он так строго нужен? Почему в виде комментария на той джире не принимают?
Тебя нанимают не для того, чтобы ходить за тобой по джире и код собирать. Сам должен уметь подготовить пулл реквест, чтобый старший разраб только кнопку нажал и влил твой говнокод
Тебе явно рано на работу
>Откуда я мог знать, что нужно знать git, rest, api, ajax, JavaScript, css, html, всякие babel, jquery и прочие аббревиатуры
Интересно чем ты 7 лет занимался. Хелловорлды писал что ли?
Читал книги по РНР, по алгоритмам очень много времени заняло, в районе 5 лет, потому что пришлось вспомнить алгебру, со всеми этими функциями и прочим. Писал конечно же код, только вместо гита я использовал структуру папок - 0.01, 0.02 и т.д. Как по мне это удобнее, чем гит.
Так как я РНР бекэнд разработчик, то писал много вещей навроде запрос к БД, а выход в чистом виде. То есть без формирования визуального отображения. Это работа фронт эндов. Поэтому не учил хтмл и цсс с джавой.
Хелло ворлды конечно тоже писал, но не как вордпресс. Я так не напишу. Ядро движка мне пока что не под силу, да и думаю в одиночку такое никто не пишет.
Либо перечитай внимательно, либо иди на хуй
Да что там код собирать-то? Из джиры комментарий в конфлюэнс улетает, тикет закрыт - приходит уведомление, открыл его, увидел, что комментарий есть, оттуда скопировал код и вставил в проект, чего сложного то? Хули тогда старший прораб делать будет?
Посмотрел несколько видео по линуксу, да, я явно дал маху с установкой виндовых программ, ну а откуда я зналс то что линукс не винда?
Я поставил арасне2 и mysql, на винде этой же связкой пользовался, очень удобный сервер, nginx не понимаю как настраивать.
>Читал книги по РНР, по алгоритмам очень много времени заняло, в районе 5 лет
Сдаётся мне, что ты балду пинал по большей части.
>Как по мне это удобнее, чем гит.
По тебе удобнее может быть даже срать в штаны, но не факт, что тебя поймут там, куда ты работать придёшь.
>Это работа фронт эндов. Поэтому не учил хтмл и цсс с джавой.
Это значит, что ты ни одного даже учебного проекта не написал за эти 7 лет. Я не понимаю как тебя взяли на работу.
>Ядро движка мне пока что не под силу, да и думаю в одиночку такое никто не пишет.
Тут каждый начинающий вкатывальщик, написавший тех же студентов из ОПпоста делает свой примитивный движок. Просто надо не книжки читать, а делать.
>Да что там код собирать-то? Из джиры комментарий в конфлюэнс улетает, тикет закрыт - приходит уведомление, открыл его, увидел, что комментарий есть, оттуда скопировал код и вставил в проект, чего сложного то?
Старшему делать больше нехуй, как за стажером код подбирать. Никто код руками не копирует, всё делается через гит.
>Хули тогда старший прораб делать будет?
Ему есть чем заняться, поверь. То таски нарезать, то тз поревьюить, то по митингам походить. Старшие разрабы код почти не пишут, больше с бизнесом общаются
>nginx не понимаю как настраивать
На винде его не поставишь. Ставь линь, либо виртуалку (всл или докер)
Хоть какое-то подобие общения. А то пхп тред тухнет
Слог у меня такой какой есть. В чём жирнота? Я учился на backend php developer, а требуется куча технологий знать. Попробую за пол года освоить виртуалки, линукс, и другое. Посмотрим, что выйдет.
Вот серьезно, пока ты 5 лет хуйней страдал, я эти 5 лет работал на проде, повидал всякого
Что значит балду пинал? Я нигде не писал, что 24/7 занимался. Это тупо нереально. Да и вообще более 2-3 часов в день нереально учиться. Да и возраст у меня уже не малый, я успел женится, двух детишек жена подарила, правда и развестись успели, но то моя вина, долго не мог вкатиться.
На хх.ру вакансию увидел и отослал резюме. Так и приняли. Возможно, на вью думали, что это примитивные вопросы про гит, линукс и прочее и не стали задавать.
Касаемо проектов, в шапке я видел, но мне они показаилсь скучными и я решил не делать их. Мне понравилось работать с растровой графикой. Особенно когда вводишь текст в форме, а тебе генерируется изображение с введеным текстом. Рисовать неудобно, но прикольно. Свой аналог капчи придумал, почти как на дваче. ~70% задач решил по программированию из сборника задач. На код варсе несколько задач решил, литкод пробовал. Всё не упомнишь, что писал. Думаешь стоит порешать задачи из оп поста?
Ну молодец, чо. У каждого своя судьба.
Вот все сидел читал, а тут промолчать не могу.
У меня друг хороший очень долго работал не в IT-сфере. А потом, когда захотел, решил переучиться - я с этим ему помогал.
Вот сейчас, спустя полгода примерно, он устроился на свою первую работу в веб. Да, тупит. Да, знает меньше этой университетской студентоты - но он учится, справляется, меняет стиль мышления и главное, он работает.
Я согласен с ребятами - скорее всего, прога сейчас просто не твое.
>Касаемо проектов, в шапке я видел, но мне они показаилсь скучными и я решил не делать их
Думаешь на работе тебе, недостажеру, дадут интересные и уникальные задачи?
Задачи из шапки можно как минимум сделать с нуля, выбрать под это фреймворк, бд и остальной стек. Редко где тебе дадут начинать новый проект и выбирать технологии. Придешь на работу, а там "тут у нас древний проект на yii1, поднимай у себя локально, через час кину тебе задач на багфикс"
>Мне понравилось работать с растровой графикой. Особенно когда вводишь текст в форме, а тебе генерируется изображение с введеным текстом
Тогда ты попал не в тот стек. Php - бекенд язык, с графикой на нем практически не работают. Максимум пожмут загружаеме картинки, чтобы грузились быстрее.
> возможно, у тебя в $this не элемент, а всё окно целиком -- проверь.
>>102367
>При клике в this будет не tr, а элемент, на который кликнули, наверно в этом дело?
В .on(events, [selector], [data], handler) я в качестве селектора передаю .elem, соответственно фильтроваться будет только по этим элементам и >обработчик будет срабатывать только в том случае, если событие «поднялось» от одного из отфильтрованных элементов.
А через let id = $(this).attr('id'); я получаю id из атрибута элемента. С чего там вообще должен быть какой-то другой элемент? Но дело не в содержимом, так POST вообще не приходил.
Немного поменял, теперь id получаю так:
$('.elem').on('click', function(e){
var id = $(this).attr('id');
отправляю
}
И теперь POST приходит, вместе с id, но в index.php ни if (!empty($_POST)), ни if (isset($_POST['id'])), ни if (!empty($_POST['id'])) не видит содержимого, хотя в network в form data приходит id, почему вообще так может происходить?
>И теперь POST приходит, вместе с id, но в index.php ни if (!empty($_POST)), ни if (isset($_POST['id'])), ни if (!empty($_POST['id'])) не видит содержимого, хотя в network в form data приходит id, почему вообще так может происходить?
Так может произойти, если Content-type запроса не application/x-www-form-urlencoded или multipart/form-data. Если у тебя там application/json, то нужно совершенно по другому данные вытягивать, обрати на это внимание
Так network также говорит, что это Content-Type: application/x-www-form-urlencoded; charset=UTF-8
При этом if($_SERVER["REQUEST_METHOD"] == "POST") тоже не видит post...
да
У apache есть модули, которых нет у nginx.
Например, на вирт.хостинге нужно дать клиентам тот же mod_rewrite с управлением через .htaccess
Давно читал что апащ быстрее обрабатывает пхп чем нжайнкс и поэтому имеет смысл их в связке использовать. На сколько это верно было тогда и на сколько верно сейчас я хз.
>сначала надо стать вротендером
Зачем? Бекенд на ноде это именно бекенд. Редкий пхпшник с нодой дела не имел.
Потому что не страдай хуйнёй, и ставь уже локальный вебсервер nginx или apache. Все эти встроенные-от лукавого.
Вывожу: CASE WHEN accepted=true THEN 'Да'
WHEN accepted=false THEN 'Нет'
END
и получаю Undefined variable. C 1/0 то же самое.
А, всё, забыл AS хуй в конце.
Суть простая: я передаю данные с формы через fetch в файл .php. При print_r (или var_dump, неважно) $_POST показывает пустой массив. НО - на страницу с JS приходят обработанные данные в виде массива. Точно так же если я через .php запихну приходящие данные в текстовый файл, они там также появятся.
То есть данные приходят, но .php отказывается мне их выводить непосредственно У СЕБЯ. $_POST "типа" пустой, но он блять по факту не пустой как бы, раз данные приходят и уходят.
Где я туплю? Может быть, в .php и не получится выводить? Помогите плз.
В дополнение. Могу вывести данные в другой .php файл тоже. То есть получается, что .php файл, на который приходит запрос, является чисто обработчиком-посредником, или как?
Ну так открой новое окно в чем проблема
Чем лучше? Образами по 9гб для элементарных вещей? Хипстерская погань, мало имеющая отношение к разработке - это к девопсам.
Как скажешь, борщехлеб.
> git,
Это для всех разработчиков святая святых, но достаточно знать базовые команды
> rest, api,
Я не уверен что битриксоидам это требуется знать, я полгода с этим говном работал и там не использовалось. REST API это такия методолгия, больше подойдет для микросервисной архитектуры и бэка для мобилока и фронта на всяких реактах
> ajax,
2,5 функции на жабаскрипте
> JavaScript, css, html,
Для веба нужно знать обязательно
> babel,
Тут особо знать не нужно, он нужен чтобы скомпилировать новый js в старый код чтобы его поняли все браузеры, обычно в вебпаке подключается
> jquery
В битриксопарашах используется повсюду, тебе лишь нужно знать ajax и суметь подключить библиотека с анимашками, слайдерами.
> вы реально это всё знаете???
Да и намного больше чем это все
Есть какие-то материалы по Битриксу? Как его изучают вообще - он же платный.
Хотел бы оценить его для общего развития такскать.
> нужен макбук
Ты конечно ещё до этого перетолстил, но это уже ни в какие ворота.
Тебе только на второй недели работы сказали, что нужен макбук?
На кой хуй он блять может быть нужен?
Это уже для более серьёзных проектов(но мне WSL для этого хватает).
Для изучения фреймворка докер-оверкилл.
Оф документация. Но оно тебя сожрет
По сути это только официальная документация которая на пару лет отстает, но обычно в битриксгалеры берут всех с улицы кто может чуть-чуть по фронтенду и чуть-чуть в пхп. Скорее всего тебе через месяц другой придется сдавать первый экзамен https://academy.1c-bitrix.ru/certification/exams.php так что можешь сразу попробовать поделать эти задания. Бесплатно можешь 30 дней юзать локально, потом либо переустановить, либо расшифровать файлик include.php и там подшаманить и получить демку навсегда, в гугле есть все.
Но прям с головой советую не окунаться в эту хуйню, а потихоньку дрочить лару и реакт или ву.жс иначе есть риск остаться сантехником в мире программистов и всю жизнь ковыряться в унитазе. Я когда шел туда знал что битрикс это говно, но чтобы это было настолько сильным говном я не ожидал. И большинство задач будут в стиле передвинь этот блок, добавь новое в админке и выводи оттуда текст и прочая хуйня усложненная тем что твои коллеги до этого делали наотъебись.
Чуть не забыл есть же охуенный курс https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&INDEX=Y с не менее охуенным цитатами разработчиков)
Второй пик впечатляет.
Тоже кекнул со второй.
Ок, пасиба.
Какой SAPI лучший по производительности? Не гуглится сравнение с ReactPHP/Rachet и другими вариантами работы с постоянными соединениями. Почитал о внутреннем устройстве PHP, но так и не понял разницу в способах запуска PHP-FPM с другими вариантами. Не понимаю как PHP обрабатывает много запросов. Из за этого не могу понять как его лучше использовать.
> Суть простая: я передаю данные с формы через fetch в файл .php. При print_r (или var_dump, неважно) $_POST показывает пустой массив.
А как ты просматриваешь результат? В инструментах разработчика? Если нет, то конечно оно работать не будет.
Скорее всего ты либо как-то не так вызываешь скрипт. Либо просто опечатался, например, написал $POST вместо $_POST.
Вообще, если ты хочешь дампить данные аякс-запросов, то удобно выводить их в консоль, если ты используешь встроенный в PHP веб-сервер (не Апач или php-fpm). Для этого можно написать просто:
fprintf(STDERR, "POST = %s\n", json_encode($_POST));
и сообщение выведется в ту консоль, где запущен веб-сервер.
Чтобы объективно сравнивать, надо либо делать бенчмарки, либо найти готовые.
Если ты не хочешь писать свой сервер, то стоит использовать php-fpm и FastCGI - он рассчитан на продакшен-использование. Если ты готов писать свой сервер, то ты можешь написать его, но надо будет запустить много процессов, чтобы они могли загрузить все ядра процессора, и кто-то (nginx?) должен распределять приходящие запросы между ними.
Без запуска множества процессов у тебя будет лишь один процесс, нагружающий лишь одно ядро. Ну и нужен будет менеджер, который будет отслеживать упавшие процессы, перезапускать их, собирать логи и в общем делать то, чем занимается php-fpm.
php-fpm работает так: он запускает определенное количество процессов-работников (оптимальное количество настраивается в конфиге вручную). Затем он принимает от nginx запросы по протоколу FastCGI и распределяет их по работникам. Работников должно быть больше, чем ядер процессора, раза в полтора-два-тьри. Один работник может за свою жизнь обработать много запросов, но по очереди, по одному за раз. Работник однопоточный и использует максимум одно ядро. Поэтому их должно быть много. Но не слишком - иначе ресурсы будут уходить на переключения между ними.
Если есть конкретные вопросы, уточняй.
Это принцип работы командной строки - пока выполняется одна команда, нельзя набирать или выполнять следующую. Более того, команда php artisan serve выводит логи и они бы мешали тебе выполнять другие команды.
Если ты хочешь что-то делать, просто открой еще одну консоль.
Если ты хочешь прервать работу сервера, то используй Ctrl + C.
>>105101
Ты не прав. Для разработки как раз удобен встроенный в PHP сервер тем, что не надо ничего конфигурировать, что в фоне не крутится никаких подвисших скриптов и тд.
У тебя вопрос из серии "продайте мне эту ручку". Мы не менеджеры по продажам, чтобы на такие вопросы отвечать, но раз ты хочешь, отвечу.
В Питоне есть Доктрина? Абстрактные классы и интерфейсы? Проверка типов в рантайме? Да и он мягко говоря небыстрый. Хотя я для своих дел иногда использую: jupyter notebook, numpy, sympy и другие вещи.
>>104233
Это неверно. Nginx не "обрабатывает" PHP-код, а перенаправляет запросы к Апачу или php-fpm.
>>103564
Возможно совместимость со старым кодом, который использует, например, htaccess файлы.
>>104279
Потому что Апач не очень эффективно работает с медленными клиентами.
У Апача запущено N процессор-работников, которые обрабатывают запросы. Работник обрабатывает одновременно только один запрос. Если запрос отправил пользователь с медленным интернетом, то работник быстро выполняет PHP-скрипт (или читает запрошенный файл), но долго отдает ответ (так как канал медленный). И все время пока ответ отдается, работник не может заниматься ничем другим. То есть, получается, работник меньшую часть времени занимается полезной работой, а большую часть времени просто занимается ожиданием передачи ответа.
Если таких проблемных пользователей много, то все работники могут оказаться занятыми отдачей ответов и сервер начнет тормозить, хотя процессор у него совсем не нагружен.
Нгинкс решает эту проблему - он очень быстро принимает ответ от Апача и потом не спеша отдает пользователю. При этом нгинкс параллельно с отдачей ответа обслуживает и других пользователей.
>Если ты готов писать свой сервер, то ты можешь написать его, но надо будет запустить много процессов, чтобы они могли загрузить все ядра процессора
Зачем много процессов? Конкурентный код в одном процессе, даже в одном потоке может исполняться на нескольких ядрах.
>Без запуска множества процессов у тебя будет лишь один процесс, нагружающий лишь одно ядро.
Можешь объяснить почему? Если код состоит из 100 чистых функций, то ОС же может конкурентно исполнять этот код на нескольких ядрах.
>php-fpm
Все таки он не так уж хорош по производительности и ресурсоемкости.
>>105021
>Почему у меня в командной строке когда я прописываю php artisan serve, я теряю над ней контроль и не могу больше писать.
Потому что ты запустил задачу в процессе ОС, он заблокирован для дальнейшего введения инструкций пока задача не выполнится.
Та не, всё в порядке, просто я долбаеб. Идея ругается "Deprecated global variable usage" как тогда их правильно использовать, если внутри функции нельзя? https://www.php.net/manual/ru/language.variables.predefined.php
> Конкурентный код в одном процессе, даже в одном потоке может исполняться на нескольких ядрах
Нет. Ты не понимаешь, что такое процесс и поток и как работает процессор.
Программа - это последовательность команд. Она может выглядеть, например, так (скобка показывает текущую выполняемую команду. В процессоре есть специальный регистр, который хранит номер текущей выполняемой команды):
> 1) a = 1
2) b = a + 10
3) c = b x 2
....
Процессор исполняет команды в программе строго по очереди. И программа рассчитана на то, что ее будут выполнять последовательно. Например, у нас в программе команда 2 использует результат команды 1 (a). Соответственно, нельзя выполнить команду 2 до выполнения команды 1 или параллельно с ней.
Такое последовательное выполнение команд еще называют "поток исполнения".
Если вдруг второе ядро попыталось бы выполнить команду 2 параллельно с тем, как первое ядро выполняет команду 1, то оно бы получило неправильный результат, так как значение a пока неизвестно.
То есть, и процессор, и программы рассчитаны именно на последовательное выполнение команд. При этом неважно, какие функции - чистые или нет - ты используешь. Они будут выполняться последовательно одним ядром.
В теории, если у тебя есть 2 чистых функции (или команды), которые не зависят друг от друга, то можно было бы написать такую программу:
1) a = b + 2 + c x 3
2) выполнить на втором ядре: d = b + 5 + с
3) e = a + d
В этой программе первое ядро могло бы выполнять команду 1, а второе - команду 2. Но это бы потребовало так называемое "переключение контекста": второе ядро должно переключиться с текущей исполняемой программы на нашу, выполнить одну команду 2 и переключиться обратно (так как оно больше не нужно). Переключения контекста относительно дорогие и занимают по времени больше, чем выполнение команды 2. То есть, мы бы больше потеряли, чем выиграли. Потому в процессорах и в ОС нет поддержки такого режима работы. Нельзя "позвать" второе ядро на помощь.
Хотя, идея использовать чистые функции для распараллеливания интересная. Возможно, когда-нибудь сделают процессор с такой возможностью.
На текущих процессорах, для того, чтобы задействовать второе ядро, ты должен либо создать новый процесс, либо новый поток исполнения. Запустить новый процесс - это по сути, запустить вторую независимую копию программы. У нее будет своя область памяти, свои переменные и она никак не будет связана с первой. Ее будет выполнять второе ядро.
Создание потока - это запуск второй копии программы в текущем процессе. То есть, мы говорим ОС "создай новый поток и пусть он выполняет команды, начиная с команды X". Второй поток будет видеть те же переменные, что и первый.
Минус использования потоков в том, что с ними сложнее программировать: так как память общая, один поток может изменить какие-нибудь данные, с которыми в это время работает второй поток, и получится неправильный результат.
И в случае с потоками, и в случае с процессами, нам нужна еще программа-менеджер, которая будет ими управлять, создавать их при необходимости, распределять запросы между ними.
Таким образом, в языках вроде PHP, питон, JS, если ты вызываешь несколько чистых функций подряд:
$a = func1();
$b = func2();
Они выполняются последовательно. В языке Го есть возможность запустить выполнение нескольких функций (неважно, чистых или нет) параллельно:
go func1();
go func2();
...
здесь функции func1 и func2 запустятся как бы "в фоне", и будут исполняться параллельно с продолжением работы основной программы. Но это работает за счет использования потоков. В программе Го запущено несколько потоков, которые ждут задач и когда мы делаем go func1, мы посылаем такому потоку команду "выполни функцию func1" и он начинает ее выполнять.
То есть, программы на Го многопоточные и потому умеют параллельно выполнять код. В однопоточной программе задействовать более одно ядра и параллельно выполнять несколько команд на разных ядрах невозможно.
> Если код состоит из 100 чистых функций, то ОС же может конкурентно исполнять этот код на нескольких ядрах.
В теории может. На практике не может, так как переключения контекста дорогие. Если ты хочешь исполнять функции параллельно, ты должен создать новый поток и поручить ему выполнять эту функцию. Создание потока тоже не бесплатная операция, потому обычно их создают не когда они понадобятся, а заранее (это называется thread pool - пул потоков).
>>php-fpm
> Все таки он не так уж хорош по производительности и ресурсоемкости.
Пруфов и бенчмарков, конечно, не будет.
> Конкурентный код в одном процессе, даже в одном потоке может исполняться на нескольких ядрах
Нет. Ты не понимаешь, что такое процесс и поток и как работает процессор.
Программа - это последовательность команд. Она может выглядеть, например, так (скобка показывает текущую выполняемую команду. В процессоре есть специальный регистр, который хранит номер текущей выполняемой команды):
> 1) a = 1
2) b = a + 10
3) c = b x 2
....
Процессор исполняет команды в программе строго по очереди. И программа рассчитана на то, что ее будут выполнять последовательно. Например, у нас в программе команда 2 использует результат команды 1 (a). Соответственно, нельзя выполнить команду 2 до выполнения команды 1 или параллельно с ней.
Такое последовательное выполнение команд еще называют "поток исполнения".
Если вдруг второе ядро попыталось бы выполнить команду 2 параллельно с тем, как первое ядро выполняет команду 1, то оно бы получило неправильный результат, так как значение a пока неизвестно.
То есть, и процессор, и программы рассчитаны именно на последовательное выполнение команд. При этом неважно, какие функции - чистые или нет - ты используешь. Они будут выполняться последовательно одним ядром.
В теории, если у тебя есть 2 чистых функции (или команды), которые не зависят друг от друга, то можно было бы написать такую программу:
1) a = b + 2 + c x 3
2) выполнить на втором ядре: d = b + 5 + с
3) e = a + d
В этой программе первое ядро могло бы выполнять команду 1, а второе - команду 2. Но это бы потребовало так называемое "переключение контекста": второе ядро должно переключиться с текущей исполняемой программы на нашу, выполнить одну команду 2 и переключиться обратно (так как оно больше не нужно). Переключения контекста относительно дорогие и занимают по времени больше, чем выполнение команды 2. То есть, мы бы больше потеряли, чем выиграли. Потому в процессорах и в ОС нет поддержки такого режима работы. Нельзя "позвать" второе ядро на помощь.
Хотя, идея использовать чистые функции для распараллеливания интересная. Возможно, когда-нибудь сделают процессор с такой возможностью.
На текущих процессорах, для того, чтобы задействовать второе ядро, ты должен либо создать новый процесс, либо новый поток исполнения. Запустить новый процесс - это по сути, запустить вторую независимую копию программы. У нее будет своя область памяти, свои переменные и она никак не будет связана с первой. Ее будет выполнять второе ядро.
Создание потока - это запуск второй копии программы в текущем процессе. То есть, мы говорим ОС "создай новый поток и пусть он выполняет команды, начиная с команды X". Второй поток будет видеть те же переменные, что и первый.
Минус использования потоков в том, что с ними сложнее программировать: так как память общая, один поток может изменить какие-нибудь данные, с которыми в это время работает второй поток, и получится неправильный результат.
И в случае с потоками, и в случае с процессами, нам нужна еще программа-менеджер, которая будет ими управлять, создавать их при необходимости, распределять запросы между ними.
Таким образом, в языках вроде PHP, питон, JS, если ты вызываешь несколько чистых функций подряд:
$a = func1();
$b = func2();
Они выполняются последовательно. В языке Го есть возможность запустить выполнение нескольких функций (неважно, чистых или нет) параллельно:
go func1();
go func2();
...
здесь функции func1 и func2 запустятся как бы "в фоне", и будут исполняться параллельно с продолжением работы основной программы. Но это работает за счет использования потоков. В программе Го запущено несколько потоков, которые ждут задач и когда мы делаем go func1, мы посылаем такому потоку команду "выполни функцию func1" и он начинает ее выполнять.
То есть, программы на Го многопоточные и потому умеют параллельно выполнять код. В однопоточной программе задействовать более одно ядра и параллельно выполнять несколько команд на разных ядрах невозможно.
> Если код состоит из 100 чистых функций, то ОС же может конкурентно исполнять этот код на нескольких ядрах.
В теории может. На практике не может, так как переключения контекста дорогие. Если ты хочешь исполнять функции параллельно, ты должен создать новый поток и поручить ему выполнять эту функцию. Создание потока тоже не бесплатная операция, потому обычно их создают не когда они понадобятся, а заранее (это называется thread pool - пул потоков).
>>php-fpm
> Все таки он не так уж хорош по производительности и ресурсоемкости.
Пруфов и бенчмарков, конечно, не будет.
Ты можешь попробовать поставить в скрипте var_dump($_POST); var_dump($_GET); var_dump($_SERVER); и посмотреть, что приходит в скрипт.
И еще, если ты используешь встроенный в IDE веб-сервер, то он может, например, не поддерживать POST.
>>107132
Скорее всего причина в чем-то другом. Использовать эти переменные можно и они не устарели.
Можно разжевать, пожалуйста? только учусь
>Процессор исполняет команды в программе строго по очереди. И программа рассчитана на то, что ее будут выполнять последовательно. Например, у нас в программе команда 2 использует результат команды 1 (a). Соответственно, нельзя выполнить команду 2 до выполнения команды 1 или параллельно с ней.
Это не так. Ты залез в процессор, но забыл, что между кодом и процессором есть ОС. Планировщик ОС может переключать исполнение на другие ядра. Не силен в ассемблере, но знаю точно, что его код можно выполнять конкурентно и даже параллельно. Это аппаратные конкурентность и параллелизм. Есть и программные конкурентность и параллелизм, реализуемые компилятором, интерпретатором или виртуальной машиной.
>здесь функции func1 и func2 запустятся как бы "в фоне", и будут исполняться параллельно с продолжением работы основной программы
Не параллельно, а конкурентно. Параллельность это когда одна задача исполняется несколькими процессорами или ядрами одновременно.
>То есть, программы на Го многопоточные и потому умеют параллельно выполнять код.
Многопоточность не равно параллельность.
>Пруфов и бенчмарков, конечно, не будет.
Погугли. RoadRunner и ReactPHP могут обработать в несколько раз больше запросов в секунду.
Ты пишешь то, в чем не разбираешься.
> Планировщик ОС может переключать исполнение на другие ядра.
Может, но это ничего не меняет. Допустим, код 2 периода времени выполняется на ядре 1, а потом 2 периода времени выполняется на ядре 2. Что от этого поменяется? Производительность от этого не повысится, а даже чуть понизится (из-за расходов на переключение контекста. Они происходят, когда ядро переключается с выполнения одной программы на другую).
> Не силен в ассемблере, но знаю точно, что его код можно выполнять конкурентно и даже параллельно.
Ну так давай я тебе расскажу про ассемблер. В процессоре есть счетчик команд (в архитектуре x86_64 он называется rip), который указывает номер текущей команды. Каждый такт процессор берет команду по адресу rip, исполняет ее и увеличивает rip (условно) на единицу. Как ты в такой системе получишь параллельность? Она строго последовательная.
Естественно, если у тебя два ядра, то у каждого из них свой регистр rip и каждое выполняет свою последовательность команд независимо от другого. Но чтобы задействовать два ядра для выполнения одной и той же программы, ты должен создать второй поток. Тогда одно ядро будет выполнять одну последовательность команд из программы, а другое - другую. Однопоточная программа будет выполняться только на одном ядре.
Если ты считаешь, что я ошибаюсь, дай ссылку, утверждающую обратное.
> Это аппаратные конкурентность и параллелизм.
Это ты что-то не так понял. В процессоре есть некоторый "параллелизм", когда он может выполнить, например, две соседние команды одновременно, если они не зависят друг от друга и если исполнительные устройства свободны. Но ты этим не можешь управлять и это не позволяет выполнять параллельно две произвольные функции. Это можно не рассматривать.
> Есть и программные конкурентность и параллелизм, реализуемые компилятором, интерпретатором или виртуальной машиной.
Речь изначально шла о том, что однопоточная программа не может использовать более одного ядра. Компилятор или виртуальная машина здесь ничего не меняют.
По моему, ты тут путаешь понятия "конкуррентное выполнение" и "использование нескольких ядер". В компьютере с одним ядром операционная система может периодически прерывать выполнение одной программы и выполнять другую. Таким образом реализуется многозадачность. Компилятор может скомпилировать программу так, что в ней по очереди будут выполняться разные участки, имитируя параллельное выполнение. Но это все никак не решает исходную задачу - использовать более одного ядра однопоточной программой.
> Не параллельно, а конкурентно. Параллельность это когда одна задача исполняется несколькими процессорами или ядрами одновременно.
В Го эти функции запускаются в отдельных потоках (Го многопоточный внутри) и будут исполняться параллельно при наличии свободных ядер.
> Погугли. RoadRunner и ReactPHP могут обработать в несколько раз больше запросов в секунду.
Ты не дал ссылку на бенчмарк, значит, я могу предположить, что это какой-нибудь синтетический бенчмарк. Например, уровня hello world, который не имитирует реальное приложение (работающее с базой данных, хранилищами итд.) а просто проверяет, сколько раз в секунду он может отдать строку hello world. Такой бенчмарк имеет мало ценности для оценки производительности реальных приложений.
Плюс, у этих библиотек есть свои проблемы и подводные камни.
Также, я вижу, что ты даже не пытался разобраться в том, как работает RoadRunner, хотя в документации есть картинка: https://roadrunner.dev/docs/intro-about
RoadRunner запускает множество процессов PHP и этим добивается использования множества ядер, и сам он многопоточный. А ты утверждаешь, что однопоточная программа, написанная на каких-то чистых функциях, будет задействовать несколько ядер.
Приложение на ReactPHP также нужно запускать в виде нескольких процессов, чтобы задействовать все ядра.
Ты пишешь то, в чем не разбираешься.
> Планировщик ОС может переключать исполнение на другие ядра.
Может, но это ничего не меняет. Допустим, код 2 периода времени выполняется на ядре 1, а потом 2 периода времени выполняется на ядре 2. Что от этого поменяется? Производительность от этого не повысится, а даже чуть понизится (из-за расходов на переключение контекста. Они происходят, когда ядро переключается с выполнения одной программы на другую).
> Не силен в ассемблере, но знаю точно, что его код можно выполнять конкурентно и даже параллельно.
Ну так давай я тебе расскажу про ассемблер. В процессоре есть счетчик команд (в архитектуре x86_64 он называется rip), который указывает номер текущей команды. Каждый такт процессор берет команду по адресу rip, исполняет ее и увеличивает rip (условно) на единицу. Как ты в такой системе получишь параллельность? Она строго последовательная.
Естественно, если у тебя два ядра, то у каждого из них свой регистр rip и каждое выполняет свою последовательность команд независимо от другого. Но чтобы задействовать два ядра для выполнения одной и той же программы, ты должен создать второй поток. Тогда одно ядро будет выполнять одну последовательность команд из программы, а другое - другую. Однопоточная программа будет выполняться только на одном ядре.
Если ты считаешь, что я ошибаюсь, дай ссылку, утверждающую обратное.
> Это аппаратные конкурентность и параллелизм.
Это ты что-то не так понял. В процессоре есть некоторый "параллелизм", когда он может выполнить, например, две соседние команды одновременно, если они не зависят друг от друга и если исполнительные устройства свободны. Но ты этим не можешь управлять и это не позволяет выполнять параллельно две произвольные функции. Это можно не рассматривать.
> Есть и программные конкурентность и параллелизм, реализуемые компилятором, интерпретатором или виртуальной машиной.
Речь изначально шла о том, что однопоточная программа не может использовать более одного ядра. Компилятор или виртуальная машина здесь ничего не меняют.
По моему, ты тут путаешь понятия "конкуррентное выполнение" и "использование нескольких ядер". В компьютере с одним ядром операционная система может периодически прерывать выполнение одной программы и выполнять другую. Таким образом реализуется многозадачность. Компилятор может скомпилировать программу так, что в ней по очереди будут выполняться разные участки, имитируя параллельное выполнение. Но это все никак не решает исходную задачу - использовать более одного ядра однопоточной программой.
> Не параллельно, а конкурентно. Параллельность это когда одна задача исполняется несколькими процессорами или ядрами одновременно.
В Го эти функции запускаются в отдельных потоках (Го многопоточный внутри) и будут исполняться параллельно при наличии свободных ядер.
> Погугли. RoadRunner и ReactPHP могут обработать в несколько раз больше запросов в секунду.
Ты не дал ссылку на бенчмарк, значит, я могу предположить, что это какой-нибудь синтетический бенчмарк. Например, уровня hello world, который не имитирует реальное приложение (работающее с базой данных, хранилищами итд.) а просто проверяет, сколько раз в секунду он может отдать строку hello world. Такой бенчмарк имеет мало ценности для оценки производительности реальных приложений.
Плюс, у этих библиотек есть свои проблемы и подводные камни.
Также, я вижу, что ты даже не пытался разобраться в том, как работает RoadRunner, хотя в документации есть картинка: https://roadrunner.dev/docs/intro-about
RoadRunner запускает множество процессов PHP и этим добивается использования множества ядер, и сам он многопоточный. А ты утверждаешь, что однопоточная программа, написанная на каких-то чистых функциях, будет задействовать несколько ядер.
Приложение на ReactPHP также нужно запускать в виде нескольких процессов, чтобы задействовать все ядра.
И попробуй просто вчитаться внимательнее в слова. Поток - это (условно) последовательность команд, которые выполняет процессор. Если программа однопоточная, значит в ней один поток и в любой момент времени выполняется одна последовательность команд. И значит, она никак не может использовать два ядра.
>$this->{'user:created_at'}
Увидел такое в коде класса, что оно делает? Чет не гуглится. Видимо тут идет обращение к полю user, который является объектом, и в нем считывается поле created_at, но это не точно. Причем в самом классе поля user нет, как нет его в трейтах и родительских классах и интерфейсах. Проект написан на Симфони.
Да вроде смотрел, тоже глухо. По всему коду буквально пара мест, где используются магические get/set и это не мой случай.
>$this->{'user:created_at'}
Вот этот кусок это чтение или запись в поле user:created_at, но это невалидное имя если обращаться напрямую, его нельзя например вызвать как $this->user:created_at, поэтому приходится ебаться с подстановкой через строку, без кода непонятно нахуя там себе жизнь усложнять, но очевидно это было сделано не прям просто так
Это просто такое имя свойства. Синтаксис такой:
$object->{выражение}
Например:
$object->{somefunc()}
$object->{'aaaa'}
То есть идет обращение к свойству с именем "user:created_at".
Как по мне, так какой-то изврат.
>В процессоре есть некоторый "параллелизм", когда он может выполнить, например, две соседние команды одновременно, если они не зависят друг от друга и если исполнительные устройства свободны. Но ты этим не можешь управлять и это не позволяет выполнять параллельно две произвольные функции. Это можно не рассматривать.
Суперскалярность, SIMD, короче параллелизм на уровне команд. Погуглив и почитав разные статьи и отрывки из книг на английском, пришел к выводу, что есть много возможностей для конкурентного и параллельного исполнения. Но это сложная тема, в ней легко запутаться. Процессоры развиваются, появляются новые аппаратные и программные фичи, также и в ОС появляются новые функции. Только вот кажется, что большая часть языков программирования это не используют.
>В Го эти функции запускаются в отдельных потоках (Го многопоточный внутри) и будут исполняться параллельно при наличии свободных ядер.
Разве горутина создает поток ОС?
>>107358
>И попробуй просто вчитаться внимательнее в слова. Поток - это (условно) последовательность команд, которые выполняет процессор. Если программа однопоточная, значит в ней один поток и в любой момент времени выполняется одна последовательность команд. И значит, она никак не может использовать два ядра.
Что ты понимаешь под потоком? Непонятно тогда что есть concurrency и асинхронность.
>>107358
Предположим, что один поток может выполняться только на одном ядре. Как тогда эффективно исполнять код чтобы не было блокировок и чтобы ядро было утилизировано на 100%? Node.js из коробки исполняется в одном потоке. В нем появились легкие потоки, но сейчас не о них. Node.js является concurrency системой? Да. Асинхронный? Да. Вопрос как? Как они это делают без потоков? Почему в пхп нет?
В некоторых языках реализуют concurrency and parallelism как библиотеку языка и довольно успешно. Например в Guile. Внимание вопрос, почему в PHP такой тухляк? Почему в документации толком не описано как PHP код исполняется на машине? Почему не описано как множество запросов обрабатываются одновременно? Почему в книгах этого нет? Почему разработчики об этом не говорят? Почему нет попыток что то написать для исправления ситуации? Вот я загуглил про Go и есть доскональные объяснения как это работает в нем. Как мне понять как это работает в PHP?
Параллеллизм на уровне команд - это возможность выполнять несколько команд одновременно, если они не зависят друг от друга и если есть свободные исполнительные устройства.
Исполнительное устройство - это штука внутри процессора, которая умеет выполнять какую-то операцию, например: сложение, умножение, битовые операции итд.
Например, у нас есть программа:
1) c = a + b
2) d = e + f
В этой программе команды не зависят друг от друга (команда 2 не использует результат команды 1).
Классический процессор выполнит их по очереди, затратив два такта. Современный процессор x86_64, если в нем есть два суммирующих устройства, может выполнить команды параллельно за один такт - каждую команду на своем устройстве. Но этот паралеллизм неявный, то есть ты не можешь им управлять. Ты просто пишешь программу последовательно, а процессор по возможности (анализируя зависимости команд друг от друга) выполняет команды параллельно, не нарушая последовательную логику программы. То есть, результат программы гарантированно такой же, как если бы она выполнялась последовательно.
В отечественном процессоре Эльбрус используется явный паралеллизм - ты в программе прямо пишешь группы инструкций, которые будут выполняться параллельно, и распределяешь, на каком исполнительном устройстве будет выполняться каждая из подкоманд. То есть для Эльбруса программа выглядит как-то так:
1) c = a + b, d = e + f
> SIMD
SIMD это просто выполнение одинаковой операции над несколькими парами чисел. Ну например, попарное сложение 4 пар чисел с получением 4 результатов. Если у тебя есть два массива по 1000 чисел и тебе надо их сложить, то использование SIMD здорово ускорит процесс.
Все это не меняет того, что однопоточная программа использует одно ядро процессора.
> Только вот кажется, что большая часть языков программирования это не используют.
Используют, но не все. Например, в Питоне есть библиотека numpy для работы с массивами чисел, и она использует SIMD для ускорения своей работы.
> Разве горутина создает поток ОС?
Го при запуске (если не путаю) создает пул фоновых потоков. Эти потоки изначально просто ничего не делают и ждут команд. Когда встречается команда вроде
go func1()
то в очередь команд отправляется команда выполнить функцию func1, первый свободный поток берет ее и начинает выполнять. Там у Го целый планировщик потоков написан для этого. Например, когда горутина делает какой-то блокирующий вызов (например, ожидание данных из сети), то она добровольно отдает управление и планировщик может запустить в этом потоке следующую задачу.
> Что ты понимаешь под потоком?
Поток (thread) - это примитив операционной системы. https://ru.wikipedia.org/wiki/Поток_выполнения
> Непонятно тогда что есть concurrency и асинхронность.
Ну это ты эти понятия притащил, а не я.
Параллеллизм на уровне команд - это возможность выполнять несколько команд одновременно, если они не зависят друг от друга и если есть свободные исполнительные устройства.
Исполнительное устройство - это штука внутри процессора, которая умеет выполнять какую-то операцию, например: сложение, умножение, битовые операции итд.
Например, у нас есть программа:
1) c = a + b
2) d = e + f
В этой программе команды не зависят друг от друга (команда 2 не использует результат команды 1).
Классический процессор выполнит их по очереди, затратив два такта. Современный процессор x86_64, если в нем есть два суммирующих устройства, может выполнить команды параллельно за один такт - каждую команду на своем устройстве. Но этот паралеллизм неявный, то есть ты не можешь им управлять. Ты просто пишешь программу последовательно, а процессор по возможности (анализируя зависимости команд друг от друга) выполняет команды параллельно, не нарушая последовательную логику программы. То есть, результат программы гарантированно такой же, как если бы она выполнялась последовательно.
В отечественном процессоре Эльбрус используется явный паралеллизм - ты в программе прямо пишешь группы инструкций, которые будут выполняться параллельно, и распределяешь, на каком исполнительном устройстве будет выполняться каждая из подкоманд. То есть для Эльбруса программа выглядит как-то так:
1) c = a + b, d = e + f
> SIMD
SIMD это просто выполнение одинаковой операции над несколькими парами чисел. Ну например, попарное сложение 4 пар чисел с получением 4 результатов. Если у тебя есть два массива по 1000 чисел и тебе надо их сложить, то использование SIMD здорово ускорит процесс.
Все это не меняет того, что однопоточная программа использует одно ядро процессора.
> Только вот кажется, что большая часть языков программирования это не используют.
Используют, но не все. Например, в Питоне есть библиотека numpy для работы с массивами чисел, и она использует SIMD для ускорения своей работы.
> Разве горутина создает поток ОС?
Го при запуске (если не путаю) создает пул фоновых потоков. Эти потоки изначально просто ничего не делают и ждут команд. Когда встречается команда вроде
go func1()
то в очередь команд отправляется команда выполнить функцию func1, первый свободный поток берет ее и начинает выполнять. Там у Го целый планировщик потоков написан для этого. Например, когда горутина делает какой-то блокирующий вызов (например, ожидание данных из сети), то она добровольно отдает управление и планировщик может запустить в этом потоке следующую задачу.
> Что ты понимаешь под потоком?
Поток (thread) - это примитив операционной системы. https://ru.wikipedia.org/wiki/Поток_выполнения
> Непонятно тогда что есть concurrency и асинхронность.
Ну это ты эти понятия притащил, а не я.
>Классический процессор выполнит их по очереди, затратив два такта.
Ты сказал?
>Ты просто пишешь программу последовательно
По нормальному нужно писать не последовательный, а независимый от последовательности код. Посмотри как пишут на Lisp, можешь ли ты понять в какой последовательности будет исполняться его код? Последовательный код это пережиток императивного программирования. Функциональный код как и математические выражения не подразумевает никакого исполнителя, это просто одно большое выражение состоящее из более мелких выражений. Для такого кода не важно в какой последовательности он будет исполняться.
Посмотри на Erlang. Та же история. Нет точки входа. Нет никаких инструкций. Нет состояния. Есть только выражения. Виртуальная машина сама все скейлит. К этому нужно стремиться. Нужно стремиться отходить от уровня абстракции ОС и процессора. Пусть компиляторы и виртуальные машины абстрагируют от этого уровня. Нужно писать код удобно для программиста, а не удобно для машины. Идиотизм подстраиваться под машину, пусть она подстраивается под человека. Для чего тогда нужны компиляторы и VM?
>Го при запуске (если не путаю) создает пул фоновых потоков.
Говорят, что типичная программа на Go состоит из тысяч горутин. Хочешь сказать, что Go создает тысячи тредов в ОС? Не поверю. У него же есть рантайм, он же не голый как Си. В Эрланге создают миллионы эрланг-процессов. Естественно виртуальная машина не создает для них миллионы тредов ОС. Все они абстрактные и живут в рантайме.
Если Node.js однопоточный и по твоему исполняется в одном ядре, то как на нем поднимают миллион вебсокет соединений?
https://alexhultman.medium.com/millions-of-active-websockets-with-node-js-7dc575746a01
Статью написал автор стека uNetworking Алекс Халтман https://github.com/uNetworking/uWebSockets.js. Их либы используют в биржевой торговле крупнейшие брокеры мира. Так как он может держать миллион активных соединений на одном ядре?
>Ну это ты эти понятия притащил, а не я.
Ты их игнорируешь. Они между прочим отвечают на вопрос как на одном ядре держать миллион или более соединений.
>Классический процессор выполнит их по очереди, затратив два такта.
Ты сказал?
>Ты просто пишешь программу последовательно
По нормальному нужно писать не последовательный, а независимый от последовательности код. Посмотри как пишут на Lisp, можешь ли ты понять в какой последовательности будет исполняться его код? Последовательный код это пережиток императивного программирования. Функциональный код как и математические выражения не подразумевает никакого исполнителя, это просто одно большое выражение состоящее из более мелких выражений. Для такого кода не важно в какой последовательности он будет исполняться.
Посмотри на Erlang. Та же история. Нет точки входа. Нет никаких инструкций. Нет состояния. Есть только выражения. Виртуальная машина сама все скейлит. К этому нужно стремиться. Нужно стремиться отходить от уровня абстракции ОС и процессора. Пусть компиляторы и виртуальные машины абстрагируют от этого уровня. Нужно писать код удобно для программиста, а не удобно для машины. Идиотизм подстраиваться под машину, пусть она подстраивается под человека. Для чего тогда нужны компиляторы и VM?
>Го при запуске (если не путаю) создает пул фоновых потоков.
Говорят, что типичная программа на Go состоит из тысяч горутин. Хочешь сказать, что Go создает тысячи тредов в ОС? Не поверю. У него же есть рантайм, он же не голый как Си. В Эрланге создают миллионы эрланг-процессов. Естественно виртуальная машина не создает для них миллионы тредов ОС. Все они абстрактные и живут в рантайме.
Если Node.js однопоточный и по твоему исполняется в одном ядре, то как на нем поднимают миллион вебсокет соединений?
https://alexhultman.medium.com/millions-of-active-websockets-with-node-js-7dc575746a01
Статью написал автор стека uNetworking Алекс Халтман https://github.com/uNetworking/uWebSockets.js. Их либы используют в биржевой торговле крупнейшие брокеры мира. Так как он может держать миллион активных соединений на одном ядре?
>Ну это ты эти понятия притащил, а не я.
Ты их игнорируешь. Они между прочим отвечают на вопрос как на одном ядре держать миллион или более соединений.
Есть несколько вариантов. Самый простой - это запустить несколько процессов. Когда первый процесс выполняет какую-то блокирующую операцию и останавливается, ОС передаст управление второму. Если процессов много, то все доступные ядра гарантированно будут загружены на 100%.
Плюс - простота. Ты просто пишешь обычный последовательный код.
Этот подход по умолчанию использует php-fpm. Он запускает N рабочих процессов и распределяет HTTP-запросы между ними. Рабочий обрабатывает поступающие ему запросы строго по очереди, но рабочих много, потому одновременно обрабатывается несколько запросов.
Минус этого подхода в том, что переключение ядра между процессами не бесплатное. Если ты переключаешься 100 раз в секунду - это незаметно. А если 100 000 - то еще как заметно и у тебя куча времени начинает уходить на переключения. То есть, если процесс выполняет множество блокирующих, но коротких операций, то становится выгоднее вовсе не отдавать управление и ждать, чем тратить время на переключение.
Есть другой подход - асинхронный код. Мы создаем "задачи" внутри однопоточного процесса и переключаемся между ними без привлечения ОС. То есть, одна задача, запрашивает у ОС получение каких-то данных, которое требует времени, и добровольно отдает управление планировщику. Планировщик передает управление другой задаче, а когда та завершится, проверяет, не пришли ли данные для первой задачи.
А для ОС это выглядит как один постоянно что-то делающий не блокирующийся процесс.
Такой процесс нагружает только одно ядро, потому ты должен запустить столько процессов, сколько у тебя ядер. Также, тебе понадобится менеджер процессов, который будет отслеживать упавшие процессы, запускать новые и распределять поступающие запросы между ними (это называется балансировка). В простом варианте можно использовать nginx для балансировки - он умеет раскидывать запросы по нескольким бекендам.
Еще из минусов - писать асинхронный код менее удобно, чем синхронный, тем более что в PHP нет async/await. Впрочем, в новых версиях будут fibers, которые облегчат это: https://wiki.php.net/rfc/fibers
> В некоторых языках реализуют concurrency and parallelism как библиотеку языка и довольно успешно.
concurrency это "принцип". Как ты его реализуешь в библиотеке? В Guile мне разбираться лень.
> Почему в документации толком не описано как PHP код исполняется на машине?
Наверно, предполагается, что программист и так это знает. Если ты программировал на Си или ассемблере, то ты и так понимаешь это.
> Почему не описано как множество запросов обрабатываются одновременно?
Потому что язык PHP не занимается обработкой запросов. Интерпретатор PHP лишь выполняет написанный в скрипте код. А вот запуском нужного количества копий интерпретатора, балансировкой запросов занимается php-fpm. Он подробно не описан, наверно потому, что предполагается, что разработчик знаком с моделью обработки запросов при помощи менеджера и множества работников.
> Почему нет попыток что то написать для исправления ситуации?
Ну а ты сам не хочешь разобраться и написать серию статей? Если нет, то почему кто-то другой должен это делать?
> Вот я загуглил про Go и есть доскональные объяснения как это работает в нем. Как мне понять как это работает в PHP?
Это потому, что в Го применен относительно новый принцип работы с потоками, а в PHP все работает по классической всем известной схеме.
Есть несколько вариантов. Самый простой - это запустить несколько процессов. Когда первый процесс выполняет какую-то блокирующую операцию и останавливается, ОС передаст управление второму. Если процессов много, то все доступные ядра гарантированно будут загружены на 100%.
Плюс - простота. Ты просто пишешь обычный последовательный код.
Этот подход по умолчанию использует php-fpm. Он запускает N рабочих процессов и распределяет HTTP-запросы между ними. Рабочий обрабатывает поступающие ему запросы строго по очереди, но рабочих много, потому одновременно обрабатывается несколько запросов.
Минус этого подхода в том, что переключение ядра между процессами не бесплатное. Если ты переключаешься 100 раз в секунду - это незаметно. А если 100 000 - то еще как заметно и у тебя куча времени начинает уходить на переключения. То есть, если процесс выполняет множество блокирующих, но коротких операций, то становится выгоднее вовсе не отдавать управление и ждать, чем тратить время на переключение.
Есть другой подход - асинхронный код. Мы создаем "задачи" внутри однопоточного процесса и переключаемся между ними без привлечения ОС. То есть, одна задача, запрашивает у ОС получение каких-то данных, которое требует времени, и добровольно отдает управление планировщику. Планировщик передает управление другой задаче, а когда та завершится, проверяет, не пришли ли данные для первой задачи.
А для ОС это выглядит как один постоянно что-то делающий не блокирующийся процесс.
Такой процесс нагружает только одно ядро, потому ты должен запустить столько процессов, сколько у тебя ядер. Также, тебе понадобится менеджер процессов, который будет отслеживать упавшие процессы, запускать новые и распределять поступающие запросы между ними (это называется балансировка). В простом варианте можно использовать nginx для балансировки - он умеет раскидывать запросы по нескольким бекендам.
Еще из минусов - писать асинхронный код менее удобно, чем синхронный, тем более что в PHP нет async/await. Впрочем, в новых версиях будут fibers, которые облегчат это: https://wiki.php.net/rfc/fibers
> В некоторых языках реализуют concurrency and parallelism как библиотеку языка и довольно успешно.
concurrency это "принцип". Как ты его реализуешь в библиотеке? В Guile мне разбираться лень.
> Почему в документации толком не описано как PHP код исполняется на машине?
Наверно, предполагается, что программист и так это знает. Если ты программировал на Си или ассемблере, то ты и так понимаешь это.
> Почему не описано как множество запросов обрабатываются одновременно?
Потому что язык PHP не занимается обработкой запросов. Интерпретатор PHP лишь выполняет написанный в скрипте код. А вот запуском нужного количества копий интерпретатора, балансировкой запросов занимается php-fpm. Он подробно не описан, наверно потому, что предполагается, что разработчик знаком с моделью обработки запросов при помощи менеджера и множества работников.
> Почему нет попыток что то написать для исправления ситуации?
Ну а ты сам не хочешь разобраться и написать серию статей? Если нет, то почему кто-то другой должен это делать?
> Вот я загуглил про Go и есть доскональные объяснения как это работает в нем. Как мне понять как это работает в PHP?
Это потому, что в Го применен относительно новый принцип работы с потоками, а в PHP все работает по классической всем известной схеме.
Отвечая на твой первоначальный вопрос, про производительность, тебе нужно делать тесты и измерения на более-менее реалистичном бенчмарке. Померять php-fpm, сравнить с тем же Roadrunner и делать выводы.
> Ты сказал?
Не понял. Ты не согласен? Опровергни ссылкой или хотя бы напиши, что тут не так. А то трудно тебя понять.
Если тебе хочется конкретные цифры, раньше в мануалах к процессорам явно указывалось, сколько тактов выполняется та или иная команда.
> По нормальному нужно писать не последовательный, а независимый от последовательности код.
Неважно, какой код ты пишешь. В конечном счете он превращается в ассемблер или интерпретируется написанным на ассемблере интерпретатором. А ассемблер на существующих процессорах выполняется строго последовательно. Код на Хаскелл тоже превращается в императивный последовательный ассемблер.
Если тебе это не нравится, ты можешь сделать свой процессор, который будет работать по другим принципам.
> Нет никаких инструкций. Нет состояния. Есть только выражения.
Ну это уже вкусовщина. Мне, например, нравится последовательный код своей простотой и удобством чтения и написания. Это удобно для описания бизнес-логики. Мне нравится, что есть операторы if и циклы for и while и не надо, как в Хаскелле, имитировать цикл через рекурсию или как там принято. А адские функции вроде reduce это шаг в прошлое в сравнении с простым и удобным циклом foreach.
Если тебе нравится хаскелл - так просто пиши на нем, в чем проблема?
> Говорят, что типичная программа на Go состоит из тысяч горутин. Хочешь сказать, что Go создает тысячи тредов в ОС? Не поверю.
Ну так погугли и прочитай. Он создает несколько тредов, которые выполняют кусочки горутин по очереди. Но треды он использует, чтобы задействовать все ядра процессора.
> Если Node.js однопоточный и по твоему исполняется в одном ядре, то как на нем поднимают миллион вебсокет соединений?
Одно дело принять миллион соединений, другое дело обрабатывать приходящие по ним данные. Там скорее всего ситуация, когда соединений много, но они большую часть времени неактивны и общая загрузка CPU не очень большая, и хватает одного ядра.
Например, если у него сетевое соединение 1 Гбит/с и это поделить на миллион соединений, то выходит всего лишь килобит/с (128 байт) на одно соединение. То есть данных там много не передается.
В такой ситуации однопоточная асинхронная модель подходит хорошо.
На PHP можно написать аналогичный веб-сокет сервер с помощью ReactPHP или amPHP, но я такое не делал и не могу гарантировать, что не обнаружится каких-то подводных камней.
> Ты их игнорируешь. Они между прочим отвечают на вопрос как на одном ядре держать миллион или более соединений.
Ни на что они не отвечают. То есть по твоему, когда встала задача поддерживать миллион соединений, не надо было думать, анализировать, почему классическая модель не работает, проектировать event loop - надо было просто вспомнить два слова и задача сама собой магически решилась без написания строчки кода?
Твои два слова ни на что не отвечают, и ты сам толком не понимаешь их значения, и зачем-то притащил.
Отвечая на твой первоначальный вопрос, про производительность, тебе нужно делать тесты и измерения на более-менее реалистичном бенчмарке. Померять php-fpm, сравнить с тем же Roadrunner и делать выводы.
> Ты сказал?
Не понял. Ты не согласен? Опровергни ссылкой или хотя бы напиши, что тут не так. А то трудно тебя понять.
Если тебе хочется конкретные цифры, раньше в мануалах к процессорам явно указывалось, сколько тактов выполняется та или иная команда.
> По нормальному нужно писать не последовательный, а независимый от последовательности код.
Неважно, какой код ты пишешь. В конечном счете он превращается в ассемблер или интерпретируется написанным на ассемблере интерпретатором. А ассемблер на существующих процессорах выполняется строго последовательно. Код на Хаскелл тоже превращается в императивный последовательный ассемблер.
Если тебе это не нравится, ты можешь сделать свой процессор, который будет работать по другим принципам.
> Нет никаких инструкций. Нет состояния. Есть только выражения.
Ну это уже вкусовщина. Мне, например, нравится последовательный код своей простотой и удобством чтения и написания. Это удобно для описания бизнес-логики. Мне нравится, что есть операторы if и циклы for и while и не надо, как в Хаскелле, имитировать цикл через рекурсию или как там принято. А адские функции вроде reduce это шаг в прошлое в сравнении с простым и удобным циклом foreach.
Если тебе нравится хаскелл - так просто пиши на нем, в чем проблема?
> Говорят, что типичная программа на Go состоит из тысяч горутин. Хочешь сказать, что Go создает тысячи тредов в ОС? Не поверю.
Ну так погугли и прочитай. Он создает несколько тредов, которые выполняют кусочки горутин по очереди. Но треды он использует, чтобы задействовать все ядра процессора.
> Если Node.js однопоточный и по твоему исполняется в одном ядре, то как на нем поднимают миллион вебсокет соединений?
Одно дело принять миллион соединений, другое дело обрабатывать приходящие по ним данные. Там скорее всего ситуация, когда соединений много, но они большую часть времени неактивны и общая загрузка CPU не очень большая, и хватает одного ядра.
Например, если у него сетевое соединение 1 Гбит/с и это поделить на миллион соединений, то выходит всего лишь килобит/с (128 байт) на одно соединение. То есть данных там много не передается.
В такой ситуации однопоточная асинхронная модель подходит хорошо.
На PHP можно написать аналогичный веб-сокет сервер с помощью ReactPHP или amPHP, но я такое не делал и не могу гарантировать, что не обнаружится каких-то подводных камней.
> Ты их игнорируешь. Они между прочим отвечают на вопрос как на одном ядре держать миллион или более соединений.
Ни на что они не отвечают. То есть по твоему, когда встала задача поддерживать миллион соединений, не надо было думать, анализировать, почему классическая модель не работает, проектировать event loop - надо было просто вспомнить два слова и задача сама собой магически решилась без написания строчки кода?
Твои два слова ни на что не отвечают, и ты сам толком не понимаешь их значения, и зачем-то притащил.
>Плюс - простота. Ты просто пишешь обычный последовательный код.
А если нужен обмен данными? Тогда одни проблемы.
>Этот подход по умолчанию использует php-fpm.
Поэтому он никуда не годится. Процессы это дорого и не эффективно. Сколько времени нужно чтобы запустить процесс? Много. Сколько нужно памяти? Очень много. И снова проблема обмена данными. Это устаревший подход.
>concurrency это "принцип". Как ты его реализуешь в библиотеке?
Также как эвент луп внутри процесса. Существует много абстрактных математических моделей concurrency и parallelism, как реализовать это вопрос другой, реализуют как то же.
>В Guile мне разбираться лень.
Если интересно посмотри видео https://www.youtube.com/watch?v=7IcI6sl5oBc
Это инновационный подход. В мейнстим языках такого не найдешь. Зато никаких проблем. Еще об этом https://dl.acm.org/doi/10.1145/1596550.1596588
>Наверно, предполагается, что программист и так это знает.
Не смеши. Пхпшники ничего не знают об этом. Именно по причине того, что в языке ничего нет и в доке не описано.
>Если ты программировал на Си или ассемблере, то ты и так понимаешь это.
Я тебя умоляю. На php в основном приходят без опыта программирования. Только единицы переходят в php уже имея опыт. И чаще всего этот опыт нерелевантный. Они в 80-90хх что то там писали. Сейчас процессоры и подходы изменились и поэтому они не в состоянии запилить для php ничего. Чувак системщик приходит в node.js и говорит, что он плохо написан. Берет переписывает сетевой стек и код начинает летать. Это я про https://github.com/alexhultman он вроде еще написал сериализатор json для Go, который в 3 раза быстрее стандартного, написаного в гугл. В php и близко нет таких звезд. Это или недоучки или старперы, которые под многоядерные процы не писали никогда и вообще не понимают как писать современный параллельный софт.
>Потому что язык PHP не занимается обработкой запросов. Интерпретатор PHP лишь выполняет написанный в скрипте код.
Что за глупость. PHP обрабатывает запросы. Он только это и делает и для этого создавался. Должно быть пояснение как код с разными SAPI будет работать. Это же не десктопная программа, запросы посылать могут тысячи пользователей одновременно. Как писать эффективно если это не описано? В общем php и его сообщество крайне непрофессиональны. Кроме как формы обрабатывать не о чем больше не пишут, а ты говоришь что то знают.
>А вот запуском нужного количества копий интерпретатора, балансировкой запросов занимается php-fpm
ОН поделие не так уж давно появилось. И даже авторы сейчас от него не в восторге, понимают, что написали костыль. Сейчас то у них уже больше опыта, думаю они бы не написали его так как написали.
>Он подробно не описан, наверно потому, что предполагается, что разработчик знаком с моделью обработки запросов при помощи менеджера и множества работников.
Слушай, а ты не думал, что сейчас есть http2 и еще куча новых протоколов? Те же вебсокеты. Ты похоже застрял в 90-х как и весь php с его разработчиками.
>Ну а ты сам не хочешь разобраться и написать серию статей?
Хочу, но не хочу лезть в код на Си. Мне проще изучать исходники Go, они понятней и написаны на самом Go. Его ассемблер также легко можно посмотреть. В php многое вообще не описано. Даже как писать расширения.
>Это потому, что в Го применен относительно новый принцип работы с потоками
Если не ошибаюсь он придуман в 80-х, когда PHP еще не было.
>Плюс - простота. Ты просто пишешь обычный последовательный код.
А если нужен обмен данными? Тогда одни проблемы.
>Этот подход по умолчанию использует php-fpm.
Поэтому он никуда не годится. Процессы это дорого и не эффективно. Сколько времени нужно чтобы запустить процесс? Много. Сколько нужно памяти? Очень много. И снова проблема обмена данными. Это устаревший подход.
>concurrency это "принцип". Как ты его реализуешь в библиотеке?
Также как эвент луп внутри процесса. Существует много абстрактных математических моделей concurrency и parallelism, как реализовать это вопрос другой, реализуют как то же.
>В Guile мне разбираться лень.
Если интересно посмотри видео https://www.youtube.com/watch?v=7IcI6sl5oBc
Это инновационный подход. В мейнстим языках такого не найдешь. Зато никаких проблем. Еще об этом https://dl.acm.org/doi/10.1145/1596550.1596588
>Наверно, предполагается, что программист и так это знает.
Не смеши. Пхпшники ничего не знают об этом. Именно по причине того, что в языке ничего нет и в доке не описано.
>Если ты программировал на Си или ассемблере, то ты и так понимаешь это.
Я тебя умоляю. На php в основном приходят без опыта программирования. Только единицы переходят в php уже имея опыт. И чаще всего этот опыт нерелевантный. Они в 80-90хх что то там писали. Сейчас процессоры и подходы изменились и поэтому они не в состоянии запилить для php ничего. Чувак системщик приходит в node.js и говорит, что он плохо написан. Берет переписывает сетевой стек и код начинает летать. Это я про https://github.com/alexhultman он вроде еще написал сериализатор json для Go, который в 3 раза быстрее стандартного, написаного в гугл. В php и близко нет таких звезд. Это или недоучки или старперы, которые под многоядерные процы не писали никогда и вообще не понимают как писать современный параллельный софт.
>Потому что язык PHP не занимается обработкой запросов. Интерпретатор PHP лишь выполняет написанный в скрипте код.
Что за глупость. PHP обрабатывает запросы. Он только это и делает и для этого создавался. Должно быть пояснение как код с разными SAPI будет работать. Это же не десктопная программа, запросы посылать могут тысячи пользователей одновременно. Как писать эффективно если это не описано? В общем php и его сообщество крайне непрофессиональны. Кроме как формы обрабатывать не о чем больше не пишут, а ты говоришь что то знают.
>А вот запуском нужного количества копий интерпретатора, балансировкой запросов занимается php-fpm
ОН поделие не так уж давно появилось. И даже авторы сейчас от него не в восторге, понимают, что написали костыль. Сейчас то у них уже больше опыта, думаю они бы не написали его так как написали.
>Он подробно не описан, наверно потому, что предполагается, что разработчик знаком с моделью обработки запросов при помощи менеджера и множества работников.
Слушай, а ты не думал, что сейчас есть http2 и еще куча новых протоколов? Те же вебсокеты. Ты похоже застрял в 90-х как и весь php с его разработчиками.
>Ну а ты сам не хочешь разобраться и написать серию статей?
Хочу, но не хочу лезть в код на Си. Мне проще изучать исходники Go, они понятней и написаны на самом Go. Его ассемблер также легко можно посмотреть. В php многое вообще не описано. Даже как писать расширения.
>Это потому, что в Го применен относительно новый принцип работы с потоками
Если не ошибаюсь он придуман в 80-х, когда PHP еще не было.
>Ты не согласен?
Кто сказал, что на тот код будет затрачено 2 такта?
>Если тебе хочется конкретные цифры, раньше в мануалах к процессорам явно указывалось, сколько тактов выполняется та или иная команда.
Вот я об этом. Мне кажется у тебя устаревшее представление. Думаю, что процессоры сейчас выполняют больше операций за единицу времени. Количество инструкций огромно, думаю, что большую часть не используют, большинство компиляторов и виртуальных машин используют легаси инструкции, поэтому у них все так плохо.
Взять к примеру .NET Core. Его за 3 года так прокачали, что он работает наравне с c++ и раст. Помню в бенчах TechEmpower они уступали джавовому Netty раза в 2, а сейчас обходят его в 2 раза. Вот что значит написан с нуля. И хорошо написан и спроектирован грамотно.
>Неважно, какой код ты пишешь. В конечном счете он превращается в ассемблер или интерпретируется написанным на ассемблере интерпретатором. А ассемблер на существующих процессорах выполняется строго последовательно.
Почитай инфу по новее. Параллелизм на уровне команд и прочее, аппаратные фичи для ускорения и параллелизма. Важно какой код пишешь, очень важно, на любом языке. От этого много что зависит. Некоторые языки позволяют скейлить код из коробки, если он нормально написан.
>Код на Хаскелл тоже превращается в императивный последовательный ассемблер.
В Хаскеле есть мощный параллелизм и конкурентность, еще ленивость. Чтобы это все работало и код оптимизировался, нужно писать нормально.
>А адские функции вроде reduce это шаг в прошлое в сравнении с простым и удобным циклом foreach.
Ясно. Надо было сразу сказать. Что лучше, декларативное утверждение или императивная инструкция? Ты когда просишь жену приготовить тебе борщ, ты зачитываешь ей императивную инструкцию типа иди к холодильнику, открой дверцу, возьми мясо, положи в кастрюлю, залей водой...? Или говоришь просто приготовь борщ? Reduce это декларативное утверждение, сделай это или дай мне, или верни. Foreach это императивня инструкция, возьми это сделай с ним то, потом выполни это, потом... Разве не тупо? Зачем жить на уровне процессора если можно подняться на высшие уровни и писать декларативные утверждения. Взять к примеру html и css. Они очень удобны свой декларативностью. Не нужно вместо <h1> писать выведи в координатах x,y символы a,b,c в кодировке z цветом u и размером n.
>reduce это шаг в прошлое
Какой ужас. Не представляю как можно сделать такой вывод. Я тебе описал все выше. Это цикл устаревший тупой подход, а reduce это высокоуровневый объект. Это же очевидно.
>Одно дело принять миллион соединений, другое дело обрабатывать приходящие по ним данные.
Статью почитай, погугли, есть вроде и видео где он показывает как запускает эти соединения на старом ноуте и что это живые соединения, в них происходит обмен данными. Пхп даже 10к не сможет потянуть, даже пустых, неактивных. Помолчал бы уж.
>То есть данных там много не передается.
Правильно, потому что вебсокеты, а не легаси http с текстовыми пакетами, в которых заголовки занимают больную часть данных.
>Твои два слова ни на что не отвечают, и ты сам толком не понимаешь их значения, и зачем-то притащил.
У меня есть понимание что это и как работает, а у тебя? Ты изначально все путал, называл конкурентную модель в Go параллельной. И еще мне говоришь, что я не понимаю. Просто смешно.
>Ты не согласен?
Кто сказал, что на тот код будет затрачено 2 такта?
>Если тебе хочется конкретные цифры, раньше в мануалах к процессорам явно указывалось, сколько тактов выполняется та или иная команда.
Вот я об этом. Мне кажется у тебя устаревшее представление. Думаю, что процессоры сейчас выполняют больше операций за единицу времени. Количество инструкций огромно, думаю, что большую часть не используют, большинство компиляторов и виртуальных машин используют легаси инструкции, поэтому у них все так плохо.
Взять к примеру .NET Core. Его за 3 года так прокачали, что он работает наравне с c++ и раст. Помню в бенчах TechEmpower они уступали джавовому Netty раза в 2, а сейчас обходят его в 2 раза. Вот что значит написан с нуля. И хорошо написан и спроектирован грамотно.
>Неважно, какой код ты пишешь. В конечном счете он превращается в ассемблер или интерпретируется написанным на ассемблере интерпретатором. А ассемблер на существующих процессорах выполняется строго последовательно.
Почитай инфу по новее. Параллелизм на уровне команд и прочее, аппаратные фичи для ускорения и параллелизма. Важно какой код пишешь, очень важно, на любом языке. От этого много что зависит. Некоторые языки позволяют скейлить код из коробки, если он нормально написан.
>Код на Хаскелл тоже превращается в императивный последовательный ассемблер.
В Хаскеле есть мощный параллелизм и конкурентность, еще ленивость. Чтобы это все работало и код оптимизировался, нужно писать нормально.
>А адские функции вроде reduce это шаг в прошлое в сравнении с простым и удобным циклом foreach.
Ясно. Надо было сразу сказать. Что лучше, декларативное утверждение или императивная инструкция? Ты когда просишь жену приготовить тебе борщ, ты зачитываешь ей императивную инструкцию типа иди к холодильнику, открой дверцу, возьми мясо, положи в кастрюлю, залей водой...? Или говоришь просто приготовь борщ? Reduce это декларативное утверждение, сделай это или дай мне, или верни. Foreach это императивня инструкция, возьми это сделай с ним то, потом выполни это, потом... Разве не тупо? Зачем жить на уровне процессора если можно подняться на высшие уровни и писать декларативные утверждения. Взять к примеру html и css. Они очень удобны свой декларативностью. Не нужно вместо <h1> писать выведи в координатах x,y символы a,b,c в кодировке z цветом u и размером n.
>reduce это шаг в прошлое
Какой ужас. Не представляю как можно сделать такой вывод. Я тебе описал все выше. Это цикл устаревший тупой подход, а reduce это высокоуровневый объект. Это же очевидно.
>Одно дело принять миллион соединений, другое дело обрабатывать приходящие по ним данные.
Статью почитай, погугли, есть вроде и видео где он показывает как запускает эти соединения на старом ноуте и что это живые соединения, в них происходит обмен данными. Пхп даже 10к не сможет потянуть, даже пустых, неактивных. Помолчал бы уж.
>То есть данных там много не передается.
Правильно, потому что вебсокеты, а не легаси http с текстовыми пакетами, в которых заголовки занимают больную часть данных.
>Твои два слова ни на что не отвечают, и ты сам толком не понимаешь их значения, и зачем-то притащил.
У меня есть понимание что это и как работает, а у тебя? Ты изначально все путал, называл конкурентную модель в Go параллельной. И еще мне говоришь, что я не понимаю. Просто смешно.
Чтобы можно было найти работу для начала хотя бы за миску супа
На 1с.
Laravel либо symfony, все остальное - либо микрофреймворки, либо протухший кал вроде yii2, на котором только в пидорашке некоторые отсталые и жадные кабаны заставляют писать.
Сможете ли реализовать паттерн "Бочка", как в коворкинг входят, на какое кресло сядете, на какое тимлида посадите?
Спросят общие вопросы про образование, дадут тестовое задание. Ну это если они не набирают в стажеры 20летних людей с 15летним опытом работы
Солид, магические методы, паттерны, как http работает (что происходит, когда вбиваешь урл в строку браузера), скл запросы написать
> Думаю, что процессоры
> думаю, что большую часть не используют
Проблема в том, что ты не знаешь, а "думаешь". Сам себе придумал что-то и пытаешься меня в этом убедить. Я знаю ассемблер, и понимаю, как работает процессор.
> Некоторые языки
> Важно какой код пишешь
> нужно писать нормально.
Это не аргументация. Аргументацией было бы "за счет использования команды X язык Y позволяет однопоточной программе задействовать более одного ядра процессора". Давай конкретные примеры, а не расплывчатые рассуждения что надо писать код "нормально" на "некоторых" языках.
> Кто сказал, что на тот код будет затрачено 2 такта?
Если классический процессор без ILP исполняет инструкцию за 1 такт, и их в программе две, то она выполнится за два такта. Что тут может быть непонятного.
> Reduce это декларативное утверждение, сделай это или дай мне, или верни. Foreach это императивня инструкция,
Reduce это костыль для языка, в котором нет циклов. Он снижает читабельность кода.
> Пхп даже 10к не сможет потянуть, даже пустых, неактивных.
Пруфов конечно не будет.
Как самостоятельно научиться писать красивый код без говна?
Почитал это: https://refactoring.guru/ru/design-patterns
Почитал про KISS, SOLID.
Но все примеры, какие там используются я не могу применять на практике, на реальных задачах. Все равно код хуевый.
Я впадаю в уныние от этого.
Работаю один на дядю, ему насрать, какой я код пишу, лишь бы работало. Уходить от него не планирую, т.к. нормально денег платит.
Почитай Рефакторинг Фаулера.
Там описаны признаки плохого кода (code smell) и рецепты для избавления от него.
Для рефакторинга так же полезно покрывать код юнит и интеграционными тестами, чтобы знать, что твои изменения не ломают код.
Ну и 3 этапа написания кода:
1. make it work
2. make it clean
3. make it fast
Да, понятно, что само по себе это невалидное имя. Я так понял, что это просто упрощенная запись для доступа к полю класса, которого может в нем не быть, если в терминах js, то это было бы:
this.user?.create_at || null
>Я знаю ассемблер, и понимаю, как работает процессор.
Не знаешь, а знаком, в общих чертах. Мануал от intel с набором команд имеет размер более 2000 страниц. Не думаю, что ты знаешь новые оптимизирующие команды. Мало кто их вообще знает и использует.
>Reduce это костыль для языка
Ясно. У тебя дибилизм.
Нет, это именно поле с именем, в котором есть двоеточие. В JS это было бы this['user:created_at'] || null.
Есть еще другие принципы, например YAGNI, DRY.
Главный принцип - код пишется для людей, не для машины. Он должен быть легко читаем и его должно быть удобно править.
Паттерны тут особо не помогут. Наоборот, начинающие, прочитав книгу про паттерны и стараясь их всюду засунуть, делают код хуже.
Вот, на что стоит обращать внимание:
- код должно быть легко читать, даже если ты видишь его в первый раз. Делать все лучше самым простым способом (если только это не влечет каких-то проблем с производительностью или чем-то еще). Не надо демонстрировать, что ты знаешь хитрые трюки.
- имена переменных, функций, классов должны быть документирующими. В идеале, если ты видишь вызов функции, ты должен понять, что она делает, не заглядывая в нее.
- плохой практикой будет передача массивов сложной структуры, так как при чтении кода непонятно, что в нем содержится.
- старайся использовать защитное программирование и писать такой код, который трудно случайно сломать. Не должно быть такого, что ты чуть поменял код в одном месте и в другом месте что-то сломалось. Хорошо будет проверять значения параметров и выбрасывать исключение при выходе за допустимые пределы.
- не надо передавать данные в функцию или возвращать из нее обходными путями. Пример неправильной передачи данных:
$userTable->setId(1234);
$userTable->findUser();
$user = $userTable->getResult();
- не надо писать стены кода по 150 строк или вложенностью по 6 уровней. Алгоритм должен состоять из небольшого числа действий, чтобы его легко было понять.
- не надо злоупотреблять магическими методами и демонстрировать, что ты умеешь делать хитрые трюки с их помощью.
- глобальные переменные и статические поля во многих, но не во всех, случаях это зло. Допустим, в каком-то классе есть статическое поле. Ты его меняешь. И этим ты можешь повлиять на выполнение кода где-то в другом месте.
Конечно, тесты было бы иметь полезно. Вот представь сам: тебе передали большой проект, в котором куча фич. Ты правишь код в нем. Как ты проверишь, что ничего не сломалось? Вручную будешь обходить все страницы и проверять? Но ведь ты можешь даже не знать про некоторые фичи и не заметишь, что они сломались.
Или ты решил обновить фреймворк на новую версию. Как проверить, что ничего не сломалось?
В общем, поищи советы про правильный код, читабельный код, поддерживаемый код.
А насчет паттернов беспокоиться не надо. Если ты не можешь их применить, значит они в этом месте не требуются. Отучайся мыслить черно-белыми категориями вроде "паттерны - хорошо, отсутствие паттернов - плохо".
Есть еще другие принципы, например YAGNI, DRY.
Главный принцип - код пишется для людей, не для машины. Он должен быть легко читаем и его должно быть удобно править.
Паттерны тут особо не помогут. Наоборот, начинающие, прочитав книгу про паттерны и стараясь их всюду засунуть, делают код хуже.
Вот, на что стоит обращать внимание:
- код должно быть легко читать, даже если ты видишь его в первый раз. Делать все лучше самым простым способом (если только это не влечет каких-то проблем с производительностью или чем-то еще). Не надо демонстрировать, что ты знаешь хитрые трюки.
- имена переменных, функций, классов должны быть документирующими. В идеале, если ты видишь вызов функции, ты должен понять, что она делает, не заглядывая в нее.
- плохой практикой будет передача массивов сложной структуры, так как при чтении кода непонятно, что в нем содержится.
- старайся использовать защитное программирование и писать такой код, который трудно случайно сломать. Не должно быть такого, что ты чуть поменял код в одном месте и в другом месте что-то сломалось. Хорошо будет проверять значения параметров и выбрасывать исключение при выходе за допустимые пределы.
- не надо передавать данные в функцию или возвращать из нее обходными путями. Пример неправильной передачи данных:
$userTable->setId(1234);
$userTable->findUser();
$user = $userTable->getResult();
- не надо писать стены кода по 150 строк или вложенностью по 6 уровней. Алгоритм должен состоять из небольшого числа действий, чтобы его легко было понять.
- не надо злоупотреблять магическими методами и демонстрировать, что ты умеешь делать хитрые трюки с их помощью.
- глобальные переменные и статические поля во многих, но не во всех, случаях это зло. Допустим, в каком-то классе есть статическое поле. Ты его меняешь. И этим ты можешь повлиять на выполнение кода где-то в другом месте.
Конечно, тесты было бы иметь полезно. Вот представь сам: тебе передали большой проект, в котором куча фич. Ты правишь код в нем. Как ты проверишь, что ничего не сломалось? Вручную будешь обходить все страницы и проверять? Но ведь ты можешь даже не знать про некоторые фичи и не заметишь, что они сломались.
Или ты решил обновить фреймворк на новую версию. Как проверить, что ничего не сломалось?
В общем, поищи советы про правильный код, читабельный код, поддерживаемый код.
А насчет паттернов беспокоиться не надо. Если ты не можешь их применить, значит они в этом месте не требуются. Отучайся мыслить черно-белыми категориями вроде "паттерны - хорошо, отсутствие паттернов - плохо".
>Все равно код хуевый
Покаж код. Субъективщина она такая - всякое может чудиться.
Ну и в целом всегда нужна конкретика, а вот это вот "как писать хорошо" оно для тех, кто одно и то же советует всем.
Ты прав. Нашел в коде одно место (сериализатор), где есть присваивание в это странное поле. Правда пока не понял, зачем именно такое имя, а не просто historyCreatedAt.
1. Ты либо радился очень мозговитым и быстро смекаешь
2. Работаешь в команде и смотришь как пишут другие.
3. Много пишешь сам. Либо по работе либо пет проекты.
>Почитал это: https://refactoring.guru/ru/design-patterns
Паттерны это культ карго. Забудь про них.
>не надо передавать данные в функцию или возвращать из нее обходными путями.
Что?
>Пример неправильной передачи данных:
>$userTable->setId(1234);
>$userTable->findUser();
>$user = $userTable->getResult();
Почему это неправильно?
Потому что менее явно, чем
$user =$userTable->findUser(1234);
Тут очевидно, что передается на вход и что вернет функция. В примере выше не очевидно. Особенно страдает читабельность, если операции разделены блоками кода:
$userTable->setId(1234);
..много кода..
$userTable->findUser();
...много кода ...
>$userTable->setId(1234);
>$userTable->findUser();
>$user = $userTable->getResult();
Рассмотри каждую строчку отдельно.
Понятно, что делает $userTable->setId(1234); ?
К чему относится id? Как он будет использован?
И если кто-то после этой строчки засеттит другой id, мы об этом не узнаем
$userTable->findUser();
На основе чего он ищет юзера?
Т.е. нам надо какой-то стейт сконфигурировать внутри объекта
$user = $userTable->getResult();
Что за результат нам вернется?
А если не было поиска?
А если в классе есть другие методы поиска, чей результат будет возвращен?
Подобный код порождает много путаницы. Чтобы им пользоваться, нужно знать внутренности класса, чего в хорошем ООП следует избегать.
$user =$userTable->findUserById(1234); - подобная запись однозначно говорит, что мы получим юзера из таблицы по его айди, либо null/exception, если юзер на найден
Так и скажи.
Главное не в дипломе, а в голове - если увлекался IT, то делай упор на это. Если никогда не интересно было - что ты там забыл вообще?
>спросят общие вопросы про образование
Вряд ли. Я конечно давно на стажерских собесах не был, но думаю, там спрашивают примерно то же, что и среднего разраба.
Конторе от стажера нужно, чтобы он в максимально короткие сроки вырос до джуна и ему можно было поручать простые задачи.
Тут будет плюсом написание пет проекта на стеке, который используют в конторе. Можно будет про него рассказать на собесе, показать код, обозначить трудные места и как с ними справился.
Вставляю String, пишет: "столбец "value" не существует ... LIKE value='202... ^"
Что здесь понимается под value? По идее это дата из таблицы, а справа дата, которую я передаю, но почему value не существует? Select я точно делаю правильно, и в записях тб поля с датой не пустые.
Земля пухом.
Хотя бы посмотри внутренности битрикса для начала. Можно пробник скачать.
Если зайдет в таком говне ковыряться - велкам.
Только вот часто вижу вакансии, где с битрикса переписывают на лару или симфони, потому что невозможно поддерживать и дорабатывать это недоразумение
Всё, решил это хуйню.
>с битрикса переписывают на лару или симфони
Для этого сам битрикс надо знать, нет?
Сам подумываю вкатиться потому, что берут почти с улицы. Знаю Лару, Симфу, докеры-хуёкеры, но нет опыта и поэтому меня не берут. Буду, значит, на Битриксе говно писать на работе, а дома уже на фреймворках.
Вот и получается, что у одних с говнокодом и Битриксом бизнес растёт, а другие супер-пупер-погроммисты настолько выёбистые, что никого себе найти не могут.
>Знаю Лару, Симфу, докеры-хуёкеры, но нет опыта и поэтому меня не берут
Ну еблан значит. Надо было нарисовать опыта года полтора в рога и копыта.
Таким как ты дорога в битрикс
>на Битриксе говно писать на работе, а дома уже на фреймворках
Не, дома ты будешь разбираться в кишках битрикса, чтобы утром доделать рабочую таску
>Вот и получается, что у одних с говнокодом и Битриксом бизнес растёт, а другие супер-пупер-погроммисты настолько выёбистые, что никого себе найти не могут.
Битрикс - дешевая шлюха. В то время, как симфони - элитная эскортница, которую не каждый себе позволить сможет
>Знаю Лару, Симфу, докеры-хуёкеры
проекты есть? на гитхабе разумеется. если нет, то ясно почему не берут, а если есть, то... то как ищешь? по всей России или только в своем мухосранске? если онли в своем мухосранске, то ясно почему не можешь найти...
>Битрикс - дешевая шлюха. В то время, как симфони
Одни набирают людей практически с улицы на приемлемые деньги. Другие раздувают понты, выписывая в требования списки из 15-20 технологий даже на позицию младшего перекладывателя жсонов.
>>111111
>проекты есть? на гитхабе разумеется
Какие ещё проекты? В одиночку ты ничего внятного кроме очередного блога\доски объявлений\тестовых не сделаешь. Дело даже не в опыте, а в отсутствии экспертизы в бизнесе.
>Одни набирают людей практически с улицы на приемлемые деньги
Потому что стандартными подходами в битриксе не разобраться. Это большая куча дерьма, в которой одинаково неэффективен будет чел с вышкой и опытом разработки и чел с улицы. Поэтому и нанимают вторых, т.к. они по зп не притязательны.
>Другие раздувают понты, выписывая в требования списки из 15-20 технологий даже на позицию младшего перекладывателя жсонов.
Какие понты? Обычные собесы на веб инженегра. Или ты думаешь, что бекенд пилить это просто по кнопкам клацать?
я их и имею в виду, очередной блог/форум, мне кажется, это и есть, что называется "пет-проджект", не? если у тебя нет, то ты так и скажи, чего злишься? бесишься, что я прав, что тебя не берут никуда из-за отутствия пет-проджектов? так если ты шаришь, то сделать такой кал не проблема, за неделю сделаешь и работу найдешь
>Это большая куча дерьма
Да? Но на Симфони требуют 25 технологий, а на Битрикс хтмл, ЦСС и пхп.
>одинаково неэффективен будет чел с вышкой и опытом разработки и чел с улицы
Да мне похуй - деньги есть деньги. Страдают всё равно кабанчики, которых маркетологи битрикса развели.
>>111151
>если у тебя нет, то ты так и скажи
>бесишься, что я прав
Был блог - я его снёс из своего гитхаба, ибо пошлятина. Мой последний пет это cms на Ларавел 8 с пакетами админки, чат-бота, готовой системой статей тот самый блог, готовым личным кабинетом пользователя, сделано на бутстраповском ui +15 тем под него. Делал 2 недели, где-то, по вечерам, раз-через-раз. Вот это я понимаю ПЭТ-проект - можно сесть и писать хоть доску объявлений, хоть онлайн-магазин, с поддержкой мессенджеров и прочего говна. А ты про "блог" спрашиваешь.
>на Симфони требуют 25 технологий
Перечисли все 25
>Страдают всё равно кабанчики
Страдают разрабы, пытаясь вовремя закрыть все баги. А кабан продал битрикс и доволен
>Перечисли все 25
Открой среднюю вакуху на хх и сам почитай. Все 30 пунктов будь добр выложи - и ходи по струнке перед синьором, который нередко сам тот ещё хуй моржовый.
>Страдают разрабы
Лучше страдать, но с работой, чем ходить и собеседоваться раз за разом к очередным веб инженерам с ЧСВ овер 9к. Забесплатно делая тестовые.
>Делал 2 недели, где-то, по вечерам, раз-через-раз
Ещё сайтов с десяток есть разной паршивости - штуки 4 на вордпресс 2 на элементоре и 2 на чистом хтмл, всё самопильное - не на готовых шаблонах, 4 на Винтер\Октобер, и прочее по мелочи - всякое на Слиме\Люмен и несколько тестовых: апишки, парсеры rss с админками, система баланса на транзакциях делаю только интересные.
жесть, как ты до сих пор не нашел работу? ищешь только в своем городе? или по всей России с переездом? не видел ответа на этот вопрос
>Все 30 пунктов будь добр выложи
Шиз, у тебя пункты куда-то растут.
В средней ваке всего несколько пунктов: пхп, фреймворк, скл, докер
Мы тебя поняли, иди уже в свой битрикс
Интересно, что ты скажешь, когда тебя даже на битрикс стажера за бесплатно не возьмут
Пробовал сохранять через ->save(), через ::save(), ничего не помогает.
Никто не знает как пофиксть, что придумать\проверить?
В сейчас проверил, в папке хранилище сессия остается!
И не модифицируется, ничего.
В коде при редиректе обратно не обновляю сессию, я просто вызываю Сессию с нужным мне ключом. Но он возвращает пустоту, хотя явижу что файлик есть и там нужная мне инфа. Но он ее просто не достает.
О, вот еще интересное наблюдение которое ломает мне голову.
При редиректе обратно Сессия у меня не читается, так, в этом проблема. Хотя файл на месте.
Но при перезагрузке сайта и снова заходе на контроллер с сессий ОН ЧИТАЕТ данные прошлой сессии.
Я просто не понимаю как это работает, че за х. Сохранил. Вернулся с зеркала. Прочитал - не читает.
Перезагрузил. Читает.
У меня даже догадок нет. Я просто охуеваю.
>>- Еще более сложная и долгая задача на Laravel/Symfony: https://gist.github.com/codedokode/8733007
>>Время выполнения: все зависит от тебя, но я бы смотрел на 4-6 недель
А за сколько миддл с опытов в несколько лет должен такое делать?
Вы видите копию треда, сохраненную 30 июля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.