Этого треда уже нет.
Это копия, сохраненная 27 сентября 2019 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Клуб изучающих PHP #111 /php/ 1446969 В конец треда | Веб
Привет. Тут мы изучаем язык PHP (а также JS/CSS/HTML/SQL), решаем задачки и даже делаем простые сайты! Зачем? Кто-то хочет открыть стартап, кто-то заработать на лапшу быстрого приготовления, кому-то просто нечего делать.

В нашем треде отвечают почти на все вопросы, только бампайте каждые 5 дней. И не разводите флуд, если вам скучно, лучше сходите погрейте голову на улице, например.

Это тред и для начинающих. Слово "классы" у тебя ассоциируется только со школой, а в аттестате тройка по математике? Ты наш человек.

Предыдущий тред был тут: >>1415604 (OP) . Все старые треды есть в архиве: https://phpclub.tech/ (там есть поиск, так что можно легко найти обсуждение какой-то задачи или ответы на свой старый пост) или ищутся в гугле по словам "клуб изучающих php" и в архиваче.

Мейлач лежит? Есть запасной тред на доброчане: /s/res/23225.xhtml#i46467

Форматируй свой код, если хочешь, чтобы его читали (как, написано во втором посте).

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

С чего начать

У нас есть свои уроки по основам PHP, они собраны и выложены по адресу http://codedokode.github.io/phpbook (вас отредиректит на другой домен, не читайте, не сохраняйте, не запоминайте его, он временный). Это учебник для изучающих с нуля, то есть если ты вообще ничего не знаешь, то можно начать с него. Он простой и понятный. Там есть задачи, их нужно решать (чтобы стать программистом, надо писать код — иначе никак). Пости ссылки на решения в тред, мы их проверим, напишем замечания и дадим советы по улучшению. С другой стороны, если этот учебник тебе не нравится, можно читать любой другой. Или официальный мануал. Или все сразу.

Устанавливать пока что ничего не требуется, разве что редактор кода вроде Sublime Text 3, Notepad++, Visual Studio Code, Netbeans PHP или PhpStorm (с ним будет удобнее).

Если не знаешь как решать, запости код, напиши в каком месте остановился и попроси подсказку.

Ты прошел весь учебник? Молодец, но это были лишь основы языка PHP, этого недостаточно. Вот что в идеале надо изучить еще: ООП, как работает веб-сервер, HTML/CSS, SQL, PDO, работа с таблицами в БД, работа с формами, MVC, git, composer, JS, фреймворки, автоматизированное тестирование.

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

- для начала прочти урок https://github.com/codedokode/pasta/blob/master/soft/web-server.md
- установи Апач + PHP (советы выше и ниже) и читай туториал http://php.net/manual/ru/tutorial.php
- Учи HTML/CSS и SQL, PDO, хотя бы основы
- Далее простая, но полезная задача сделать список студентов, в ней много полезных советов: https://github.com/codedokode/pasta/blob/master/student-list.md
- Более сложная задача сделать файлообменник на микрофреймворке Slim: https://gist.github.com/codedokode/9424217
- Еще более сложная и долгая задача на Yii/Symfony: https://gist.github.com/codedokode/8733007
- После нее можно изучать автоматизированное тестирование https://gist.github.com/codedokode/a455bde7d0748c0a351a
- Если ты все решил, переходи к Symfony 3/Doctrine 2
- Почитать про паттерны http://designpatternsphp.readthedocs.org/ru/latest/README.html (если ты не изучил ни одного фреймворка, то это будет рановато), тут с примерами кода http://designpatternsphp.readthedocs.org/ru/latest/README.html . Имей в виду что без примеров использования их учить бесполезно - не поймешь, хочешь увидеть примеры использования паттернов - ковыряй исходники Симфони, например Symfony Forms. Не заучивай паттерны - смотри код и думай, зачем тут они использованы.

Чтобы делать эти задания, тебе надо установить Апач + PHP (можно заодно сразу и MySQL) на компьютер. Вот полезные инструкции:

https://github.com/codedokode/pasta/blob/master/soft/php-install.md
https://github.com/codedokode/pasta/blob/master/soft/apache-install.md

Может тебе понадобится пользоваться командной строкой, вот гайд https://github.com/codedokode/pasta/blob/master/soft/cli.md

Решения задач лучше показать мне, особенно на ООП,так как сам ты вряд ли увидишь все ошибки. Пости свой код на гитхаб и вкидывай ссылку в тред по мере решения. Я прокомментирую и укажу на ошибки.

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

Также, у нас есть задачи которые позволят тебе изучить или подтянуть до нормального уровня знания JS/HTML/CSS/SQL. Решай их параллельно с задачами выше.

- HTML/CSS: https://github.com/codedokode/pasta/blob/master/html/html.md
- JS: https://gist.github.com/codedokode/ce30e7a036f18f416ae0
- SPA (сложно): https://github.com/codedokode/pasta/blob/master/js/spa.md
- Проверялка решений на JS: http://dkab.github.io/jasmine-tests/
- MySQL: https://github.com/codedokode/pasta/blob/master/db/databases.md

Что почитать

- Мануал по PHP — http://www.php.net/manual/ru/langref.php
- Сайт phptherightway (перевод на русский: http://getjump.me/ru-php-the-right-way/ )
- По PHP: Профессиональное программирование на PHP Джордж Шлосснейгл
- По PHP: Мэтт Зандстра — PHP: Объекты, шаблоны, методики программирования
- JS: learn.javascript.ru
- Про Git: https://git-scm.com/book/ru/v1
- Новости IT на англ. https://news.ycombinator.com/
- какой-то древний, устаревший, но большой и на русском справочник по веб-разработке, посоветованный аноном: https://starcat.dp.ua/doc/wdh/

Оформляй код аккуратно!!! — например пропусти через phpformatter.com . Также, если ты пользуешься IDE вроде PhpStorm, Netbeans, Eclipse, то в них эта опция встроена, подробнее: https://gist.github.com/codedokode/8759492

У ОПа нет аккаунтов и групп вконтакте, в фейсбуке, в твиттере, все "пхп-треды" там поддельные.

Платиновые вопросы

- Почему PHP? Потому что вакансий море, и учить легко.
- Сайт опять упал!!!!! — Не паникуй, а открой http://rghost.ru/6bfCY9lfl и получи личную немного устаревшую оффлайновую копию сайта (можно читать хоть на андроиде без интернета)
- Что надо знать чтобы найти работу - разработчику: PHP, SQL, HTML/CSS, JS, ООП, Git, композер, MVC, фреймворк. Верстальщику - HTML/CSS, JS, jQuery. У нас в треде были люди, которые практически с нуля учились и смогли найти работу.
- Что будут спрашивать на собеседовании если 0 опыта - гонять по теории, по официальному мануалу PHP, давать дурацкие задачки на переворачивание строк, гонять по SQL (транзакции, внешние ключи, напиши запрос), по JS (как сделать анимацию при нажатии кнопки), ну погугли, не ленись
- Можно подробнее про поиск работы, собеседования - нет, ОП писать не будет, но может кто из анонов захочет рассказать. Поищите тред перезвонивших, а также раздел /wrk/
- Сколько времени надо изучать все это? - все зависит от тебя, но не меньше 6-8 месяцев
- Нужен ли ООП, фреймворки, MVC, git, composer? — Да, однозначно. Посмотри любую вакансию.
Напоминание 2 1446971
Напоминание. Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть. Если каждый будет оформлять код как хочет, будет бардак.

Если тебе лень выравнивать код руками, закачай его на http://beta.phpformatter.com/ и нажми «format». Робот исправит выравнивание и отступы в мгновение ока (да, прогресс не стоит на месте). Если ты используешь мощную IDE вроде PhpStorm, там тоже есть функция форматирования кода.

Горячие клавиши для форматирования кода в разных IDE: https://gist.github.com/codedokode/8759492

Вообще, в PHP долгое время не было единого стандарта оформления кода, все писали как попало и было много бардака, но сейчас дело лучше — есть стандарты PSR-1 и 2. Вот как надо оформлять код:

- переменные и функции пишутся с маленькой буквы, подчеркивание не используется, используется camelCase, пример: $x, $numberOfPeople, printResults()
- Название функции начинается с глагола, в стиле «сделайЧтоТо»
- не знаешь английский? Не беда, в 21 веке есть решение этой проблемы. Не пиши транслитом, открой лучше Гугл Транслейт и найди название для переменной там
- в именах классов используется CamelCase, первая буква большая, «_» может использоваться
- мы предпочитаем подстановку переменных вместо конкатенации строк: "I am $age years old" — хорошо, 'I am ' . $age . ' years old' — плохо из-за обилия точек и кавычек
- мы используем для отступов 4 пробела (можно настроить редактор, чтобы при нажатии Tab он вставлял 4 пробела)

Вот ссылка на стандарты, где все это описано подробнее и даны примеры оформления:

PSR-1: https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-1-basic-coding-standard.md
PSR-2: https://github.com/samdark/fig-standards-ru/blob/master/accepted/ru/PSR-2-coding-style-guide.md
3 1446974
Я постараюсь глянуть непроверенные вопросы в предыдущем треде, но если вы о них тут напомните, хуже не будет.
4 1447062
>>46974
Да хранят тебя и всех остальных аношек треда Небеса, вы заняты богоугодным делом
33628441379346353055.21res500281.jpg86 Кб, 499x281
5 1447478
Дублирую
Оп проверь, пожалуйста.
Вектор: https://ideone.com/pEHFGH
6 1447479
>>47478

>https://ideone.com/pEHFGH


Походу тня, хаха.
7 1447798
Как в Laravel при валидации сделать так, чтобы следующее поле проверялось ТОЛЬКО ЕСЛИ предыдущее было провалидировано успешно?

Как ни странно, такой элементарной хуйни там до сих пор не завезли.
Все поля валидируются одновременно всегда.
8 1447810
>>46974
Эта кружка кофе была за твое здоровье, анон.
9 1447814
>>47798
Что за задачу ты решаешь? На первый взгляд подход не верный
10 1447820
>>47798
Одновременно это как? Можно пример валидаторов?
12 1447852
>>47814

>нинужно


Ну вот пошли мантры
13 1447854
>>47821
Хуеил. Это в рамках проверки ОДНОГО параметра запроса.
Если первое правило провалилось, остальные не проверяются.

А мне надо то же самое, только чтобы если валидация предыдущего ПАРАМЕТРА провалилась, то текущий проверяться вообще не будет.
14 1447901
>>47854

>первое ПРАВИЛО


>остановить выполнение правил проверки ввода для атрибута после первой ОШИБКИ

15 1447910
>>47854
Анон ты тупой?
if (если валидация предыдущего ПАРАМЕТРА провалилась) {
текущий проверяться вообще не будет
};
16 1447921
>>47910
Так и сделал, по сути несколько валидаторов. Но это васянщина пиздец.
17 1447934
>>47921
А зачем тебе так нужно сделать вообще?
18 1447970
>>47934

>А зачем тебе так нужно сделать вообще?


Ну как же, это ведь ЭКОНОМИЯ ПАМЯТИ ДЖУНИОР ПРИШЕЛ УСТРАИВАТЬСЯ НЕ СМОГ ПОМЕНЯТЬ ДВЕ ПЕРЕМЕННЫЕ БЕЗ ТРЕТЬЕЙ ПОВЕСИЛИ В ДВЕРНОМ ПРОХОДЕ ЭКОНОМИМ НА ПАМЯТИ УБИВАЕМ ЗА ЛИШНИЙ IF НА РАБОТЕ ОБЩАЕМСЯ ПОЛУ-СЛОВАМИ СРЕМ В ОДНО ВЕДРО В ЦЕНТРЕ КОМНАТЫ ЧТОБЫ ОПТИМИЗИРОВАТЬ ПОХОДЫ ПО ТУАЛЕТАМ ПРИВЯЗАЛ К ЛОКТЮ ШВАБРУ - ВПЕРЕД - ПЕЧАТАЮ КОД, НАЗАД - ВКЛЮЧАЮ КОФЕ-МАШИНУ ЗА СПИНОЙ ЭКОНОМИЯ МЫШЕЧНОЙ АКТИВНОСТИ 2% ВСЕ ОПТИМИЗИРУЕМ ЧТО МОЖНО ОТРЕЗАЕМ СОТРУДНИКОВ ПО ПОЯС ЧТОБЫ СЫКАНОМИТЬ НА ШТАНАХ РЯЯЯ МЫ СМАЯ АПТИМАЛЬНАЯ КОНТОРА В ВОРОНЕЖЕ
19 1447981
>>47970
Истерика на ровном месте. Отлично.
20 1447982
>>47921
Твоя идея изначально это васянщина.
image.png267 Кб, 500x337
someApprentice !EaaiHmIJms 21 1448031
Я опять нечаянно запостил в закрытый тред >>1447890 >>1447897
Безымянный.png4 Кб, 349x119
22 1448064
Есть один проект который отлично работал на моем сервере Apache который я сам смастерил. Когда я сую свой проект в OpenServer, получаю 404. Хуйня в том, что я получаю ответ на /, но когда я хочу например перейти в /categories, он шлет меня. Что делать? Куда копать? Проект на laravel, и папку /public в доменах я прописал.
23 1448071
>>47934
В поле1 указывается токен от соц-сети, но он может быть хуевым.
С помощью этого токена делается запрос в соц-сеть, чтобы проверить поле2.

Поле2 не имеет смысла проверять, если токен в поле1 говно
24 1448072
>>47982
Да попизди мне тут еще, получше тебя знаю
25 1448075
Пиздец нахуй пятый год в погромировании, тут какой-то ебанько на форуме в 256000-й раз кукарекает: ДА ЭТ НЕВОЗМОЖНО, ЭТ НИНУЖНО И ВООБЩЕ КОД ПОЛНАЯ ХУИТА))))0) КЕК))

Пиздец блять. Что в манямирок не вписывается - так нинужно или невозможно.
Screenshot13.png5 Кб, 582x280
26 1448092
Будьте осторожны с циклами, пилоты.
27 1448142
>>46969 (OP)
йо, товарищи, есть некий проект, в котором нужно реализовать комментирование контента без регистрации и использования сторонних систем комментирования ибо не везжает в концепцию и не хочется приплетать стороннюю верстку по тем же причинам . Так вот, делаю я такое впервые, и вопрос - как это дело контролить модерировать и банить сквернословных залетных, как это происходит, например, на имиджбордах? Алсо целевая аудитория не сильно широкая и плебейская, так что вряд ли будет много грязи, адмитить-модерировать будет от силы пара человек, но какие-то минимальные инструменты контроля нужны
28 1448163
>>48071
у валидатора есть метод sometimes

$v->sometimes('reason', 'required|max:500', function ($input) {
return $input->games >= 100;
});

так же у валидатора есть метод after, и то и другое можно вызывать в withValidator в FormRequest например, короче я к тому что способов сделать как тебе надо много, это будет канеш не так K P A C U B O но это похуй
29 1448178
>>47852
Ты расскажи нормально что за задача
30 1448180
>>48075

>Пиздец нахуй пятый год в погромировании


я тоже пять лет со скейтерами из двора тусовался и думал что я типа продвинутый и могу оли-оли крутить
31 1448181
>>48142
делай матерный словарик. Или вообще премодерацию забубень, пусть каждое сообщение отображается только когда твой модер галочку поставит. Они правда офигеют там все читать
32 1448203
>>48064
Проверь mod_rewrite, если apache на openсервере используешь
33 1448341
>>47970
Бизнесу насрать на экономию памяти - ему важнее скорость разработки и стоимость поддержки. А вот если васянить постоянно, то именно эти два фактора страдают.

Наблюдение такое.
34 1448342
>>48075

>пятый год в погромировании


Лол. И что? Все 5 лет говнокодил и вдруг мастером стал?
35 1448453
>>48075
Ты как партизан не афишируешь, нахуй тебе это надо.
С лаварелем я не знаком, работаю на симфони.
Аргументирую. В чистом виде такой хуйни нет, так как в принципе нет порядка валидации. Хуй его знает, как и в каком порядке ты будешь передавать поля. А привязывать логику валидации к тому, в каком порядке педрила с фронта расставил поля в формочке - это пиздос.
Я мог бы понять, если бы тебе требовалась кастомная валидация одних полей в зависимости от значения других, но ты упорно пиздел именно про порядок.
36 1448462
>>48453
А, нет, я ебусь в глаза. Ты ответил.
Но ты всё равно хуй, так как сформулировал вопрос ты максимально некорректно.
37 1448464
>>48341
вот тут ты сам себе противоречишь. Если бы ты не заморачивался надуманной проблемой из разряда "а чому у меня ифы в уже готовой конструкции не такие как я хочу! Надо бы переделоть!", то сыканомил бы уйму времени. По факту соглашусь, заказчику наплевать что там внутри, лишь бы работало. Это ты чистоплюй и перфекционист. Небось еще и моешься чаще чем раз в неделю, педота
38 1448540
Ковыряюсь тут с шаблонами для БД.
У меня есть соединение на одной библиотеке NotORM и я на её основе хочу сделать Data Mapper. И у меня такой вопрос - мне этот маппер биндить в зависимости или просто вызывать в контроллере, передав ему соединение?
39 1448559
>>48540

>мне этот маппер биндить в зависимости


Я бы сбиндил. Он же наверняка и в других контроллерах мелькнет?
40 1448563
>>48559
Да наверняка мелькнёт. В той же админке должен ещё быть.
41 1448614
42 1448812
Аношки, тоже взялся за студентов, как анины выше, но пока читаю условие и обдумываю. Возник вопрос:

>Список абитуриентов — выводит имя, фамилию, номер группы, число баллов. Выводятся по 50 человек на страницу, сортировка по любому полю делается кликом на заголовок колонки таблицы


а как вообще это реализуется? Мне это делать джаваСкриптом/джиКверри, типа перестраивать ячейки таблицы по клику, или силами пшп-скрипта - по клику отправлять новую ссылку на эту же страницу с новыми параметрами сортировки и перезагружать результат?
Как обычно это делается? Я с аяксом пока не очень знаком
15642215109570.jpg18 Кб, 437x431
43 1448813
>>46969 (OP)
Cап, анусы. Значит пытаюсь тут запилить себе учебно-портфольный проект и завис на таком моменте - по легенде мне надо сделать простой сайт на php + sql, с регистрацией, логином и сессией, что я уже сделал, но теперь самое важное - как дать возможность залогиненному болванчику загружать изображения на сервер и желательно, чтобы он еще видел только свои хотя уже не суть. Простой аплоад с галереей уж делал без привязки, но тут прям завис в ступоре уже третий час. Хочется уже дропнуть и просто воткнуть на залогиненную страницу форму с аплоадом и кидать картинки так.
инб4 приходи через год
44 1448817
>>48813
Создай ещё одну таблицу с полями ид картинки и ид соответствующего пользователя. Потом выгружай оттуда все картинки конкретного пользователя.
45 1448823
>>48812
На этом задании джаваскрипт вообще не нужен. Только вёрстка и бэкенд. Сортировка делается по ссылке.
Просто посмотри как у других сделано.
46 1448826
>>48823

>Сортировка делается по ссылке


Понял, спасибо
47 1448828
>>48812

Заголовок таблицы делается ссылкой, содержащей нужные параметры. Вот старый пост, где это обсуждалось: https://phpclub.tech/pr/res/1331378.html#1351739

Еще можно поискать в архиве по словам "ссылка сортировка", может что-то полезное найдешь? https://phpclub.tech/search/?q=ссылка+сортировка

Аякс ту не нужен, хотя с ним можно было бы сделать сортировку без перезагрузки страницы. Аякс желательно прикручивать поверх обычных ссылок (по принципу progressive enhancement), чтобы по-прежнему можно было скопировать и сохранить ссылку на страницу в определенном состоянии. Есть (была) библиотека pajax , которая большую часть работы берет на себя.

Задавай уточняющие вопросы, если что-то непонятно.
48 1448829
>>48828
Спасибо, попробую разобраться
49 1448932
Котаны, подскажите. Не понимаю как сверять хеши с рандомной солью с тем паролем что вводит пользователь.
Без использования функций пхп.
Например:
Пользователь регистрируется и вводит пароль - "pass"
Я хеширую его - хэш("pass") и склеиваю с некоей уникальной каждый раз рандомной строкой random(str)
И все это пишу в базу - хэш("pass").random(str)

Но как потом ручками проверить когда пользователь снова зайдет на сайт? Он ведет "pass", но откуда к этому pass прицепить соль, если соль у меня получается из функции которая каждый раз рандомную строку возвращает?
Или соль берем из какой нибудь связки id+login+фамилия?
50 1449022
>>48932
Соль в бд сохраняй и все
zdohzvitvorite.jpg77 Кб, 1200x1021
51 1449075
Может у кого есть идеи для php проекта?
52 1449085
>>49075
Не уверен что ты верно понял то о чем я спрашиваю.
В базе у меня хэш + рандомная соль.
Когда пользователь авторизуется и вводит свой пароль - от этого пароля вычисляется хэш, но как вычислится рандомная соль которая у меня хранится в базе?
Тоесть по факту я должен сравнить хэш от пароля что передал пользователь, с хэшем который у меня в базе. Но в базе у меня хэш + соль из рандомной строки. Как происходит сравнение.

Вот из доки инфа по password_hash()

Если не задано, то password_hash() будет генерировать случайную соль для каждого хешируемого пароля. Это предпочтительный режим работы.

Как эту случайная соль появляется в пароле который вводит пользователь.
Если что сорр за мою тупость.
53 1449089
>>49085
А ты меткий
54 1449090
>>49089
Не говори:(
55 1449101
>>49085
из мануала:

password_hash()

Использованный алгоритм, стоимость и соль будут возвращены как часть хеша. Таким образом, информация, необходимая для проверки хеша будет в него включена. Это позволит функции password_verify() проверять хеш без необходимости отдельного хранения информации о соли и алгоритме.
56 1449131
>>49075
У меня есть парочка. Но я не скажу.
57 1449172
>>49085

Соль это не часть пароля. Это случайно сгенерированная посл-ть символов. Ее назначение описано в моем уроке: https://github.com/codedokode/pasta/blob/master/security/password-hashing.md

В случае с password_hash она сама генерирует соль, потом получает хеш от пары (соль + пароль), и возвращает строку, содержащую и хеш, и использованную соль. Они используются в дальнейшем для проверки введенного пароля.

Задавай уточняющиевопросы, если что.
58 1449215
>>48813
>>48817
В общем я вчера чудовищно наговнокодил, но сейчас хотя бы все загружается и выводится. Теперь надо разобраться с удалением - оно не работает и похоже я нихуя не понимаю чего делаю неправильно пишу запрос на удаление. да, мне стыдно, что я такой тупой
59 1449252
>>49215
а почему не PDO?
60 1449258
>>49252
У меня был опыт общения, еще плоховато понимаю. А вообще уже все переписал и теперь все удаляется. Магия - стоит сюда написать, как все само собой решается.
61 1449263
>>49215

>код


Я будто помолодел на 15 лет.
>>49258

>стоит сюда написать, как все само собой решается


https://en.wikipedia.org/wiki/Rubber_duck_debugging
62 1449318
>>49215

>Теперь надо разобраться с удалением - оно не работает


Анон, есть хороший способ проверять запрос на работоспособность - просто берешь и выполняешь его в phpмайадмине. Тупо копируешь запрос из кода и вставляешь в поле/вкладку "запрос" пшпмайадмина. Если ошибка в запросе, то майадмин сразу тебе это напишет. Так ты хотя бы будешь знать где проблема - в коде пшп или в коде sql
63 1449339
>>49318

>Тупо копируешь запрос из кода


Лучше включить логирование запросов в mysql и брать из лога. Особенно если пользуешься каким-нибудь фреймворком который запрос сам формирует.
64 1449381
>>49318
Я поначалу вообще все запросы из пхпмайадмина тянул, только условия менял. Так и научился.
65 1449478
Пытаюсь написать бота для вайбера на пхп.
Есть библиотка https://github.com/Bogdaan/viber-bot-php
Если просто использовать её по инструкции, то всё работает: клиент пишет в вайбер сообщение, оно парсится ботом и если есть совпадение, то выдаётся стандартный ответ. А мне нужно, чтобы этот процесс разился на две фазы: приём сообщения из вайбера и отправка сообщения в вайбер. И чтобы и то и то были простыми функциями. С приёмом проблем нет, просто разбираем, что там пришло в webhook. А вот отправку я не понимаю, как сделать. Я засунул это всё в метод, метод в класс, но ничего не работает. И не пишет никаких ошибок, просто умирает, как только достигает команды $botSender = new Sender .
Честно говоря, я запутался в этих методах, вызовах, пространствах имён и прочем ооп. Посмотрите пожалуйста на код, что именно я там организовал не так? И как ловить и отлаживать такие ошибки? Даже когда я оборачиваю всё (вообще всё) в try, никаких эксепшенов не ловится.

https://pastebin.com/bMxDPt0y
66 1449498
>>49075
Можешь зарегатьться на ютубе и вести блок обучающий пхп
67 1449503
>>49478
Уточнение: я таки отловил ошибку Class 'Viber\Api\Sender' not found, но WTF? При подключении иде не ругается, значит видит этот класс. А если убрать use Viber\Api\Sender; или подключать левый класс Sender2, то сразу предупреждает, что такого нет. А на сервере не работает.
68 1449526
>>49075
Создай бота который будет скачивать видео из webm тредов и переделывать их под void. А затем автоматически постить пока капча не заебет.
69 1449527
>>49503
На сервер библиотеку-то закинул?
70 1449538
>>49527
Закинул. Если просто сделать, как в примере и расположить этот код в webhook, на который приходит сообщение из вайбера, то всё отлично работает.
71 1449568
>>49075
Есть уже живущий проект - архив PHP тредов по годам: https://phpclub.tech/
У него открытый код и есть issues, которые любой желающий может попытаться исправить: https://github.com/richBlueElephant/phpClub/issues

Отлично если работали с поисковым движком Sphinx, там 3 задачи только по нему одному.
image.png25 Кб, 477x188
72 1449619
Боже, какую же хуйню приходится писать, чтобы типы работали как надо.
73 1449622
У меня встал вопрос. Пробую использовать slim 4 для апи. Отправляю response json, и зачем-то отправляется favicon. Может это зависит от метода get, post? Проблема в том, что Vue не читает ответ запроса, в то время как с других api успешно получает данные. Как запретить передачу favicon.ico?)
74 1449623
zxcccc
75 1449683
Зачем нужны пространства имен?
cat1.png310 Кб, 512x512
76 1449760
>>46969 (OP)
Сап котаны. Закончил шарагу, проходил практику в ВУЗе там изучил Symfony и сделал проект на нем. Не потому что хотел, а потому что это в программе практики у них было.

В общем суть проблемы в том что у меня нет опыта работы, а вакансии где требуется Symfony большинство с опытом. Что делать?
Стоит ли вкатиться в laravel?

Город ДС2

Просто времени изучать еще 1 фреймворк нет, мне нужно срочно найти работу для того чтобы платить обучение на заочке.

Если интересен мой проект: http://relevantsearch.ru/
cat1.png310 Кб, 512x512
77 1449765
>>49760
Алсо реквестирую специалиста Symfony знакомого с компонентом Messenger. Воркеры создаются, но асинхронность не работает.

Гуглил проблему, там все пишут, что: "Я просто обновил Symfony и все заработало)))))))))". НО блять У меня версия НОВЕЕ чем у тебя дебил и всеравно ничего не работает.

Кароче доработка проекта встала только из-за этого. Пробовал еще с другими бандлами поддерживающими очередь работать, но вечно лажа происходила.
78 1449773
>>49765
Так объяснишь зачем нужны пространства имен?
79 1449821
>>49773
за тем что бы при установки доп пакетов , библиотек и тд , классы с 1 и тем же именем не переопределяли друг друга.
80 1449822
>>49821
>>49773
мимо другой анон
81 1449824
>>49760
в рф как и в всём пост совке (СНГ) весма мало продуктовых контор , потому симфони не нужно , а для средне малых подделок хорошо заходят RAD фреймы типа лары , потому их и юзают , так что да в неё вкатываться есть смысл
82 1449840
>>49824
Ща звонили с собеседования про битрикс и Yii2. Что расскажешь по поводу него? Какие подводные?
83 1449855
>>49622
Решил проблему добавлением такого заголовка: header("Access-Control-Allow-Origin: *");
84 1449874
>>49840

>про битрикс


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

>Yii2


не плох как RAD фрейм , но монолитен прям от слова совсем , хорошо генерит код ля админок всяких (так нормальной альтернативы для лары и не нашёл) , довольно популярен в СНГ (скорее всего и только тут) , можно стартануть на нём.
85 1449876
>>49855
осталось теперь почитать про CORS , и узнать чтож за заголовок такой магический
86 1449881
>>49876
Поиск проблемы был максимально непонятным. Как написано на вики - "браузер поддерживающий технологию CORS, передаст ошибку вместо данных." Chrome - выдавал ошибку, просто ошибку на этот запрос. Firefox - дал ответ с кодом 200.
87 1449882
Что нужно знать для бэкэнд разработки?
88 1449884
>>49882
извиняюсь и иду нахуй, если в шапке всё написано
89 1449910
>>49881
вполне реально ибо у них разные двежки очевидно правила CORS по умолчанию по разному ставят
90 1449926
>>49910
Попробуй вместо звездочки перечислить методы, в одном проекте у меня так решилось проблема
91 1449991
>>49619
Ты шо ебанутый?
92 1450005
>>49991
Это не я ебанутый, а тот инцел, который решил сделать передачу значения в функцию settype по ссылке.
93 1450010
>>49773
В передыдущем треде пережёвывали - посмотри архив.
94 1450016
>>49840

>битрикс


Легаси и костыли от 1С.
95 1450048
Предыдущий тред все-таки утонул, а вопросы остались. Попробуем ответить:

>>1445583



> Какие минимальные требования нужны чтоб взяли на работу ?


Открой hh.ru, поищи вакансии без опыта и сделай выводы.

>>1445953



> Вопрос про трейты.


> Есть приложение на фреймворке, зависимости подключаются через IoC.


> Есть набор классов, которые использовать надо в разных других классах.


> Я делаю трейт вида HuiDepenendencies, там подключаю зависимости и делаю геттеры.


> Далее в других разных классах включаю этот трейд



Вообще, для этого обычно используют DI контейнер. Смысла делать трейт на каждую зависимость я не вижу, плюс в таком варианте легко создать объект, не передав зависимость, и словить ошибку.

> Еще ты можешь использовать трейты, чтобы "разгружать" жирные классы и выносить связанные блоки логики в кирпичики-трейты.


> Например, я так разгрузил класс в 1000 строк, раскидав по трейтам связанные методы.



Сомнительный подход, по моему мнению, так как затрудняет изучение устройства класса.

>>1446336



> Делаю задачку по Slim, возник такой вопрос по фреймворкам - нужно ли абсолютно все зависимости пихать в контейнер, или некоторые классы можно подключать по ходу работы контроллера (т.е зависимости зависимостей не обязательно в контейнере держать)?



Удобнее все сервисы описывать к контейнере. И брать их из контейнера, чтобы не копипастить код создания объекта. Для контроллеров есть два подхода:

- описываем контроллер и его зависимости в контейнере
- не описываем контролллер в контейнере, но передаем ему контейнер в конструктор или метод. И уже там берем из контейнера нужные нам классы
95 1450048
Предыдущий тред все-таки утонул, а вопросы остались. Попробуем ответить:

>>1445583



> Какие минимальные требования нужны чтоб взяли на работу ?


Открой hh.ru, поищи вакансии без опыта и сделай выводы.

>>1445953



> Вопрос про трейты.


> Есть приложение на фреймворке, зависимости подключаются через IoC.


> Есть набор классов, которые использовать надо в разных других классах.


> Я делаю трейт вида HuiDepenendencies, там подключаю зависимости и делаю геттеры.


> Далее в других разных классах включаю этот трейд



Вообще, для этого обычно используют DI контейнер. Смысла делать трейт на каждую зависимость я не вижу, плюс в таком варианте легко создать объект, не передав зависимость, и словить ошибку.

> Еще ты можешь использовать трейты, чтобы "разгружать" жирные классы и выносить связанные блоки логики в кирпичики-трейты.


> Например, я так разгрузил класс в 1000 строк, раскидав по трейтам связанные методы.



Сомнительный подход, по моему мнению, так как затрудняет изучение устройства класса.

>>1446336



> Делаю задачку по Slim, возник такой вопрос по фреймворкам - нужно ли абсолютно все зависимости пихать в контейнер, или некоторые классы можно подключать по ходу работы контроллера (т.е зависимости зависимостей не обязательно в контейнере держать)?



Удобнее все сервисы описывать к контейнере. И брать их из контейнера, чтобы не копипастить код создания объекта. Для контроллеров есть два подхода:

- описываем контроллер и его зависимости в контейнере
- не описываем контролллер в контейнере, но передаем ему контейнер в конструктор или метод. И уже там берем из контейнера нужные нам классы
96 1450051
Ответы на вопросы из прошлого треда (тред есть в архиве и тут: https://phpclub.tech/pr/res/1415604.html ):

>>1446397



> Решил я тут посмотреть уроки по VueJS. ... Шоб оно все работало, надо написать в терминале: npm run dev


> Как это автоматизируется на практике? Например на линуксовом сервере?



Команда npm run dev скорее всего запускает сервер для разработки, который не годится для продакшена. Скорее всего она запускает какой-нибудь webpack в режиме отслеживания изменений в файлах, это нужно только на время разработки. В продакшене это не нужно, потому эта команда тоже не нужна.

Если ты написал фронтенд на JS, то ты какой-то командой делаешь сборку для продакшена. Некоторые собирают все в один огромный файл, который замедляет загрузку сайта, некоторые делают по-умному, набор из нескольких файлов. Если у тебя только фронтенд, и нет бекенда, то дальше тебе надо только выгрузить собранные файлы на продакшен. Это называется деплой.

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

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

Если у твоего приложения еще есть бекенд, то конечно, тебе надо как-то запустить на сервере программу-сервер. Сейчас почти все на systemd, потому логично сделать для этого systemd-юнит. Раньше, во времена syvinit, добавляли скрипт запуска сервера в /etc/init.d/, сервер запускали под супервизором, который перезапускает его в случае падения, а также ведет логи.

>>1446608



> пытаюсь заюзать get_browser(),


> но выдает ошибку "browscap.ini directive not set in <путь>"


> Прописал путь до нее в php.ini следующим образом


> [browscap]


> browscap = "F:\OpenServer\new_edition\OSPanel\modules\php\PHP_7.3-x64\browscap.ini" (без ковычек тоже пробовал)


> сохранил. Перезапустил openserver. обновляю страницу - опять та же самая ошибка.



Сделай файл с кодом <?php phpinfo(); и открой его через веб-сервер и браузер. Откроется большая синяя таблица, в ней найди browscap и посмотри, какое реально значение там выводится. Также в начале таблицы изучи список прочитанных ini-файлов. Есть несколько вариантов:

- ты неправильно назвал файл или поместил не в ту папку, и он не прочелся
- надо было использовать прямые слеши, а не обратные
96 1450051
Ответы на вопросы из прошлого треда (тред есть в архиве и тут: https://phpclub.tech/pr/res/1415604.html ):

>>1446397



> Решил я тут посмотреть уроки по VueJS. ... Шоб оно все работало, надо написать в терминале: npm run dev


> Как это автоматизируется на практике? Например на линуксовом сервере?



Команда npm run dev скорее всего запускает сервер для разработки, который не годится для продакшена. Скорее всего она запускает какой-нибудь webpack в режиме отслеживания изменений в файлах, это нужно только на время разработки. В продакшене это не нужно, потому эта команда тоже не нужна.

Если ты написал фронтенд на JS, то ты какой-то командой делаешь сборку для продакшена. Некоторые собирают все в один огромный файл, который замедляет загрузку сайта, некоторые делают по-умному, набор из нескольких файлов. Если у тебя только фронтенд, и нет бекенда, то дальше тебе надо только выгрузить собранные файлы на продакшен. Это называется деплой.

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

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

Если у твоего приложения еще есть бекенд, то конечно, тебе надо как-то запустить на сервере программу-сервер. Сейчас почти все на systemd, потому логично сделать для этого systemd-юнит. Раньше, во времена syvinit, добавляли скрипт запуска сервера в /etc/init.d/, сервер запускали под супервизором, который перезапускает его в случае падения, а также ведет логи.

>>1446608



> пытаюсь заюзать get_browser(),


> но выдает ошибку "browscap.ini directive not set in <путь>"


> Прописал путь до нее в php.ini следующим образом


> [browscap]


> browscap = "F:\OpenServer\new_edition\OSPanel\modules\php\PHP_7.3-x64\browscap.ini" (без ковычек тоже пробовал)


> сохранил. Перезапустил openserver. обновляю страницу - опять та же самая ошибка.



Сделай файл с кодом <?php phpinfo(); и открой его через веб-сервер и браузер. Откроется большая синяя таблица, в ней найди browscap и посмотри, какое реально значение там выводится. Также в начале таблицы изучи список прочитанных ini-файлов. Есть несколько вариантов:

- ты неправильно назвал файл или поместил не в ту папку, и он не прочелся
- надо было использовать прямые слеши, а не обратные
97 1450054

>>1446666


>>47478

> public function __construct($rate, $litresOfCoffee, $pgsOfDocs, $rank, $boss = false){


Это мы не проходили, но стоит использовать тайп-хинты, они защищают от ошибок и делают код читабельнее: https://www.php.net/manual/ru/functions.arguments.php#functions.arguments.type-declaration

>private function setRateWithRank(){


> if ($this->rank == 2) {


> $this->rate = $this->rate * 1.25;


> }



Это неудачное решение, так как ты в одном поле rate хранишь два разных значения: базовая ставка, и ставка, пересчитанная с учетом ранга. Ты затираешь базовую ставку, а это значит, если надо будет поменять ранг, то ты не сможешь легко вычислить новую ставку. Логичнее не хранить в одном поле два разных значения, а сделать два поля. Либо одно поле с базовой ставкой, а текущую ставку вычислять методом без сохранения в поле.

> private function setBossPrivelege(){



Тут та же проблема: начальные данные затираются.

> foreach ($this->employees as list($num, $position)) {



Этот способ хранения списка работников не очень-то ООП. С точки зрения ООП, наверно было бы правильнее сделать класс EmployeeGroup с полями "образец работника" и "кол-во". Но и такой подход будет плохо работать во второй части задачи, где надо менять зарплату и ранги людям.

Также, этот формат хранения не описан и трудно догадаться, глядя на конструктор класса Department, какой массив в него надо передать.

В общем, пока неплохо, делай тогда вторую часть про кризис, там недостатки кода, если они есть, вылезут наружу.
98 1450056

>>1447890



>>- зачем нужна таблица participant, если есть conference_reference? Я не понимаю, чем таблица participant отличается от conference_reference.


> Это денормализация чтобы получить конференцию по собеседнику, в случае приватных конференций



Тут мне кажется, непонимание. Я вижу, что в таблице conference_reference есть поля-ссылки:

- "user" -> на таблицу users
- "participant" -> на таблицу users
- conference -> на таблицу conference

А еще есть таблица participant с такими полями:

- user -> на таблицу users
- conference -> на таблицу conference

Соответственно вопрос, чем таблица participant отличается от conference_reference? Они обе содержат поля user и conference, и не хранят ли они одно и то же?

В моем понимании диалог выглядит так: есть conference, есть 2 ссылающихся на него conference_reference (вид на диалог со стороны каждого собеседника). Что тут делает таблица participant? На нее нет внешних ключей, то есть никто на нее не ссылается.

Вот определение этой таблицы: https://github.com/someApprentice/Crypter/blob/master/schema.sql#L152

Что касается денормализации для поиска существующего диалога, то поля user + participant в таблице conference_reference вполне решают эту проблему, как я понимаю.

> Да, id не как не используются для этих сущностный и не нужны. Вроде есть такой шаблон проектирования, когда создаются вспомогательные таблицы, которые ссылаются на основные, как бы соединяя их, и там нету поля id. Как он называется? Чтобы быть уверенным что я делаю.



Может быть, связь многие-ко-многим? Составной первичный ключ?

>> И еще, не отдаем ли мы тут детали ошибки на сервере пользователю


> Об этом нужно выдать ошибку пользователю. А вот ниже там действительно обрабатывается любая ошибка, но это только потому что я не знаю как обработать отдельные ошибки



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

Логгировать можно выводом в stderr, или попробовать разобраться с модулем logging: https://docs.python.org/3/library/logging.html

У тебя в коде есть комментарий:

> builtins.TypeError: catching classes that do not inherit from BaseException is not allowed


> except (InvalidSignatureError, UserNotFoundError, WrongTokenError, Exception) as e:



Это скорее всего из-за того, что классы не импортированы или импортированы неправильно и Питон путает их с какими-то другими классами. Для надежности можно отркыть исходный код, где они определены, и проверить, что они действительно наследуются от базового класса исключений.

> Тогда пришлось бы генерировать токен так как он генерируется в функции регистрации/логина. Не будет ли это положением теста на знание о том как генерируется токен?



Здесь вопрос в том, что именно мы хотим протестировать? Как звучат требования к модулю authenticator.py?

- "аутентификатор принимает валидный JWT токен, имеющий такую структуру: ...."
- или же "аутентификатор принимает токен неизвестного типа и структуры, выданный данной командой/функцией/методом API в PHP-приложении"

В первом случае, очевидно, мы должны получить этот токен с помощью функции генерации JWT токена или же сгенерировать его вручную какой-то командой и в комментариях описать эту команду. Чтобы другой разработчик мог сгенерировать токен сам и убедиться, что все верно.

Во втором - нам нужен интеграционный тест, который вызовет метод регистрации или логина в PHP-приложении, получит токен и передаст Питоновскому коду для проверки. Либо опять же, сгенерировать токен вручную и описать процедуру его получения в комментарии. Заметим, что в этом случае тест свалится при изменении структуры токена или приватного ключа.

Еще один вариант - попробовать "мокнуть" для тестов функцию декодирования токена (jwt.decode), заменив ее на свою функцию, возвращающую заранее известный результат для данного токена, вроде такого:

def mock_jwt_decode(token):
if token == 'token_for_alice':
return {"name": "Alice", "email": "aliceANUSexamplePUNCTUMc1UOom"}
...

То есть убрать из теста JWT. Но в этом случае мы полагаемся на знание того, что токен является JWT токеном, знаем его структуру и знаем, что тестируемый код использует jwt.decode.

Проблема с вписанным вручную токеном в том, что непонятно, откуда он взят. Как мне проверить вручную, что он корректен? Как поменять что-то в нем? Код теста должен быть читабелен, и проверяем, а тут я не могу разобраться в нем. Та же проблема, кстати, с прописанными хешами паролей пользователей вот тут: https://github.com/someApprentice/Crypter/blob/57b4ce3025053507a6b65aeac81fdd07149445fc/wamp/tests/conftest.py#L19 - непонятно, как они получены. Такой тест трудно будет отлаживать другому разработчику. Может, в тестируемом коде ошибка, а может ты просто опечатался при копировании токена - как понять?

Какой из вариантов лучше - надо выбирать, взвесив плюсы и минусы. Намекну, что вариант с комментарием самый простой в реализации.

>>Что касается исключений при авторизации, мне кажется, их правильнее ловить в обработчике авторизации, а не тут:


> Делать блок try/catch?



Да. Чем мне нравится этот вариант - тем, что мы ловим исключение только в определенном месте кода. И код обработки исключения находится рядом с остальным кодом авторизации. ExceptionListener же ловит исключения со всего кода, плюс, нелегко догадаться о его существовании и о том, что в нем есть код, относящийся к авторизации.

Вот, например, у тебя есть код в ExceptionListener:

> if ($exception instanceof UniqueConstraintViolationException) {


> $response = new Response('Bad Request', Response::HTTP_BAD_REQUEST);



Как я должен понять, к какому контроллеру относится этот код? Наверно можно попробовать поискать по коду, где используется ограничение на уникальность, но это какой-то очень странный подход. Также, этот код ловит исключения отовсюду. Ты писал его для какого-то своего контроллера, но исключения ловятся и со всех других контроллеров, что может быть неожиданно для их авторов, которые этого не хотели.
98 1450056

>>1447890



>>- зачем нужна таблица participant, если есть conference_reference? Я не понимаю, чем таблица participant отличается от conference_reference.


> Это денормализация чтобы получить конференцию по собеседнику, в случае приватных конференций



Тут мне кажется, непонимание. Я вижу, что в таблице conference_reference есть поля-ссылки:

- "user" -> на таблицу users
- "participant" -> на таблицу users
- conference -> на таблицу conference

А еще есть таблица participant с такими полями:

- user -> на таблицу users
- conference -> на таблицу conference

Соответственно вопрос, чем таблица participant отличается от conference_reference? Они обе содержат поля user и conference, и не хранят ли они одно и то же?

В моем понимании диалог выглядит так: есть conference, есть 2 ссылающихся на него conference_reference (вид на диалог со стороны каждого собеседника). Что тут делает таблица participant? На нее нет внешних ключей, то есть никто на нее не ссылается.

Вот определение этой таблицы: https://github.com/someApprentice/Crypter/blob/master/schema.sql#L152

Что касается денормализации для поиска существующего диалога, то поля user + participant в таблице conference_reference вполне решают эту проблему, как я понимаю.

> Да, id не как не используются для этих сущностный и не нужны. Вроде есть такой шаблон проектирования, когда создаются вспомогательные таблицы, которые ссылаются на основные, как бы соединяя их, и там нету поля id. Как он называется? Чтобы быть уверенным что я делаю.



Может быть, связь многие-ко-многим? Составной первичный ключ?

>> И еще, не отдаем ли мы тут детали ошибки на сервере пользователю


> Об этом нужно выдать ошибку пользователю. А вот ниже там действительно обрабатывается любая ошибка, но это только потому что я не знаю как обработать отдельные ошибки



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

Логгировать можно выводом в stderr, или попробовать разобраться с модулем logging: https://docs.python.org/3/library/logging.html

У тебя в коде есть комментарий:

> builtins.TypeError: catching classes that do not inherit from BaseException is not allowed


> except (InvalidSignatureError, UserNotFoundError, WrongTokenError, Exception) as e:



Это скорее всего из-за того, что классы не импортированы или импортированы неправильно и Питон путает их с какими-то другими классами. Для надежности можно отркыть исходный код, где они определены, и проверить, что они действительно наследуются от базового класса исключений.

> Тогда пришлось бы генерировать токен так как он генерируется в функции регистрации/логина. Не будет ли это положением теста на знание о том как генерируется токен?



Здесь вопрос в том, что именно мы хотим протестировать? Как звучат требования к модулю authenticator.py?

- "аутентификатор принимает валидный JWT токен, имеющий такую структуру: ...."
- или же "аутентификатор принимает токен неизвестного типа и структуры, выданный данной командой/функцией/методом API в PHP-приложении"

В первом случае, очевидно, мы должны получить этот токен с помощью функции генерации JWT токена или же сгенерировать его вручную какой-то командой и в комментариях описать эту команду. Чтобы другой разработчик мог сгенерировать токен сам и убедиться, что все верно.

Во втором - нам нужен интеграционный тест, который вызовет метод регистрации или логина в PHP-приложении, получит токен и передаст Питоновскому коду для проверки. Либо опять же, сгенерировать токен вручную и описать процедуру его получения в комментарии. Заметим, что в этом случае тест свалится при изменении структуры токена или приватного ключа.

Еще один вариант - попробовать "мокнуть" для тестов функцию декодирования токена (jwt.decode), заменив ее на свою функцию, возвращающую заранее известный результат для данного токена, вроде такого:

def mock_jwt_decode(token):
if token == 'token_for_alice':
return {"name": "Alice", "email": "aliceANUSexamplePUNCTUMc1UOom"}
...

То есть убрать из теста JWT. Но в этом случае мы полагаемся на знание того, что токен является JWT токеном, знаем его структуру и знаем, что тестируемый код использует jwt.decode.

Проблема с вписанным вручную токеном в том, что непонятно, откуда он взят. Как мне проверить вручную, что он корректен? Как поменять что-то в нем? Код теста должен быть читабелен, и проверяем, а тут я не могу разобраться в нем. Та же проблема, кстати, с прописанными хешами паролей пользователей вот тут: https://github.com/someApprentice/Crypter/blob/57b4ce3025053507a6b65aeac81fdd07149445fc/wamp/tests/conftest.py#L19 - непонятно, как они получены. Такой тест трудно будет отлаживать другому разработчику. Может, в тестируемом коде ошибка, а может ты просто опечатался при копировании токена - как понять?

Какой из вариантов лучше - надо выбирать, взвесив плюсы и минусы. Намекну, что вариант с комментарием самый простой в реализации.

>>Что касается исключений при авторизации, мне кажется, их правильнее ловить в обработчике авторизации, а не тут:


> Делать блок try/catch?



Да. Чем мне нравится этот вариант - тем, что мы ловим исключение только в определенном месте кода. И код обработки исключения находится рядом с остальным кодом авторизации. ExceptionListener же ловит исключения со всего кода, плюс, нелегко догадаться о его существовании и о том, что в нем есть код, относящийся к авторизации.

Вот, например, у тебя есть код в ExceptionListener:

> if ($exception instanceof UniqueConstraintViolationException) {


> $response = new Response('Bad Request', Response::HTTP_BAD_REQUEST);



Как я должен понять, к какому контроллеру относится этот код? Наверно можно попробовать поискать по коду, где используется ограничение на уникальность, но это какой-то очень странный подход. Также, этот код ловит исключения отовсюду. Ты писал его для какого-то своего контроллера, но исключения ловятся и со всех других контроллеров, что может быть неожиданно для их авторов, которые этого не хотели.
99 1450060

>>1447890



>>Так писать не стоит, это не keyword arguments из Питона и имена переменных не учитываются никак.


> А как понимать что за аргумент был передан?



Можно было бы добавить комментарий, но я думаю, лучше ничего не писать. Так как при рефакторинге ты можешь поменять имена аргументов, но забыть поменять комментарий и он начнет запутывать. Подсказывать должна IDE или переход к функции и просмотр ее заголовка глазами.

> Нужно тогда заранее определять переменные и передавать их?



Можно и так.

> Разве не нужно проверить что выдаются кукисы? Они ведь нужно для правильной работы приложения.



Можно проверить, что какая-то кука выдается, но ее наличие не равносильно авторизации, так как код может выдавать куку с некорректным значением, которая не пройдет проверку позже. Или это может быть кука для учета статистики, которая выдается всем подряд. А у тебя проверяется наличие 4 определенных кук. При изменении алгоритма авторизации, имен кук твои тесты сломаются. Потому я бы их вообще не проверял. То есть лучше не полагаться тут на знание механизма авторизации.

> Проверка авторизации выполняется тестом проверки доступа к разлогиниванию



Можно так, но я боюсь, что кто-то потом сделает этот метод доступным для всех и тест начнет врать.

>>Также, не надо копипастить огромные полотна кода, можно было сделать вспомогательную функцию для отправки запросов.


> Я как раз хотел спросить где хранить вспомогательные для тестов функции делать класс tests/Utils.php?


Можно сделать папку tests/Support/ или tests/Helper/

>>Соответственно тесты будут вида canLoginWithValidPassword, cannotLoginWithWrongPassword.


> Нужно разбить одну функцию на две?


Да, можно сделать два теста.

>>Далее, это ненадежный способ проверки, ведь речь тут о безопасности:


>>> if 'private.message.to.' in uri:


> Почему тот метод не надёжный?



Я немного ошибся, в данном случае уязвимости не возникает. Она бы могла возникнуть в таком случае:

if 'private.message.to.' in uri and is_anonymous:
return True

так как тут аноним мог бы получить доступ к методам вроде admin.view.private.message.to...

Потому лучше не использовать in вместо starts_with.

>>Микрооптимизация: регулярку можно скомпилировать один раз в начале скрипта и использовать скомпилированную версию.


> Зачем компилировать регулярку в начале скрипта?



Компиляция и разбор регулярки занимает крошечное, но время. Делая ее один раз в начале программы, мы экономим процессорное время. В PHP, например, есть кеш компилированных регулярок для оптимизации. Если ты вызовешь функцию preg_match() с одной регуляркой несколько раз, компиляция делается только один раз.

> М да, для группового чата так и нужно сделать. Вообще отправка 1000 уведомлений сделано, потому что, представим, пользователь очень популярен и каждый день получает 100 а может и 1000 новых сообщений от уникальных пользователей, и в итоге ему на всех нужно подписываться, что перенагрузит клиентское приложение. Гораздо лучше перенести эту нагрузку на серверную часть.



Да, тут надо подумать. Допустим, у нас есть 10 больших конференций, в каждой 1М пользователей:

- когда мы шлем уведомления каждому участнику, мы имеем 1М коннектов к wamp серверу и 1М подписок, а при обновлении в одной конференции шлем с PHP-приложения WAMP-демону 1М сообщений, которые он передает пользователям.
- когда мы используем свой канал обновлений для каждой конференции, мы имеем 1М коннектов и 10М подписок, а при обновлении в конференции PHP-код шлет единственное сообщение, которое демон разошлет 1М подписчиков

Но теперь представим, что из 1М участников онлайн только 100K:

- в первой схеме мы имеем 100k коннектов и 100k подписок, но при обновлении PHP-код по прежнему шлет 1М сообщений демону, так как PHP код не знает число подключенных пользователей
- во второй схеме PHP-код шлет одно сообщение демону, а тот рассылает его в 100K копий.

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

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

Кстати, я как-то читал про протокол Телеграма, там сделано чуть интереснее. Там есть соединение с сервером, и клиент может слать API запросы (например: получить информацию о контакте, получить N сообщений из чата), и получать ответы. Но также сервер может слать клиенту уведомления по своей инициативе. Там нет явной подписки, так как сервер и так знает, какие у пользователя контакты и в каких группах он состоит. То есть по сути там пользователь, вступая в группу, автоматически подписывается на обновления в ней, и эта подписка не пропадает при отсоединении и переподсоединении. Аналогично сервер шлет информацию об обновлении информации в профиле контакта.

Но у Телеграма полностью самописный сервер.

> Только мне кажется что менять ключ не обязательно, потому что пользователь всё равно не сможет ни получить ни отправить сообщения, потому что API/WAMP его не авторизует для этого.



Речь о ситуации, когда пользователь авторизовался, вступил в чат, подписался на обновления в нем. Затем его выгоняют из чата, но авторизация на WAMP-сервере пройдена и подписка на обновления чата осталась.

> Да, об этой проблеме я уже осведомлён. Например, пользователь отсоединился на долгое время (несколько месяцев или год) и какой-то его собеседник или многие собеседники решили отредактировать или прочесть большое количество сообщений. И когда пользователь вновь откроет клиент, нужно обновить все эти сообщения. Очевидно, что нельзя подхватывать всё это большое количество сообщений сразу, и нужно подгружать их sequential, т.е. стримить.



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

> Да, это неудобно когда что-то редиректиться или выдается пустая страница.



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

> и если её ещё не существует, то мы просто не запрашиваем сообщения, а после отправки сообщения и её создания нас уведомит об этом WAMP и мы её реактивно подхватим.



Это на медленном соединении или в офлайне будет плохо работать: ты шлешь сообщение и оно появляется в диалоге с большой задержкой. Лучше было бы конечно локально его сохранить, отобразить, а затем пытаться отправлять в фоновом режиме.

>>Единственное, я не советую привязываться к текущей директории, чтобы ничего не ломалось, ...


> Текущая директория это какая?


Это та, что возвращается вызовом os.getcwd(), текущая директория процесса. В linux/win с каждым процессом связана "текущая" директория.

> Чтобы зашифровать голосовое/видео сообщение и сохранить его на сервер. Или не только сам контент сообщения, но и приложения к нему, например фотографию. Любая информация должна быть зашифрована.



Так можно делать это без сохранения в файл. Открываем исходный файл, читаем начало, шифруем, шлем на сервер. Берем следующий блок, шифруем, шлем на сервер. И так далее.

> Зашифрованные файлы весят больше?



Если мы отправляем файл с локального диска на сервер, то нам незачем создавать на диске зашифрованную копию этого же файла. Так как он у нас есть в расшифрованном виде.
99 1450060

>>1447890



>>Так писать не стоит, это не keyword arguments из Питона и имена переменных не учитываются никак.


> А как понимать что за аргумент был передан?



Можно было бы добавить комментарий, но я думаю, лучше ничего не писать. Так как при рефакторинге ты можешь поменять имена аргументов, но забыть поменять комментарий и он начнет запутывать. Подсказывать должна IDE или переход к функции и просмотр ее заголовка глазами.

> Нужно тогда заранее определять переменные и передавать их?



Можно и так.

> Разве не нужно проверить что выдаются кукисы? Они ведь нужно для правильной работы приложения.



Можно проверить, что какая-то кука выдается, но ее наличие не равносильно авторизации, так как код может выдавать куку с некорректным значением, которая не пройдет проверку позже. Или это может быть кука для учета статистики, которая выдается всем подряд. А у тебя проверяется наличие 4 определенных кук. При изменении алгоритма авторизации, имен кук твои тесты сломаются. Потому я бы их вообще не проверял. То есть лучше не полагаться тут на знание механизма авторизации.

> Проверка авторизации выполняется тестом проверки доступа к разлогиниванию



Можно так, но я боюсь, что кто-то потом сделает этот метод доступным для всех и тест начнет врать.

>>Также, не надо копипастить огромные полотна кода, можно было сделать вспомогательную функцию для отправки запросов.


> Я как раз хотел спросить где хранить вспомогательные для тестов функции делать класс tests/Utils.php?


Можно сделать папку tests/Support/ или tests/Helper/

>>Соответственно тесты будут вида canLoginWithValidPassword, cannotLoginWithWrongPassword.


> Нужно разбить одну функцию на две?


Да, можно сделать два теста.

>>Далее, это ненадежный способ проверки, ведь речь тут о безопасности:


>>> if 'private.message.to.' in uri:


> Почему тот метод не надёжный?



Я немного ошибся, в данном случае уязвимости не возникает. Она бы могла возникнуть в таком случае:

if 'private.message.to.' in uri and is_anonymous:
return True

так как тут аноним мог бы получить доступ к методам вроде admin.view.private.message.to...

Потому лучше не использовать in вместо starts_with.

>>Микрооптимизация: регулярку можно скомпилировать один раз в начале скрипта и использовать скомпилированную версию.


> Зачем компилировать регулярку в начале скрипта?



Компиляция и разбор регулярки занимает крошечное, но время. Делая ее один раз в начале программы, мы экономим процессорное время. В PHP, например, есть кеш компилированных регулярок для оптимизации. Если ты вызовешь функцию preg_match() с одной регуляркой несколько раз, компиляция делается только один раз.

> М да, для группового чата так и нужно сделать. Вообще отправка 1000 уведомлений сделано, потому что, представим, пользователь очень популярен и каждый день получает 100 а может и 1000 новых сообщений от уникальных пользователей, и в итоге ему на всех нужно подписываться, что перенагрузит клиентское приложение. Гораздо лучше перенести эту нагрузку на серверную часть.



Да, тут надо подумать. Допустим, у нас есть 10 больших конференций, в каждой 1М пользователей:

- когда мы шлем уведомления каждому участнику, мы имеем 1М коннектов к wamp серверу и 1М подписок, а при обновлении в одной конференции шлем с PHP-приложения WAMP-демону 1М сообщений, которые он передает пользователям.
- когда мы используем свой канал обновлений для каждой конференции, мы имеем 1М коннектов и 10М подписок, а при обновлении в конференции PHP-код шлет единственное сообщение, которое демон разошлет 1М подписчиков

Но теперь представим, что из 1М участников онлайн только 100K:

- в первой схеме мы имеем 100k коннектов и 100k подписок, но при обновлении PHP-код по прежнему шлет 1М сообщений демону, так как PHP код не знает число подключенных пользователей
- во второй схеме PHP-код шлет одно сообщение демону, а тот рассылает его в 100K копий.

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

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

Кстати, я как-то читал про протокол Телеграма, там сделано чуть интереснее. Там есть соединение с сервером, и клиент может слать API запросы (например: получить информацию о контакте, получить N сообщений из чата), и получать ответы. Но также сервер может слать клиенту уведомления по своей инициативе. Там нет явной подписки, так как сервер и так знает, какие у пользователя контакты и в каких группах он состоит. То есть по сути там пользователь, вступая в группу, автоматически подписывается на обновления в ней, и эта подписка не пропадает при отсоединении и переподсоединении. Аналогично сервер шлет информацию об обновлении информации в профиле контакта.

Но у Телеграма полностью самописный сервер.

> Только мне кажется что менять ключ не обязательно, потому что пользователь всё равно не сможет ни получить ни отправить сообщения, потому что API/WAMP его не авторизует для этого.



Речь о ситуации, когда пользователь авторизовался, вступил в чат, подписался на обновления в нем. Затем его выгоняют из чата, но авторизация на WAMP-сервере пройдена и подписка на обновления чата осталась.

> Да, об этой проблеме я уже осведомлён. Например, пользователь отсоединился на долгое время (несколько месяцев или год) и какой-то его собеседник или многие собеседники решили отредактировать или прочесть большое количество сообщений. И когда пользователь вновь откроет клиент, нужно обновить все эти сообщения. Очевидно, что нельзя подхватывать всё это большое количество сообщений сразу, и нужно подгружать их sequential, т.е. стримить.



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

> Да, это неудобно когда что-то редиректиться или выдается пустая страница.



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

> и если её ещё не существует, то мы просто не запрашиваем сообщения, а после отправки сообщения и её создания нас уведомит об этом WAMP и мы её реактивно подхватим.



Это на медленном соединении или в офлайне будет плохо работать: ты шлешь сообщение и оно появляется в диалоге с большой задержкой. Лучше было бы конечно локально его сохранить, отобразить, а затем пытаться отправлять в фоновом режиме.

>>Единственное, я не советую привязываться к текущей директории, чтобы ничего не ломалось, ...


> Текущая директория это какая?


Это та, что возвращается вызовом os.getcwd(), текущая директория процесса. В linux/win с каждым процессом связана "текущая" директория.

> Чтобы зашифровать голосовое/видео сообщение и сохранить его на сервер. Или не только сам контент сообщения, но и приложения к нему, например фотографию. Любая информация должна быть зашифрована.



Так можно делать это без сохранения в файл. Открываем исходный файл, читаем начало, шифруем, шлем на сервер. Берем следующий блок, шифруем, шлем на сервер. И так далее.

> Зашифрованные файлы весят больше?



Если мы отправляем файл с локального диска на сервер, то нам незачем создавать на диске зашифрованную копию этого же файла. Так как он у нас есть в расшифрованном виде.
100 1450109
>>49683
Чтобы изолировать код, который в него входит, от другого кода.
101 1450129
Аноны, смогу ли я перекатиться к вам в похапе за месяц, чтобы устроиться хотя бы стажером за 15к, учитывая что хорошо знаю питон и немного джангу? А то чет ахуел с действительности, что питонистом невозможно устроится в моем миллионике, 1 вакансия на джуна и несколько на сеньоров-помидоров.
102 1450167
>>50129
Смотри на вакансии в своем миллионнике.
103 1450169
>>50129
Как же хорошо, что я вовремя одумался и не покатился в пиздон наслушавшись советов с двача
104 1450176
>>50167
Да я уже посмотрел вакансии, требования уровня php/js/sql/html/css, знаю все кроме пхп, вот и спрашиваю за сколько можно дойти до уровня, что могу работать.и вакансий в 10 раз больше чем на питониста
105 1450180
Дошли руки с докером разобраться. Какаяже годнота скажу я вам
106 1450247
>>50180
Скажи мне скажи мне
в чем годнота?
Ладно если у тебя контейнер - весь проект - Изи - но я так же могу и в xampp сунуть его и не пизди мне что у тебя клиент по сто раз на дню меняет окружение. Это редкость редкая когда тебе надо скакать между на столько рознящимися окружениями
107 1450306
>>50247
Я не тот анон, но суть же не столько в вопросе смены окружения, сколько в лёгкости деплоя (используя Swarm или Kubernetes). Представь, что ты собрал какой-то проект у себя на сервере, и теперь тебе его нужно перенести на сервер заказчика. Без контейнеров тебе придётся поднимать сервер дважды - у себя и у него. А так - просто воткнул контейнер и всё сразу работает.
108 1450335
>>46969 (OP)
1) ЕОБ (есть одна борда), в процессе написания. Пользователь может загружать файлы картинок. Обработчик формы присваивает имена файлам с помощью microtime() или time() (какую функцию выбрать кстати?). Эти значения будут уникальными? Что будет, если два или более пользователя одновременно запостят картинки? Не существует шанса распидорасить сервер?

2) Есть исходные коды блога и форума, и два sql-файла к ним. Как правильно объединить базы для одного сайта? Слить sql-файлы в один (и это будет одна база, имена таблиц у блога и форума не совпадают), или подключаться одновременно к двум разным базам (это нормально?)? Как делают опытные люди?
109 1450343
>>50335

>1


У тебя же есть посты с айдишниками - вот и прикрепляй к ним эти картинки.

>2


Неебу. Может миграции помогут.
110 1450346
>>50247
Я только разобрался и поэтому не юзал. Но по опыту было не раз например так: мне дается сервер, на котором стоит сайт писаный под пыху 7.0. Повышать ее версию мне нельзя, но в тоже время имеется мой бот, написанный на 7.3. Обычно перепиливал бота под 7.0, сейчас бы мог использовать докер.

Но мне больше нравится не это, а то, что я могу по щелчку пальцев менять составляющие, локально, при разработке. Например быстро сменить мускуль на мариюдб и т.д.
111 1450348
>>50343
Прикрепляю. Но мой вопрос про имена файлов. Вот как тут:
https://2ch.hk/pr/src/1446969/15647696144140.png (М)
microtime() или time() генерируют уникальные значения при использовании в обработчике формы?
bear.png1,1 Мб, 944x708
112 1450354
>>46969 (OP)
есть скрипт который должен мне на почту через форму письмо отправлять
а он ничего не отправляет
даже в спам
https://ideone.com/RLlKiz
113 1450357
>>50348
Как вариант делать хэш из микротайма и айдишника поста - коллизии будут минимальны.
114 1450359
>>50348
К тому же никто не мешает те же айдишники и к файлам делать, которые с автоинкрементом. И не городить огород.
115 1450360
>>50354

>// Email address verification, do not edit.


function isEmail($email) {
return(preg_match("/^[-_.[:alnum:]]+@((([[:alnum:]]|[[:alnum:]][[:alnum:]-]*[[:alnum:]])\.)+(ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|info|int|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)$|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])\.){3}([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$/i",$email));
}Аж обои отклеиваться стали. У пхп есть функция filter_var($email, FILTER_VALIDATE_EMAIL) для таких вещей.
116 1450377
>>50306
Я тоже так подумал и радовался что не придется ебаться. Но админ на тесте каждый из микросервисов собрал в отдельные контейнеры тоесть уже различие с локалью где каждый сервис в контейнере. А у заказчика на серверах Винда.
117 1450431
>>49765

Опиши проблему подробнее. Как ты устанавливал этот компонент, какой код добавил, что запускаешь, что ожидаешь, что получается. Какая ОС и веб-сервер.
118 1450435
>>49773

Есть урок про пространства имен и автозагрузку: https://github.com/codedokode/pasta/blob/master/php/autoload.md
119 1450440
>>49619

Не сталкивался с такой проблемой. Увы, кроме кода, никаких пояснений ты не дал.
120 1450444
>>50335

Вообще, держать 2 базы выглядит более здравой и бехзопасной идеей. Это, например, позволит разнести приложения на разные машины. Но это же потребует небольшого усложнения кода, чтобы в приложении была поддержка нескольких соединений с БД.

И, кстати, ты можешь сделать поддержку в коде для 2 баз, но использовать одну и ту же.
121 1450503
>>50176
Зависит от целого ряда факторов, в первую очередь от умения пиздеть с умным видом и быстро как понос учиться.
Голый ПХП на самом деле нужен либо совсем ньюфагам, которым важнее на данном этапе пощелкать, как работает веб, либо матерым олдфагам пишущим какую-нибудь экзотику.
Реально все работают на фреймфорках-CMS. И у каждого фреймворка есть своя логика, в рамках которой и следует ебашить. Поищи, знания каких фреймворков требуются у тебя. Это у питона по факту один Джанго, у пыха цветущих и пахнущих (в разных смыслах) штук 20. Один из вариантов - сделать за неделю задачу со студентами и устроиться стажером за еду, уча то, что используется в конторе.
Главный совет - избегай БИТРИКСА. Он сука популярен в рашке и его использует куча студий. Данная хуйня представляет из себя достаточно мощный, но извращенный как половая ориентация Слаанеш фреймворк/CMS, который не научит тебя ничему хорошему. Связывайся, только если альтернативы ну совсем нет а жрат хочется.
122 1450511
>>50503
А вот смотри, такой пример.
Я знаю все основы языка, включая ООП, понимаю, как работать с базами данных, умею писать базовые запросы и составлять структуру БД. Но при этом у меня совершенно нет опыта в создании каких-то рабочих проектов на пыхе, потому что, как ты и говоришь, я всегда пилил все на CMS/CMF (преимущественно MODX). Но сейчас я хочу свои навыки поднять на рыночный уровень, чтобы найти нормальную работу, возможно даже завести трактор в перспективе. Нужно ли мне для этого пробовать реализовывать какие-то либо проекты на чистой пыхе, так сказать, для опыта и набивания скиллов? Или сразу сосредоточиться на каком-нибудь Ларавеле, попутно восполняя пробелы в знании самого языка?
123 1450521
>>50511
Возможно, меня сейчас обоссут, но это

>Или сразу сосредоточиться на каком-нибудь Ларавеле, попутно восполняя пробелы в знании самого языка?


лучше.
Поясняю. Делая что-то на чистой пыхе, ты получаешь абстрактный некоммерческий опыт. В силу твоей неопытности - негативный, на своей жопе путем ошибок выясняя откуда растут ноги у современных паттернов проектирования. Я бы сделал задачу про студентов (она содержит необходимый минимум для ознакомления), посмотрел какой фреймворк используется в твоем города и устроился туда джуном, подтягивая недостающее.
124 1450602
>>50503
Спасибо за ответ, сейчас проштудировал вакансии, в одних нужен ларавел, в других yii в третьих битрикс, в четвертых еще какие-то но самые популярные первые 2, битрикс я так понял сразу отпадает и что тогда учить лучше laravel или yii?
125 1450628
>>50602
laravel. он сейчас самый популярный.
По нему советовали "Дмитрий Елисеев Сайт объявлений на Laravel". Сам не проверял, там 70 часов видео.
126 1450682
>>50628
И от того же Елисеева есть интернет магазин на yii2, у него можешь еще и симфони посмотреть =)
127 1450710
Что лучше использовать: наследование или декоратор с инъекцией?
128 1450711
>>50521

>В силу твоей неопытности - негативный


Зато увереннее себя чувствуешь с инструментом. когда пальцы им поотшибаешь
Слыхал про совсем тупых макак, которые задрочили один фреймворк и не могут ни налево, ни направо.
129 1450808

>2019


>просить совета у двача



Какой посоветуете хостинг для домашнего проекта? Какой сами используете?
130 1450829
>>50808
Они одинаковые все по-большому счёту. Можешь ещё на облачные платформы посмотреть.
image.png32 Кб, 586x409
131 1450864
>>50431
Разрабатывал используя OPEN SERVER докер не преподавали.
На хостинге используется юбунта 16.04 и LAMP.
Устанавливал composer require messenger
В качестве шины была Doctrine MESSENGER_TRANSPORT_DSN=doctrine://default
Все настройки выставил по дефолту как в документации.
При попытке запустить воркера командой php bin/console messenger:consume async -vv
132 1450867
>>50864
Не дописал:
Нихуя не работает, то одна ошибка вылетает, то другая. Почему другая? Потому что умники на гитхабе посоветовали редактрировать сам компонент. В итоге одну ошибку исправил, сразу появлялась другая. В конечном итоге проблема с сериалайзером была. Он почему то не работал. И вот я оказался тут.

Самое интересное что БЕЗ ШИНЫ и без настроек месенджера. Тоесть как показано в самом начале документации https://symfony.com/doc/current/messenger.html
Все сообщения хендлятся и воркер запускается.

Хотя по сути это уже не воркер, а обычный сервис. Потому что он выполняется синхронно.
blade runner 2.jpg15 Кб, 428x424
133 1450950
Тест на PHP-IQ
Хочу вам вкинуть задачку и посмотреть, как быстро аноны додумаются до того, до чего я додумался за 1 час.
Как только прозвучит решение, до которого я дошел, или же близкое к нему - я сообщу, как сделал я.
Чисто для интереса, может я гораздо более тупой, чем думаю я до этого додумаются все за 5 мин или вовсе предложат лучшее, чем у меня.
Если будете постить решения хуже, чем у меня - я скажу, в чем минусы каждого решения.

Задача:
Юзеры могут создавать задания, которые запускаются по времени на сервере.
Формат - любой, который поддерживает CRON, но с точностью не более минуты.
Ориентируемся на то, что заданий может быть много, в районе 10к. (но не миллионы, это уже йоба-хайлоад, туда лезть не будем).
Задание - некий процесс, который может длиться от 0 до 1 секунды.
Дело происходит на пыхе. Задания хранятся в БД в отдельной таблице (в каком формате хранить - тоже подумай, хуле. Это может быть тупо cron-строка или же какие-то столбцы, смотри сам).

Как организовать запуск заданий, чтобы это жрало минимум ресурсов (оперативка, проц, время)?
134 1450953
>>50950
Код никакой не нужен, просто описать словами, как бы вы что сделали
135 1450972
>>50950
Лень долго думать (к тому же ты не описал возможную структуру задач).
В БД хранятся: строчка, описывающая задание (это может быть хоть eval код хоть ссылка на php скрипт), галочка выполнено/нет и время следующего выполнения.
Отдельный процесс (самое простое - крон) обходит базу, выбирает процессы, которые необходимо выполнить, и отрабатывает их. Самое простое - обходить их в цикле, если проблемы со скоростью - заводить подпроцессы на отдельные задачи (или группировать по 10 штук в процессе).
136 1450999
>>50972

>время следующего выполнения


Бинго, ты понял самое главное. Надо хранить время следующего запуска.

Какие были еще варианты:
1. Добавлять пользовательские задания прямо в crontab. Можно с модификатором "&", чтобы они запустились одновременно. Минус в том, что каждое задание будет заново загружать все зависимости приложения, все классы фреймворка, вся эта хуйня будет происходить для каждого задания. Очень скоро тупо оперативки начнет не хватать, плюс эти манипуляции будут жрать процессор. Плюс - не надо дрочить всю таблицу заданий.
2. Хранить в базе задание крон в виде строки, каждый раз обходить всю таблицу и смотреть, надо ли выполнить это задание в данную минуту. Минус - надо дрочить КАЖДОЕ задание КАЖДУЮ минуту, очень долго и жрет процессор.

А если хранить в таблице время следующего запуска задания, то можно тупо sql-запросом выбрать сразу те задания, что нужно запустить в данный момент, не обдрачивая cron-строку каждого задания.
После выполнения обновляем время следующего выполнения.
Таким образом, всегда загружаются только те задания, которые действительно должны быть выполнены + зависимости загружаются только 1 раз.

Ну и да, можно всегда прикрутить, чтобы они в мультитрединге запускались, если есть такая необходимость.
Например, в моем случае это будет даже минус, ибо хоть задания и будут выполнены "более одновременно", но это увеличит нагрузку на сторонние сервисы.
А когда они выполняются последовательно, хоть точность и меньше, но и нагрузка на сервисы меньше.
изображение.png18 Кб, 605x306
137 1451347
Не понял.
Эта установка только для Linux? На Windows никак не поставить?
138 1451371
>>51347

Вообще, правильный URL - это вот этот: https://github.com/richBlueElephant/phpClub

Я подозреваю, никто не тестировал работу под виндой. Ты можешь попрбовать стать первопроходцем, и выявить (а может и исправить) баги под винду.

- php, composer под виндой работают
- cp - команда копирования, можно скопировать файл вручную через Проводник или командой copy, если ты предпочитаешь командную строку
- что касается make - эта команда выполняет команды, записанные в файле Makefile (почитать на русском про команду make можно тут: https://www.google.com/search?client=firefox-b-d&q=описание+команды+make)

Makefile - это вот этот файл: https://github.com/richBlueElephant/phpClub/blob/master/Makefile

Из него видно, что make migrate выполняет команду vendor/bin/doctrine-migrations migrations:migrate --no-interaction

Я думаю, что под винду там надо немного подправить ее вид, вроде vendor/bin/doctrine-migrations.cmd или может быть php vendor/doctrine/doctrine/something.php или как-то так

- sphinx под винду работает
- разрешения на папки ставить не требуется

В качестве сервера ты можешь использовать встроенный в PHP веб-сервер.

------

Также, есть еще 3 варианта:

- в Windows 10 есть WSL, WSL2 - это поддержка запуска линуксовых приложений в консоли. Ставим ubuntu и запускаем все, что надо
- в более ранних Windows можно установить msys или cygwin . Это линуксовые утилиты (bash, ls, cp, make итд), портированные под Windows. С ними, конечно, надо разбираться, и может придется немного подправить команды, но они позволяют в том числе запускать команду make.
- использовать виртуальную машину с линуксом. Придется немного повозиться с настройкой, а также, в ней программа будет работать немного медленнее

------

В помощь тебе - набор минимальных знаний о командной строке: https://github.com/codedokode/pasta/blob/master/soft/cli.md

------

Если что-то еще непонятно, задавай уточняющие вопросы.
138 1451371
>>51347

Вообще, правильный URL - это вот этот: https://github.com/richBlueElephant/phpClub

Я подозреваю, никто не тестировал работу под виндой. Ты можешь попрбовать стать первопроходцем, и выявить (а может и исправить) баги под винду.

- php, composer под виндой работают
- cp - команда копирования, можно скопировать файл вручную через Проводник или командой copy, если ты предпочитаешь командную строку
- что касается make - эта команда выполняет команды, записанные в файле Makefile (почитать на русском про команду make можно тут: https://www.google.com/search?client=firefox-b-d&q=описание+команды+make)

Makefile - это вот этот файл: https://github.com/richBlueElephant/phpClub/blob/master/Makefile

Из него видно, что make migrate выполняет команду vendor/bin/doctrine-migrations migrations:migrate --no-interaction

Я думаю, что под винду там надо немного подправить ее вид, вроде vendor/bin/doctrine-migrations.cmd или может быть php vendor/doctrine/doctrine/something.php или как-то так

- sphinx под винду работает
- разрешения на папки ставить не требуется

В качестве сервера ты можешь использовать встроенный в PHP веб-сервер.

------

Также, есть еще 3 варианта:

- в Windows 10 есть WSL, WSL2 - это поддержка запуска линуксовых приложений в консоли. Ставим ubuntu и запускаем все, что надо
- в более ранних Windows можно установить msys или cygwin . Это линуксовые утилиты (bash, ls, cp, make итд), портированные под Windows. С ними, конечно, надо разбираться, и может придется немного подправить команды, но они позволяют в том числе запускать команду make.
- использовать виртуальную машину с линуксом. Придется немного повозиться с настройкой, а также, в ней программа будет работать немного медленнее

------

В помощь тебе - набор минимальных знаний о командной строке: https://github.com/codedokode/pasta/blob/master/soft/cli.md

------

Если что-то еще непонятно, задавай уточняющие вопросы.
139 1451448
>>51371
Я лучше сдохну в мучениях чему буду пытаться запустить Makefile на Windows. Спасибо за ответ.
140 1451449
>>51371
Спасибо, поправил URL репозитория (хотя гитхаб умеет редиректить со старого URL на новый). Добавил в README больше словесных описаний, объясняющих что делают консольные команды. К сожалению, нет возможности проверить как проект работает под виндой.

>>50808
У AWS есть EC2, первый год пользования бесплатно. Только это не хостинг, а VPS, что даёт больше свободы. Нужно привязать данные кредитной карты, откуда снимут 1 доллар для проверки.

>>51448
Использование утилиты make не обязательно, в Makefile просто сокращения для консольных команд, которые можно выполнить и без make.
15617059045170.jpg25 Кб, 300x300
141 1451759
>>46969 (OP)
Подскажите ньюфагу, где можно почитать или посмотреть на проект, идеально было бы пхп-sql-js, где реализовано разделение юзеров на разные сессии и аккаунты, т.е каждый работает в своем аккаунте и сессии. Если там еще будет crud, то я помру от счастья.
143 1451770
>>51769
Спасибо, но я еще во фреймворках понимаю чуть более, чем нихуя. Насколько по сравнению с ванильным пхп там сложнее восприятие кода?
144 1451771
>>51770
Если тебе сделать нужно то намного проще, потому что все готово. Если если разобраться как сделано то все хуево, нужно разгребти кучи магии. С опытом там становится понятно как все работает внутри, но со старта разобраться это пиздец.
145 1451774
>>51771

>если если разобраться как сделано то все хуево, нужно разгребти кучи магии


Зис, к сожалению. Гуглить\копипастить типовые решения я уже хорошо научился и так, но мой вкат сейчас застопорился именно на понимании работы в глубину процесса. Блядь, дошел до стадии, когда надо либо на практике учиться, либо искать наставника, но на работу не берут никуда, требований какой-то вагон, ну а наставники сами уже все заебались.
146 1451777
>>51774
Ну если у тебя есть время, то самый простой способ: ставить себе задачу вроде той, что ты обрисовал, и садиться ее реализовывать. То, что непонятно - гуглишь, и потихоньку по кирпичикам собираешь решение своей задачи и получаешь знания.
Когда я начинал, я умел только верстать и натягивать верстку на MODX - там пэхэпэ вообще не нужен для базовых задач. А потом однажды получил заказ на кастомное решение, и сел писать, при том, что из PHP знал только echo(). В общем, когда я эту задачу решил, я уже знал все основы языка. После ещё нескольких таких задач я разобрался достаточно для того, чтобы сесть за документацию и изучить все нормально.
147 1451841
Сап двощь, я немного не понял по теме бд миграций. Например стоит задача изменить что-то очень важное в архитектуре бд, это изменение ломает например немного кода, но чтобы не ломало надо обойти всю таблицу и что-то апдейтнуть в ней. Как происходит вот этот весь воркфлоу с гитом и миграциями? Я не думаю что будет правильно сразу в файле миграций писать скл код который обходит таблицы и что-то с ними делает, наверное стоит это сделать какой-то консольной командой?
148 1451878
Анинки, изучаю гит, но никак не возьму в толк: я могу клонировать проект с локального компьютера на удаленный сервер, например, сервер провайдера, если там НЕ установлен гит? Тут же просто как бы копирование идет, я же там не буду репозиторий делать. И если на сервере провайдера стоит пароль, мне гит это окошко выведет, или надо в команде прописывать как-нито? Понимаю вопрос детский, но для меня все это вновинку
149 1451884
>>51878
Раз у тебя есть хостинг не проще ли туда задеплоить проект свой через админку или ssh? Гит это не про то, что тобой описано.
150 1451891
>>51884
Я не совсем понимаю конечную процедуру. Вот я доделал проект на локальном комьютере. Раньше я думал, что теперь мне надо сделать клон через гит и отправить его на сервер. Выходит, тут гит мне не поможет, и все тупо копировать вручную? А гит - это просто аз изменениями следить?
151 1451895
>>51891
https://www.youtube.com/watch?v=qGYNbrT9P6Y
Вот, я кажется понял, что ты хотел. Но и про деплой на хостинги посмотри отделано и изучи.
152 1451897
>>51895
Большое спасибо, анончик
153 1451915
>>51841
Тебе понадобилось новое поле в таблице, ты написал в коде вывод этого поля во вьюхе (например) и написал миграцию с добавлением этого поля. Закомитил и отправил в репозиторий. Скрипт делоя увидел новый коммит спулил его и запустил миграцию. Конец истории.
154 1451940
>>51915
Я немного про другое, например я добавил новое поле, но по логике приложения это поле computed из каких-то других полей, и нужно старые записи обновить каким-то масс апдейтом. Я вот и спрашиваю где лучше писать код этого масс апдейта, прямо в файле с миграциями?
155 1451949
>>51940
Логически - да в файле миграций.
Пример: Ты ведешь разработку с кем то в команде, у каждого своя локальная база соответственно. Ты решил привнести свое сложное изменение базы - для других локально надо будет так же только запустить миграцию.
Но есть нюанс если у тебя на бою Большие данные и обработка всей базы по твоим новым правилам не влезет в 10 минут (или сколько там живет cli) то естественно тут будет другое решение.
156 1451955
>>51759
бумп, вопрос еще акутален
157 1452003
>>51955
что то типа такого ?
http://phprbac.net/
158 1452005
Можно ли как-то задать свойство класса с помощью метода? Ну или ещё как-то вынести значение из текста программы в иное место?

Вот код: https://pastebin.com/VYB6rxjP
Там токен = 666666666. Но мне нужно, чтобы этот токен брался вообще не из кода, а из конфига, который в базе (достаётся из неё через getToken() ). Но если написать вместо protected $token = "666666666"; что-то типа protected $token =$this->getToken();, то пхп на меня смотрит очень укоризненно.
159 1452006
>>52005
В конструктор инициализацию полей вынеси, он затем и нужен
160 1452047
Пытался написать, но макак не пропускает, в общем вот мой высер https://pastebin.com/Mf6j8QnR
Суть в чем: тайпскрипт хорошая штука, но меня вымораживает, что любые внешние данные творят что хотят в моих строго типизированных для компиляции скриптах. Пришел null вместо числа? Ну все пизда тебе.
Как?! Как это всё правильно отрабатывать? Где проверять, преобразовывать, надо ли вообще. Как это делается в PHP? Опушка, помоги! SomeApprentice, ты нырнул глубоко в это дерьмо, может сможешь помочь?
161 1452056
>>52006
Там в исходном классе уже есть конструктор (я просто его не показал). И когда вставляю в него $token =$this->getToken();, код не работает. Получается, это у меня где-то там косяк и так и надо было делать?
162 1452070
>>52056

>$token =$this->getToken()


может всё такие $this->token?
или вообще сделай метод initToken() и вызывай его в конструкторе. Если ты наследуешь то не забывай про parent::__construct()
163 1452078
>>52047
Тайпскрипт не занимается валидацией в рантайме и никогда не будет, так как это повлечёт изменение скомпилированного JS. Валидировать пришедшие данные из внешнего мира нужно вручную, однако есть библиотеки, облегчающие эту задачу. Ты описываешь правила валидации, а библиотека выведет TS тип, чтобы в коде не делать 2 раза похожую работу: описывать тип, а потом дублировать его правилами валидации. Примеры:
- https://github.com/pelotom/runtypes#example
- https://medium.com/@ottoki/runtime-type-checking-with-io-ts-in-typescript-14465169fb02

Вот тут на хабре люди рассказывают как борятся с проблемой:
- https://habr.com/ru/post/453502/
- https://habr.com/ru/post/450238/
У нас есть проект, где для рантайм валидации используется typestack/class-validator + typestack/class-transformer. Проблему решает, но код на декораторах получается перегруженным.
164 1452115
>>52005
Если доступ к полю происходит через метод-геттер (в твоем примере aa() ) то просто переопределяешь этот метод в наследуемом классе чтобы он возвращал то что нужно (это одна из причин почему желательно использовать геттеры а не напрямую поля дергать). Если поле используется напрямую $this->token тогда нужно добавлять магии __get https://ideone.com/TPS1f7
165 1452130
>>52070

>может всё такие $this->token?


Да, точно. Вызываю в конструкторе вот так:
$this->token = $this->getToken();
И в тестовом примере оно работает. А вот в коде, который модифицирую - нет. Завтра буду много думать.
166 1452133
>>52115
Спасибо, завтра попробую.
167 1452134
А как написать палиндром для кирилицы? Я понял что использовать функцию strrev() нельзя, но решаю через цикл, mb_substr() тоже хуйню возвращает, нихуя не понимаю, вот код: https://ideone.com/xSGVI4
168 1452137
>>52134
Напиши в 20 строке echo "$symbol1 $symbol2\n"; и посмотри что получается
169 1452160
>>52137
Понял что у меня $symbol1 выводит что нужно, а $symbol2 весь текст так как выборка подстроки от 0 до -1, ну получается надо переписывать это по другому совсем, хули тут это ебка с этими кодировками, в питоне в одну строчку простейшую решается этот палиндром, какой же сложный язык.
170 1452174
>>52160
Вообщем я сделал, но выглядит страшно, мне кажется очень всратое решение, если есть лаконичней и проще, прошу скинуть, вот мой:
https://ideone.com/tmn3Fh
171 1452185
>>52174
Держи. Про utf8 strrev успешно гуглится. http://ideone.com/S7Pzbs
172 1452199
>>52185
Так.. Решил я значит прочитать в учебнике анона про задачу. Написано что земля пухом, если через strrev решать. Поэтому держи другой вариант =) http://ideone.com/PUpD1t
173 1452201
Простите за тупой вопрос, но что означает символ ^ в версии пакета composer?
174 1452237
>>51915

>Скрипт деплоя увидел новый коммит спулил его и запустил миграцию.



А можно об этом чуть подробнее? Что почитать, чтобы разобраться в этой теме?
176 1452284
Знающий анон, подскажи позязя, я должен у каждой функции, класса и метода писать вот такую конструкцию:

мой код
@какая-то штучка

Я понимаю, что это дает подсказки для эклипсов и нетбинов и позволяет проще писать документацию, но это общепринятый стандарт или что? И нужно ли соблюдать табуляцию, чтобы звездочка на второй строчке шла обязательно ниже второй звездочки с первой строки? Или просто две звезды, одна, одна и две?
177 1452286
>>52284
Извините, облажался. Там звездочки и камменты к коду
178 1452291
>>52237

>А можно об этом чуть подробнее? Что почитать, чтобы разобраться в этой теме?



Тут разные варианты.

Например ваш админ повесил на крон скрипт который каждые 10 минут делает
git pull origin develop
php artisan migrate

Или другой вариант через gitlab ci
https://m.habr.com/ru/company/softmart/blog/309380/
179 1452298
>>52284

Это phpDoc (вдохновлен и скопирован с JavaDoc). Это стандарт документирования, который позволяет автоматически парсить комментарии и создавать из них текстовую документацию, ну и как бонус, подсказки в IDE.

Хрень с @ в начале называется аннотация. Это тоже скопированы из Явы. В Симфони аннотации применяются и для других целей, например, задания правил проверок значений в формах.

Описание стандарта:

- кратко - https://ru.wikipedia.org/wiki/PhpDocumentor
- полный мануал со всеми аннотациями на англ: https://docs.phpdoc.org/

Вот какая документация получается на выходе: https://devdocs.io/symfony~2.8/symfony/component/filesystem/filesystem

Только не дублируй в комментариях то, что уже есть в коде. Если у тебя указан тип возврата функции:

function x(): string

То не надо писать в документации второй раз @return string.
180 1452299
>>52298
Благодарю аноний
181 1452457
Привет аноны. Дайте подсказку, что там еще можно написать?
http://ideone.com/FFFpnc#stdin
Уже всё там прочесал, ошибок вроде нет, руководство тоже не помогает да, я тупенький в таких делах
183 1452475
>>52471
Кажется, понял, спасибо. Я в коде указал "как бы очевидное"
184 1452701
Привет, анон. Только вкатываюсь и пытаюсь разобраться.
https://ideone.com/r10PWb
Не могу понять как мне без 3-х инструкций echo сделать адекватный код. Всегда получается через 3 строки, даже если брать обычное умножение переменной на себя.
185 1452718
186 1452726
>>52718
Ага, все дело в точках, которые я вижу впервые. Либо я читал как раздолбай, либо по гайдам еще рано для этого. Но в любом случае, спасибо
187 1452791
>>52726
О, анон с моей проблемой. Думал минут 40 над этим, точек в гайде тоже не видел это который от ОПа. Решил отдохнуть, пока голова остынет
188 1453019
Кто-нибудь из знатоков может своими словами кратенько разжевать новичку, что такое компосер? Я так понимаю, это какая-то линуксовская программа типа гита, которая сидит в папке с дистрибутивом твоего фреймворка, и , при установке, куда-то лезет, забирает последние версии каких-то файлов, обновляет, загружает и вообще доминирует
189 1453042
Как проверить ТИП файла в php?
Не разрешение, мне вообще похуй на его разрешение.
Тип.

Есть какой аналог линухового file?
190 1453059
>>53019
Она есть под любую ось.
Устанавливает пакеты по конфигурации composer.json
Основная идея в указании зависимостей:
Например пакет а версии 1.1 работает только с пакетом б версии 2.3 это указано в конфигурации пакетов по сему композер скачает тебе только совместимые версии.
191 1453190
>>53019

Композер - это менеджер пакетов для PHP-библиотек. Библиотека - это один или несколько PHP-файлов с готовыми функциями, классами, константами, которые ты можешь подключить и использовать в своей программе, чтобы не писать с нуля то, что уже кто-то написал.

Ты создаешь файл composer.json, описываешь в нем названия и примерные версии нужных для работы твоего проекта библиотек. Затем ты запускаешь композер.

Он подбирает совместимые версии библиотек, записывает их в файл composer.lock, скачивает, установливает в папку vendor. Также, если этим библиотекам нужны другие библиотеки (зависимости), он подбирает их версии и тоже устанавливает. Затем он настраивает автозагрузку (автоматическое подключение файлов) для этих библиотек так, что тебе достаточно в своем коде подключить единственный файл (vendor/autoload.php).

Также, ты можешь прописать в composer.json правила автозагрузки для твоего кода, и он сделает автозагрузчик и для него тоже.

Все это можно делать вручную, но уйдет больше времени. Представь, если у тебя подключено 20-30 библиотек. Также, обновление потребует кучу времени, ведь тебе надо проверить их вручную для каждой библиотеки.

Композер работает в командной строке, потому, чтобы им пользоваться, надо сначала освоить её. У меня есть урок для начинающих: https://github.com/codedokode/pasta/blob/master/soft/cli.md
192 1453241
>>53190
>>53059
Как все умно сделано-то, спасибо, аноны
193 1453267
>>53241
Не умно. Если в пакете A зависимость от пакета B с версией 1.0.0, тогда установив пакет A ты хуй установишь пакет B другой версии
194 1453276
>>52199
О вот за это спасибо, очень красивое решение.
195 1453277
Котаны, вопрос с .htaccess

Делаю тупейшую вещь, просто ридерекчу любой запрос на один конкретный php-файл. Сервер - openserver.
Такое правило
RewriteEngine On
RewriteRule ^.$ /public/test.php приводит к ошибке 500
а такое
RewriteRule ^[a-z0-9]
$ /public/test.php редиректит на test.php который и запускается.
Почему так?
196 1453278
>>53277
бля, звездочки сожрались
198 1453291
>>53285
>>53277
а если точку в квадратные скобочки засунуть?
200 1453296
>>53277

Надо смотреть лог ошибок вебсервера (если под виндой, то в папке Апача logs, если в Линуксе. то /var/log/httpd или /var/log/apache2).

Под линусом для чтения файла надо быть админом или входить в группу adm.

Посмотри лог и поищи там ошибки, заодно нам расскажешь, в чем была проблема.
201 1453317
Пилю лайфхак, посаны.

Зачастую бывают такие участки кода:
if (\file_exists($mediafile)) {
unlink($mediafile);
}

Можно писать их в одну строку гораздо короче:
\file_exists($mediafile) && unlink($mediafile);

Охуенная тема, примерно как с аннигиляцией скобочек с помощью return;
202 1453318
>>53291
Если точку обернуть в квадратные скобки то перестает падать в ошибку 500.
Но
Из корня редиректит на нужный файл. Но стоит добавить хоть один символ и пишет ошибку "Объект не найден".

>>53296
На этой же версии опенсервера у меня крутится по кускам содранный из разных мест фреймворк
https://ideone.com/LK3A5l
и там все работает
Я решил получше разобраться в .htaccess и сразу обосрался
203 1453325
>>53318
пс
а если такое правило написать :
RewriteRule ^([a-zA-Z0-9/-]"тут звездочка")$ /public/test.php?id=$1 - то норм редиректит и $_GET заполняет
15354457200090.png698 Кб, 540x720
204 1453367
>>53318

>2020


>.htaccess

205 1453413
>>53367
Что то более чущественное сказать можешь?
на Апаче 70% вэбсерверов. Остальные 30 это ngnix.
15654764142170.jpg7 Кб, 480x360
206 1453528
Как правильно подключать библиотеки без поддержки пространства имён? И где именно - при инициализации приложения, или прямо в конструктор класса-оболочки его подключить?
И что за мода у некоторых разработчиков этих библиотек делать классы через статик?
207 1453551
>>53019
Композер это годнота, базарю. Один раз попробуешь - больше не сможешь без него.
208 1453558
Млп
209 1453615
ПАМАГИТИ111 Решил научиться PHP. изначально юзал онлайн редакторы - все получалось нормально. А теперь решил попробовать тоже самое в phpstorm. Все сделал по феншую скачал php 7 к нему соответствующий дебагер. Прописал в переменные срады место где лежит php. В php.ini добавил следующие строчки
zend_extension = C:\php\ext\php_xdebug-2.7.2-7.3-vc15-x86_64.dll
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.profiler_enable=1
xdebug.profiler_output_dir="c:\php\tmp"
extension=php_mbstring.dll
Итог! Половина задач работает нормально, половина 502 Bad Gateway, хотя в самом phpstorm в консоли снизу ни одного замечания и решение выдается так как и нужно. Причем если задачи раскидать по файлам аля одна задача один файл - работать начинает практически все шо не работало за исключением некоторых, но у меня то все в одном файлике лежит одна задача под другой. Вроде бы разницы не должно быть, но нет. Вопрос ШО ЗА НАХ?!??!?! КАК ИСПРАИТЬ?!?!!?!?1
210 1453616
>>53267
В этом весь смысл дурилка
211 1453649
>>53616
Например мне надо поставить пакет A и B. Оба зависят от пакета С, но разных версий. Из-за этого я не смогу одновременно поставить A и B.

Это специально сделано?
212 1453656
Скажите, а как в апаче запретить доступ ко всем каталогам, кроме public?
213 1453745
>>53656
Я просто посылаю все реквесты в \public\index.php
214 1453859
>>53745
то есть в .htaccesse правилами не отсеиваешь файлы и папки.
А как тогда подгружаются стили и прочее барахло из public?
215 1453867
>>53615
Не занимайся херней. Пиши на Sublime Text 3 и запускай локалку на OpenServer.
https://www.sublimetext.com/3
https://ospanel.io/
216 1454021
>>53649
Ты вьелся в частный случай. Хочешь пакет каждый в свою среду окружения и тд и все это ради одного частного случая. Цель именно в строгости зависимости а ты хочешь все усложнить
image.png124 Кб, 416x226
217 1454104
Этот опен сервер пойдет для создания локалки?
pepereee.jpg137 Кб, 900x900
218 1454117
>>54104
ОН ДЛЯ ЭТОГО И СОЗДАННН!!!!
219 1454129
>>54117
Мало-ли какой-то другой получше есть
220 1454210
Объясните мне как решить проблему при выводе символа строки через квадратные скобки, если строка написана кирилицей, кодировка слетает и выводит какую-то хуйню, вот пример: https://ideone.com/wMhDPb
221 1454243
>>54210
Квадратные скобки выводят байт, а не символ. Из-за этого возникает проблема, потому что utf это многобайтовая кодировка. Используй mb_substr()
222 1454251
>>54243
Спасибо, теперь разобрался.
223 1454278
>>54129
Есть xampp
224 1454313
>>54278
Много ли профита от разных опенсерверов?

Вкину еще гайд хороший. Предлагаю в шапку добавить на перекатном
https://www.youtube.com/watch?v=a6xtQQqx1tg
(У него еще 2 части-продолжения есть)
225 1454326
Возникла такая проблема - в админке сайта нужно сделать загрузку больших файлов (>100 мб).

Я с помощью js разбиваю файл на части по 5мб (chunks), а потом собираю их все вместе уже на сервере. У меня возникла проблема с авторизацией. Доступ к загрузчику файлов должен быть только у админа, поэтому перед загрузкой каждой части я проверяю куки пользователя и делаю запрос в бд перед отправкой файла, чтобы убедиться, что загрузку осуществляет админ.

Это нормальное решение в плане нагрузки на сервер? Меня очень смущает, что на каждую часть файла приходится sql запрос, можно как-то иначе решить этот вопрос? Как можно осуществить контроль к загрузчику без использования sql каждый раз? надеюсь понятно расписал
226 1454365
>>54326
Возьми tus как готовое решение загрузки файлов по частям. Каждый блок там подписан хэшем. Так что кинешь проверку кук только на самый первый запрос загрузки дальше у тебя в очередь кусков уже никто не сможет влезть так что можно не проверять
image.png35 Кб, 873x395
227 1454368
Привет, аноны.
На пикриле и задал значение Джонни синтаксу нейм.
Далее по условиям понятно, что если имя равно Пидар, то выводится хуидар и т.д. Почему вывелся хуидар, если имя не Пидор?
228 1454370
>>54368
На пикриле я задал*
Быстрофикс
229 1454371
>>54370
У тебя присвоение а не сравнение
230 1454373
>>54371
Всё, понял, спасибо
до сих пор даже через раз точку запятую пропускаю
231 1454376
>>54373
Поставь phpmd глобально и пакет для sublime соответствующий. Он будет тебе подсвечивать такие косяки
232 1454383
>>54376

>Поставь phpmd глобально и пакет для sublime соответствующий


Что за зверь такой и где искать?
234 1454390
>>54387
Спасибо!
А что насчет пакета для саблайм?
235 1454415
>>54313
Толсто.
236 1454419
>>54376

>phpmd


Полезно.
237 1454424
>>54415
Но ведь я не толстил
238 1454429
>>54424
Когда более-менее разберёшься, то поймёшь, что этих ютубных хайпожоров лучше обходить стороной, а их уроки и подавно - это не программисты.
239 1454432
>>54429
Понял. Ну, я не разобрался еще хорошо в этой теме, смотрю, т.к. более-менее рассасывает всё. Со мной ничего не случится плохого?
240 1454437
>>54432
Да смотри что хочешь, только другим не рекомендуй ничего, тем более если мало опыта.

>Со мной ничего не случится плохого?


Ничего. Там же совсем ясли показывают.
Но я бы поискал что-то менее гнилое.
241 1454438
>>54437

>Но я бы поискал что-то менее гнилое


Ты использовал какие-то видео-уроки сам?
242 1454444
>>54438
Поначалу вполне норм, но потом слишком медленно уже - читать быстрее. Сейчас только статьи всякие читаю интересные да доки посматриваю.
243 1454451
>>54444
Понял
image.png31 Кб, 511x480
244 1454473
Анончики, как подключить эту хрень?
245 1454482
>>54473
Я нагуглил. Если кто-то не знает пароль от этого, то просто в логине пишите root и можно логиниться
247 1454486
>>54483
Пасиба
248 1454601
>>53317
@unlink($mediafile) еще проще
249 1454616
>>54313
Сальный в треде
250 1454631
Анончики, объясните, пожалуйста, где в задаче про список абитуриентов нужно использовать класс Абитуриент?

Вот получаю я информацию из БД, мне нужно её занести в массив экземпляров класса и потом уже передавать в контроллер?
Аналогично и с внесение данных в БД?

Зачем нужен класс Абитуриент, если можно сразу использовать данные полученные в классе таблицы?
251 1454671
>>54631
Ты можешь из бд сразу экземпляры класса получать, это очень удобно. Гугли pdo fetch class
252 1454677
Пытаюсь загрузить файл на telegra.ph/upload через curl, ошибка то Failure when receiving data from the peer, то SSL connect error.
Попробовал на imgur грузить - без проблем, любые страницы (и сам файл) получаю тоже. А на телеграфе проблема. Что делать?
253 1454727
>>54313
>Учим PHP за 1 час
@
Видео идёт полтора
254 1454746
>>54727
Не, там почти 4 выходит
255 1454814
>>54677

Тебе надо разобраться, в чем может быть проблема. Цепочка тут довольно сложная: твоя программа использует расширение php_curl, а это расширение является прокладкой между php и сишной библиотекой curl (файл libcurl.dll или libcurl.so).

Соответственно, один из способов диагностировать проблему - это попробовать отправить тот же запрос утилитой командной строки curl, которая обычно идет в комплекте с библиотекой curl. У утилиты есть флаг -v, который заставляет ее писать подробности, например, вот команда для выполнения GET запроса:

curl -v https://example.com

Она выводит в том числе подробности установки зашифрованного SSL-соединения, и этап, на котором произошла ошибка.

Если ты используешь Линукс, то утилита curl может быть уже установлена, или ее надо будет установить менеджером пакетов. Если WIndows, то она скорее всего есть в том архиве, в котором была библиотека libcurl.dll.

Также, попробуй открыть https://telegra.ph из браузера - если он не открывается, то возможно, поработал Роскомнадзор, можешь обратиться к ним за решением.

Если сайт открывается в браузере, с большой вероятностью дело в том, что библиотека curl не содержит корневого сертификата для проверки сертификата telegra.ph. Некоторые в таких случаях отключают проверку сертификатов, но гораздо правильнее скачать/установить набор корневых сертификатов и в опциях curl в твоей программе указать путь к ним. В композере, например, есть библиотека https://packagist.org/packages/composer/ca-bundle которая автоматически скачивает набор сертификатов от Мозиллы, а в ридми написано, как ее подключить.

Ты мог бы тут заметить, что в той же Windows уже есть корневые сертификаты, почему curl их не использует? В мануале написано, что для этого нужна сборка curl с поддержкой библиотеки schannel: https://curl.haxx.se/docs/sslcerts.html
256 1454823
>>54601
Он не про это вовсе
257 1454970
как сука убрать из формы старые запросы?чтобы при перезагр страницы их там не было
258 1454989
>>54814

>библиотека https://packagist.org/packages/composer/ca-bundle


Установил, подключил, результат тот же.

>Роскомнадзор


Прокси есть.
api.telegra.ph и api.telegram.org открываются. telegram.org/ открывается, telegra.ph/ - SSL ошибка.

>Некоторые в таких случаях отключают проверку сертификатов


CURLOPT_SSL_VERIFYPEER, 0 cтавил - всё равно Failure when receiving data from the peer или SSL connect error. Откуда вообще SSL error, если я отключил проверку? Снова пробовал telegram.org/ и telegra.ph/ открывать - всё так же.

>используешь Линукс


Винда.

Что делать дальше, мастер? Думал на imgur перейти, разобрался с api, а там, оказывается, ограничение на кол-во загрузок.
259 1455005
>>54970
Не нажимай кнопку назад. Можешь сделать редирект =)
260 1455009
>>55005
а нет к-л скрипта чтобы чистил?
261 1455010
>>54989

Нужно проверять утилитой curl. Как ты устанавливал библиотеку curl? Если скачивал какой-то архив, то там наверняка есть утилита curl.exe. Ее надо поместить в одну папку с libcurl.dll и выполнить команду

curl -v https://telegra.ph/

Вот гайд по использованию консоли: https://github.com/codedokode/pasta/blob/master/soft/cli.md

Также, в PHP можно попробовать включить опцию для отладки:

curl_setopt($curlhandle, CURLOPT_VERBOSE, true);

Она пишет данные в поток ошибок (stderr), потому PHP скрипт надо запускать из консоли (командой вроде php myscript.php), а не через веб-сервер. Если запускать из-под веб-сервера, это либо пойдет в лог ошибок, либо неизвестно куда.

Если вдруг она ничего не выведет, то ты можешь попробовать перенаправить отладочную информацию в файл:

$verbose = fopen('c:/tmp/debug.txt', 'w+');
curl_setopt($handle, CURLOPT_STDERR, $verbose);

В общем, сделай минимальный PHP скрипт, который содержит только единственный запрос к серверу. И включи в нем опции для отладки, запусти его из консоли и посмотри, что получится.
262 1455011
Есть пхп господа из столиц? Подскажите, по работе для новичков все ок или уже не очень?
263 1455013
>>55009
Это же браузер сохраняет. Погуглил - решается редиректом. Там чел еще ссылку приложил - https://en.wikipedia.org/wiki/Post/Redirect/Get
264 1455016
>>55013
а если так?
<input type="reset" value="Сбросить">
265 1455017
>>55016
Я тебе дал всю инфу, остальное уже ты проверяй пока не получится =) И эта кнопка тебя не спасет от сохраненных данных при обновлении. На неё же еще нажать надо.
266 1455024
>>54989

Дополню еще. Если ты никак не можешь найти curl.exe (что плохо), просто скачай архив отсюда https://curl.haxx.se/windows/ , распакуй в отдельную папку, зайди в нее из консоли и запускай curl.exe из нее.

Если ты хочешь заставить курл использовать прокси, добавь опцию -proxy, например:

curl.exe -v -proxy http://1.2.3.4:12345 https://telegra.ph

Если что, полный список опций доступен при выполнении curl --help, или описан тут: https://curl.haxx.se/docs/manpage.html

Возможно, что курл не выведет особых подробностей, а просто напишет что не удалось установить SSL-соединение. Тогда нам нужен инструмент для тестирования SSL соединений, он тебе может пригодиться и в других случаях. Иди сюда https://indy.fulgan.com/SSL/ и скачай там один из архивов, например, openssl-1.0.2s-i386-win32.zip

Раскакуй его в новую папку, зайди в нее из консоли. Далее набери команду тестирования SSL соединения:

openssl.exe s_client -debug -connect telegra.ph:443

Заметь, что openssl просто проверяет установку SSL соединения, он не будет слать HTTP запрос. Если соединение успешно установилось, то набери что-нибудь, например,

GET / HTTP/1.0 (Enter)
Host: telegra.ph (Enter)
(Enter)
(Ctrl + Z, Enter чтобы завершить ввод)

Если что-то непонятно, то скидывай, что выведут эти утилиты. Увы, openssl прокси не использует.
267 1455027
>>54970

Что ты имеешь в виду? Данные, введенные в форму, снова показывают после перезагрузки страницы? Или при вводе появляется список с ранее введенными данными?

Также, в любом случае тебе надо использовать паттерн Post/Redirect/Get. Про этот паттерн и другие вещи я написал в уроке про обработку данных форм: https://github.com/codedokode/pasta/blob/master/forms.md
268 1455029
>>55027
и то и другое
269 1455061
Анон, хватит себя мучать. Иди плати денежку на Хекслет и ищи норм работу.
Я устроился на 35к, щас 55 (полгода опыта)
270 1455063
extension=php_openssl.dll в php.ini включено.
>>55024
Вот вывод после как я понял авторизации проксей.
И вывод openssl s_client -connect telegra.ph:443 -msg

>>55010
Тут немного иначе:

successfully set certificate verify locations:
CAfile: D:\------------------\composer\ca-bundle\src/../res/cacert.pem
CApath: none
Unknown SSL protocol error in connection to telegra.ph:443
Curl_http_done: called premature == 1
* Closing connection 0
271 1455070
>>55061
Иди-ка ты нахуй со своими курсами.
272 1455073
>>55063

Скорее всего дело в РКН. Вот как у меня выглядит соединение без VPN:

wine /d/tmp/openssl.exe s_client -debug -connect telegra.ph:443

CONNECTED(00000048)
write to 0x4afff0 [0x4b0778] (307 bytes => 307 (0x133))
0000 - 16 03 01 01 2e 01 00 01-2a 03 03 cc 01 5a f5 0d ........*....Z..
....
read from 0x4afff0 [0x4b5cd8] (7 bytes => 7 (0x7))
0000 - 48 54 54 50 2f 31 2e HTTP/1.
9:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:.\ssl\s23_clnt.c:827:

Видно, что в ответ на HTTPS соединение вместо блока ServerHello приходит кусок HTTP-данных (скорее всего редирект на заглушку), то есть соединение перехватывается.

А с VPN - соединение устанавливается.

У тебя curl успевает отправить один пакет (ClientHello), после чего получает, что соединение было закрыто. Тут может быть несколько причин:

- серверу telegra.ph ты не нравишься и он тебя банит (хотя тогда он бы наверно не давал даже установить соединение)
- прокси прочитал твой пакет ClientHello и решил закрыть соединение
- DPI прочитал пакет ClientHello и решил закрыть соединение

То, что соединение сначала устанавливается и дается возможность отправить ClientHello, указывает на то, что вероятнее всего 2 или 3 вариант. Если банят, то обычно не дают даже соединиться с сервером.

На дампе видны байты 74 65 6C 65. Это коды символов "tele" (таблица http://www.asciitable.com/ ), у тебя в пакете ClientHello указано имя telegra.ph (видимо это поле SNI - Server name indication), и это позволяет блокировать соединение. Надо переходить на TLS1.3 и ESNI, где имя сервера шифруется. Правда, для ESNI нужна поддержка со стороны сервера.

Что касается прокси - если это HTTP-прокси, то в нем обмен идет в открытом виде (примеры есть тут https://stackoverflow.com/questions/7577917/how-does-a-http-proxy-utilize-the-http-protocol-a-proxy-rfc). Клиент посылает к прокси HTTP-запрос вроде CONNECT 1.2.3.4:1234 или даже CONNECT telegra.ph:1234 и DPI может его перехватить, как и пересылаемый через прокси пакет ClientHello.

Ты можешь попробовать соединиться с другим сервером, например, https://example.com, и увидишь, как должен выглядеть трафик при успешном соединении.

Вообще, я тут вспомнил, что есть более удобное средство просмотра трафика - wireshark. Его освоить тоже полезно на случай анализа каких-то сетевых проблем. Он дампит весь трафик с сетевой карты и представляет его в удобном разноцветном виде. Это уже не консольная, а GUI программа. Правда, кроме нужного тебе трафика там будет еще куча мусора от других программ и соседей по локалке.

Отфильтровать лишний трафик можно, указав фильтр, вроде такого ip.addr == 1.2.3.4 (адрес прокси), про фильтры написано тут: https://wiki.wireshark.org/DisplayFilters

Также, DPI может перехватывать твои DNS запросы, когда ты делаешь запрос на разрешение адреса telegra.ph, он может подменять ответ и присылать IP сервера-заглушки (в твоем случае это не происходит, IP правильный).

Если я прав, то Wireshark должен тебе показать, как твоя программа соединяется с прокси, как она щлет запрос CONNECT, и что в ответ присылает DPI. Можешь глянуть, если интересно. Ты можешь так убедиться, что моя версия правильная и проблема не в твоем коде, а в сетевых проблемах.
272 1455073
>>55063

Скорее всего дело в РКН. Вот как у меня выглядит соединение без VPN:

wine /d/tmp/openssl.exe s_client -debug -connect telegra.ph:443

CONNECTED(00000048)
write to 0x4afff0 [0x4b0778] (307 bytes => 307 (0x133))
0000 - 16 03 01 01 2e 01 00 01-2a 03 03 cc 01 5a f5 0d ........*....Z..
....
read from 0x4afff0 [0x4b5cd8] (7 bytes => 7 (0x7))
0000 - 48 54 54 50 2f 31 2e HTTP/1.
9:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:.\ssl\s23_clnt.c:827:

Видно, что в ответ на HTTPS соединение вместо блока ServerHello приходит кусок HTTP-данных (скорее всего редирект на заглушку), то есть соединение перехватывается.

А с VPN - соединение устанавливается.

У тебя curl успевает отправить один пакет (ClientHello), после чего получает, что соединение было закрыто. Тут может быть несколько причин:

- серверу telegra.ph ты не нравишься и он тебя банит (хотя тогда он бы наверно не давал даже установить соединение)
- прокси прочитал твой пакет ClientHello и решил закрыть соединение
- DPI прочитал пакет ClientHello и решил закрыть соединение

То, что соединение сначала устанавливается и дается возможность отправить ClientHello, указывает на то, что вероятнее всего 2 или 3 вариант. Если банят, то обычно не дают даже соединиться с сервером.

На дампе видны байты 74 65 6C 65. Это коды символов "tele" (таблица http://www.asciitable.com/ ), у тебя в пакете ClientHello указано имя telegra.ph (видимо это поле SNI - Server name indication), и это позволяет блокировать соединение. Надо переходить на TLS1.3 и ESNI, где имя сервера шифруется. Правда, для ESNI нужна поддержка со стороны сервера.

Что касается прокси - если это HTTP-прокси, то в нем обмен идет в открытом виде (примеры есть тут https://stackoverflow.com/questions/7577917/how-does-a-http-proxy-utilize-the-http-protocol-a-proxy-rfc). Клиент посылает к прокси HTTP-запрос вроде CONNECT 1.2.3.4:1234 или даже CONNECT telegra.ph:1234 и DPI может его перехватить, как и пересылаемый через прокси пакет ClientHello.

Ты можешь попробовать соединиться с другим сервером, например, https://example.com, и увидишь, как должен выглядеть трафик при успешном соединении.

Вообще, я тут вспомнил, что есть более удобное средство просмотра трафика - wireshark. Его освоить тоже полезно на случай анализа каких-то сетевых проблем. Он дампит весь трафик с сетевой карты и представляет его в удобном разноцветном виде. Это уже не консольная, а GUI программа. Правда, кроме нужного тебе трафика там будет еще куча мусора от других программ и соседей по локалке.

Отфильтровать лишний трафик можно, указав фильтр, вроде такого ip.addr == 1.2.3.4 (адрес прокси), про фильтры написано тут: https://wiki.wireshark.org/DisplayFilters

Также, DPI может перехватывать твои DNS запросы, когда ты делаешь запрос на разрешение адреса telegra.ph, он может подменять ответ и присылать IP сервера-заглушки (в твоем случае это не происходит, IP правильный).

Если я прав, то Wireshark должен тебе показать, как твоя программа соединяется с прокси, как она щлет запрос CONNECT, и что в ответ присылает DPI. Можешь глянуть, если интересно. Ты можешь так убедиться, что моя версия правильная и проблема не в твоем коде, а в сетевых проблемах.
273 1455078
>>55061

У нас посты про этот сайт появляются почти в каждом треде:

https://phpclub.tech/search/?q=hexlet
https://phpclub.tech/search/?q=хекслет

Появляются сомнения, а так ли эти курсы хороши или же их пишут в расчете на вознаграждение?
274 1455079
>>55070
Ну давай, осиливай свои регулярочки еще полгода. А потом на завод иди
275 1455080
>>55078
Если появляются, зарегистрируйся, пройди бесплатные уроки. Я же не кидаю реф. ссылку, а делюсь годнотой.
Screenshot9.jpg126 Кб, 967x230
276 1455082
>>55073

>Скорее всего дело в РКН.


Но почему любые другие заблокированные сайты открываются без проблем? Через эти же прокси. Вот сейчас для теста рутрекер открыл.

>Wireshark


Понятнее не становится.
Попробовал установить curl_setopt($curl, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1_3'); - Wireshark всё еще показывает соединение по TLSv1. Открыл опять рутрекер - там уже TLSv1.2. Кажется, ничего не меняется от этой опции.
277 1455090
>>55079
Зачем ты платишь за бесплатную информацию?
278 1455094
>>55082
Попробовал через бесплатные прокси коннектиться к заблокированным сайтам - все редиректит на сайт провайдера. Хм.
279 1455095
>>55094
А вот через socks5 прокси получается. Какой вывод делать-то? Мой провайдер настроил DPI исключительно на telegra.ph?
280 1455099
Перенастроил прокси на socks5, опять коннектится ко всему, кроме телеграфа. Может, дело реально в проксе?
Попробовал зайти через браузер, использую эту проксю. Не заходит. Блядь, а я еще и деньги за неё платил, чтобы получать вот это вот.

Спасибо, ОП! Без тебя бы не справился.
281 1455114
>>55082

В Wireshark ты можешь нажать на пакет, и внизу будет выведено его содержимое. У тебя явно видно, что происходит:

- программа устанавливает TCP-соединение с HTTP-прокси (пакеты SYN/ACK)
- программа шлет запрос CONNECT, прося прокси соединиться с сервером, сервер отвечает 200 Ok
- программа шлет пакет ClientHello для установки соединения
- приходит в ответ TCP-пакет ACK (подтверждение), а затем FIN (закрытие соединения)

Следовательно это либо прокси (но странно что он отправил 200 Ok), либо DPI работает. Причем заметь, что для DPI тут нет разницы, используешь ты прокси или нет, так как в любом случае пакет ClientHello шлется одинаковый.

Что касается браузера - браузер и рутрекер могут использовать другие протоколы. Например. может они используют TLS1.3 и ESNI, что позволяет скрыть имя сервера. Или какой-то трюк для обхода блокировки, а telegra.ph не использует это.

TLS1.3 должен поддерживаться с обоих сторон, для ESNI тоже нужна поддержка с обоих сторон.

> А вот через socks5 прокси получается. Какой вывод делать-то?



А ты посмотри трафик. В socks5 по идее нет шифрования.

Тебе нужен либо VPN, либо прокси, к которому ты подключаешься по HTTPS.
282 1455121
>>55099

Это можно попробовать понять по характеристикам пакетов. Например, если прокси далеко от тебя, то пакет от DPI придет гораздо быстрее. Также, можно попробовать посмотреть поля IP-протокола вроде TTL. TTL - это время жизни пакета, при проходе через маршрутизатор оно уменьшается на один. И пакеты от DPI и от прокси будут иметь ращный TTL (хотя DPI может подделать TTL, но с большой вероятностью провайдеру лень этим заниматься).

То есть попробуй в WireShark посмотреть содержимое пакетов, точное время их прихода, и разные заголовки IP/TCP - есть ли там какие-то различия между первым пакетом SYN от прокси, пакетом с 200 Ok от прокси и пакетом с FIN.

Можешь также сюда запостить их содержимое из WireShark.

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

Но в общем тебе нужен если и прокси, то не HTTP, а HTTPS, к которому ты подключаешься по SSL, с шифрованием. Иначе он ничего не скрывает.
Screenshot10.jpg69 Кб, 554x343
283 1455130
>>55114
Но прокси вроде https. Вон, зашифровано же, нет? Я в это разбираюсь еще меньше, чем во всем остальном.
284 1455131
>>55078
Все курсы на торрентах есть.

>>55079
Лучше вам заплатить, чтобы вы про эти регулярочки пропердели в микрофон, да? А потом - иди нахуй. Вся суть этих курсов.
285 1455140
>>55131
Ну если ты такой умный и прошел все курсы мира на торрентах, то покажи свой охуенный код на гитхабе
286 1455144
>>55140

>прошел все курсы мира


Нахрен мне все курсы мира проходить?
Но да - я учился по курсам с торрентов. Поначалу. Потом уже самому пора уметь.

>покажи свой охуенный код


Зачем?
287 1455151
>>55144
Чтобы сэкономить время людей, которые хотят войтивайти самым безболезненным способом (через Хекслет).
Ведь если ты макакер уровня подписчиков Марлина, то тебе нельзя верить
288 1455156
>>55151

>войтивайти самым безболезненным способом


Заплатив вам за ваши говнокурсы, делающие говокодеров.
Если нет технического бэкграунда и мозгов, то никакие курсы не помогут, а тем у кого это всё есть - никакие курсы не нужны.

>если ты макакер уровня


А ты что за хуй важный чтобы мой уровень оценивать?
289 1455158
>>55156
>>55151
Хватит ругаться, джуниоры, не позорьте себя перед префессионалами.
Мимо-5-пет-проектов-на-штмл
290 1455197
>>55130

Протоколы, конечно, стоило бы тоже немного подучить.

Протокол IP - он определяет понятия вроде IP-адресов и передачу пакетов через промежуточные узлы-маршрутизации. В википедии есть формат IP-пакета
В IP пакет мы кладем в качестве нагрузки TCP-пакет. Этот протокол добавляет номера портов для различения приложений, повторную отправку при ошибке и понятие "соединения" с процессом установки и разрыва.

HTTP протокол - работает поверх TCP в открытом виде. HTTPS - это HTTP внутри SSL-канала. То сеть клиент делает TCP-соединение, поверх него устанавливает SSL/TLS соединение (там клиент и сервер обмениваются списком поддерживаемых шифров, генерируют ключи, проверяют сертификаты друг друга и наконец устанавливают зашифрованный канал).

У тебя HTTP-прокси. Ты по протоколу HTTP (в отрытую) соединяешься с прокси, шлешь ему в открытую запрос CONNECT с открытым именем сервера и портом, он устанавливает TCP-соединение с запрошенным сервером и ты шлешь по нему что хочешь (в данном случае - пакеты SSL, внутри которых спрятан HTTP).

Так как прокси использует HTTP, данные передаются в открытом виде и начальный SSL-пакет ClientHello, содержащий имя сервера telegraph, передается в открытую. Так как на этом этапе SSL-канал еще не установлен. На твоем дампе это имя сервера видно.

Тебе надо HTTPS-прокси, то есть прокси, к которому ты подключаешься по HTTPS (SSL), делаешь не видимый снаружи запрос CONNECT, и внутри SSL-канала устанавливаешь второе SSL-соединение к telegraph.
291 1455252
Привет, ОП, я когда-то делал твои задачи по вёрстке, на работе пишу бекенд, но внезапно понравилось верстать, возникли вопросы по которым очень интересно твоё мнение:
- Какой смысл в семантических тегах (section, article, menu) для закрытых SPA, которые не будут индексироваться? Почему иногда в статьях по-прежнему используют ul/li для меню, а потом перекрывают дефолтные padding/margin у этих тегов, вместо того, чтобы просто сверстать на div/span и flexbox? Вёрстка проще, поддержку IE просят очень редко.
- Для ретины рекомендуется использовать изображения с более высоким расширением. Я не очень понимаю как это работает на уровне железа. Что значит "повышенная плотность пикселей". Если на ретине с разрешением 1920x1200 и обычном дисплее 1920x1200 открыть одну и ту же картинку, то она будет отображена одинаково? Как-то можно эмулировать ретину на обычном дисплее, чтобы видеть вёрстку на маке, не имея мака?
- Что порекомендуешь для pixel perfect вёрстки, может есть расширения для браузера или удобные линейки под линукс?
292 1455459
>>53413

>2020


>Apache


Апач это лютый депрекейт. Годится только для локалки - течёт по памяти пиздец.

>>53528
Фу блядь, фу нахуй. Используй неймспейсы и не еби себе мозги.
293 1455466
доброй ночи
есть задача, исходные:
знаю базовые вещи вроде html, css, javascript, sql, ооп, очень поверхностно mvс, на php писал скрипты к всяким вордпрессам и джумлам и ковырялся в плагинах
собственно нужно сделать что-то вроде облачного хранилища фоток: юзеры грузят фотки на сервер, в личном кабинете могут просматривать их, создавать "альбомы" и раскидывать по ним фотки, делиться ссылкой с кем-попало или давать доступ к альбомам другим юзерам
стоит ли с такой задачей влезать в php фреймворки (если да, то какой?) или проще лепить код самому? быстрее ли будет разобраться с функционалом фреймворка или же писать и собирать phpные куски?
в приоритете время разработки, защищенность и правильная архитектура не интересует
294 1455471
>>55252

> Какой смысл в семантических тегах (section, article, menu)



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

Точный смысл тегов и примеры использования ты можешь прочесть в стандарте HTML.

> Почему иногда в статьях по-прежнему используют ul/li для меню,



Потому что в HTML4 не было тега menu, а список вполне подходит.

> а потом перекрывают дефолтные padding/margin у этих тегов



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

> Что значит "повышенная плотность пикселей".



Плотность пикселей = число пикселей поделить на ширину экрана в дюймах. Типичная плотность обычного монитора - это порядка 72-96 DPI (точек на дюйм). Это очень крупные пиксели, например, я на своем экране, приблизившись, вижу сетку между пикселями. Из-за крупных пикселей изображение с мелкими детялями, например, текст, смотрится размытым или искаженным.

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

Ретина - это двойная плотность пикселей, в смартфонах бывают и экраны с тройной плотностью в сравнении с классическим монитором.

Если мы на экран с 2-й плотностью пикселей попробуем вывести обычный HTML документ, то он будет слишком мелкий, в 2 раза мельче привычного. Потому браузеры делают адаптацию таким образом: один CSS-пиксель занимает 2 реальных пикселя. Квадрат с width: 50px занимает 100 реальных пикселей, текст размером 16px рендерится высотой в 32 пикселя. То есть по сути браузер ставит масштаб 200% для такого экрана.

Если мы на таком сайте используем картинку размером 300x300, то браузер тоже ее увеличит до 600x600, при этом картинка будет слегка размытой, так как в ней нет лишних пикселей и браузеру приходится их получать интерполяцией (взятием среднего). Пользователь, привыкший к тонким четким линиям букв, будет разочарован "мыльностью" картинки.

(еще одна проблема таких экранов - так как на них в 4 раза больше пикселей, нужна более мощная видеокарта)

Чтобы решить эту проблему, ты можешь поставить на сайт картинку 600x600, но задать ей размер для вывода как 300x300:

<img width="300" height="300" src="image600x600.jpeg">

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

https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images

Разумеется, варианты картинок надо как-то автоматически генерировать, а также хранить информацию о них в БД, чтобы не сканировать диск при выводе страницы.

> нием 1920x1200 и обычном дисплее 1920x1200 открыть одну и ту же картинку, то она будет отображена одинаково? Как-то можно эмулировать ретину на обычном дисплее, чтобы видеть вёрстку на маке, не имея мака?



Можно попробовать сделать масштаб 200%. Тогда ты увидишь то же, что владелец Мака, приблизивший лицо к экрану.

В Firefox (и наверно в Хроме) в инструментах разработчика есть опции для имитации другой плотности пикселей: https://developer.mozilla.org/en-US/docs/Tools/Responsive_Design_Mode

Также, если у тебя есть смартфон с большим разрешением, можно смотреть на нем.

> Что порекомендуешь для pixel perfect вёрстки, может есть расширения для браузера или удобные линейки под линукс?



Не знаю, есть какие-то расширения, которые позволяют поверх сайта наложить полупрозрачную картинку-образец.
294 1455471
>>55252

> Какой смысл в семантических тегах (section, article, menu)



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

Точный смысл тегов и примеры использования ты можешь прочесть в стандарте HTML.

> Почему иногда в статьях по-прежнему используют ul/li для меню,



Потому что в HTML4 не было тега menu, а список вполне подходит.

> а потом перекрывают дефолтные padding/margin у этих тегов



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

> Что значит "повышенная плотность пикселей".



Плотность пикселей = число пикселей поделить на ширину экрана в дюймах. Типичная плотность обычного монитора - это порядка 72-96 DPI (точек на дюйм). Это очень крупные пиксели, например, я на своем экране, приблизившись, вижу сетку между пикселями. Из-за крупных пикселей изображение с мелкими детялями, например, текст, смотрится размытым или искаженным.

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

Ретина - это двойная плотность пикселей, в смартфонах бывают и экраны с тройной плотностью в сравнении с классическим монитором.

Если мы на экран с 2-й плотностью пикселей попробуем вывести обычный HTML документ, то он будет слишком мелкий, в 2 раза мельче привычного. Потому браузеры делают адаптацию таким образом: один CSS-пиксель занимает 2 реальных пикселя. Квадрат с width: 50px занимает 100 реальных пикселей, текст размером 16px рендерится высотой в 32 пикселя. То есть по сути браузер ставит масштаб 200% для такого экрана.

Если мы на таком сайте используем картинку размером 300x300, то браузер тоже ее увеличит до 600x600, при этом картинка будет слегка размытой, так как в ней нет лишних пикселей и браузеру приходится их получать интерполяцией (взятием среднего). Пользователь, привыкший к тонким четким линиям букв, будет разочарован "мыльностью" картинки.

(еще одна проблема таких экранов - так как на них в 4 раза больше пикселей, нужна более мощная видеокарта)

Чтобы решить эту проблему, ты можешь поставить на сайт картинку 600x600, но задать ей размер для вывода как 300x300:

<img width="300" height="300" src="image600x600.jpeg">

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

https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images

Разумеется, варианты картинок надо как-то автоматически генерировать, а также хранить информацию о них в БД, чтобы не сканировать диск при выводе страницы.

> нием 1920x1200 и обычном дисплее 1920x1200 открыть одну и ту же картинку, то она будет отображена одинаково? Как-то можно эмулировать ретину на обычном дисплее, чтобы видеть вёрстку на маке, не имея мака?



Можно попробовать сделать масштаб 200%. Тогда ты увидишь то же, что владелец Мака, приблизивший лицо к экрану.

В Firefox (и наверно в Хроме) в инструментах разработчика есть опции для имитации другой плотности пикселей: https://developer.mozilla.org/en-US/docs/Tools/Responsive_Design_Mode

Также, если у тебя есть смартфон с большим разрешением, можно смотреть на нем.

> Что порекомендуешь для pixel perfect вёрстки, может есть расширения для браузера или удобные линейки под линукс?



Не знаю, есть какие-то расширения, которые позволяют поверх сайта наложить полупрозрачную картинку-образец.
295 1455474
>>55466

> делиться ссылкой с кем-попало или давать доступ к альбомам другим юзерам


> защищенность ... не интересует



Твои требования противоречивы. Если тебя не интересует защищенность, просто сделай все фото публично доступными.

Также, посмотри owncloud, не подходит?

>>55459

Есть пруфы, что течет? Апач не используют по другой причине. Статику лучше раздает нгинкс, потому его ставят впереди. PHP запускают под php-fpm, так как это удобнее. В такой ситуации Апач просто становится лишним промежуточным звеном.

Раньше же Апач и отдавал статику, и запускал PHP код с помощью mod_php.

>>55079

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

>>55029

Показ выпадающего списка можно отключить HTML-атрибутом autocomplete. Это стоит делать для полей, содержащих приватные данные (вроде номера карты или паспорта), чтобы браузер их не сохранял.
296 1455475
>>54631

Работать с формой регистрации/обновления данных будет в разы удобнее при наличии объекта. Ты хочешь хранить данные в массиве, но давай сравним эти 2 подхода:

- структура объекта, какие у него есть поля, описаны в коде, к ним можно писать комментарии, а структура массива - нет
- в объекте могут быть методы
- в объекте можно использовать приватные поля и инкапсуляцию
- на объект можно поставить тайп-хинт с указанием класса, на массив - только хинт array без описания структуры

Таким образом, код будет удобнее читать.

>>54326

Если запрос выбирает одну строку по ключу, то это не проблема. Сделай тест - скорее всего MySQL может делать тысячи таких запросов за секунду.

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

Не гадай насчет производительности, а делай замеры. Интуиция тут сильно подводит, часто на практике медленной оказывается та часть, которую ты считал быстрой.

>>54210

Вот на всякий случай урок по строкам и utf-8: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

>>53649

Да, такая проблема есть, но она не в менеджере пакетов. Например, ты можешь вручную скачать библиотеки версий 1.4 и 1.5, но ты не сможешь их подключить из-за одинаковых имен классов. В JS эта проблема решается тем, что там есть модули и нет требования к уникальности имен классов.

>>53656

Сделать каталог public корневым (DocumentRoot). Это самый надежный способ.
296 1455475
>>54631

Работать с формой регистрации/обновления данных будет в разы удобнее при наличии объекта. Ты хочешь хранить данные в массиве, но давай сравним эти 2 подхода:

- структура объекта, какие у него есть поля, описаны в коде, к ним можно писать комментарии, а структура массива - нет
- в объекте могут быть методы
- в объекте можно использовать приватные поля и инкапсуляцию
- на объект можно поставить тайп-хинт с указанием класса, на массив - только хинт array без описания структуры

Таким образом, код будет удобнее читать.

>>54326

Если запрос выбирает одну строку по ключу, то это не проблема. Сделай тест - скорее всего MySQL может делать тысячи таких запросов за секунду.

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

Не гадай насчет производительности, а делай замеры. Интуиция тут сильно подводит, часто на практике медленной оказывается та часть, которую ты считал быстрой.

>>54210

Вот на всякий случай урок по строкам и utf-8: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

>>53649

Да, такая проблема есть, но она не в менеджере пакетов. Например, ты можешь вручную скачать библиотеки версий 1.4 и 1.5, но ты не сможешь их подключить из-за одинаковых имен классов. В JS эта проблема решается тем, что там есть модули и нет требования к уникальности имен классов.

>>53656

Сделать каталог public корневым (DocumentRoot). Это самый надежный способ.
297 1455476
>>53656

Сделать каталог public корневым (DocumentRoot). Это самый надежный способ.

>>53615

Увы, подробностей в посте мало. По поводу ошибок - они по идее должны писаться в какой-то лог, и надо там смотреть подробности. Также, ты можешь запустить тот же скрипт из консоли (командой вроде c:\php\php.exe d:\tmp\script.php) и там выведутся ошибки, если они есть.

Ну или напиши подробнее: какой скрипт, как ты его запускаешь, что выдается.

Также, в конфигах PHP лучше писать прямые слеши, c:/tmp/php/.

>>53317

Нет это плохо с точки зрения читабельности кода, так как в случае с if код визуально выделается, и ты по первому слову понимаешь, что тут if. Не делай так.
298 1455492
как вы смотрите на текущее состояние php в реалиях 2019 года и его развитие?
299 1455496
>>55492
как на говно
300 1455498
>>55496
почему?
image.png26 Кб, 1024x768
301 1455647
>>46969 (OP)
Помогите решить тестовые задания (одно из тестовых на собеседовании кстать):
Нужно сверстать календарь используя списки

Дан исходный код нужно его немножко изменить(как правило прописать имя классов соответствующим тегам, добавить свойства селекторам и тп) что бы получился результат (Pic related)

Если кому интересно покидаю другие
303 1455656
Добрый день. Меня гложит следующая мысль: имеет ли основания джавист или например шарпист смотреть на пхп-программиста свысока и считать последнего "недопрограммистом", потому что "написание скриптиков" - это якобы что-то несерьёзное. А вот они, работающие на компилируемых языках, работающие в энтерпрайзе со всякими банками и прочими крупными заказчиками, это кто-то, кто стоит на уровнь выше и является "настоящим" программистом.
Это не троллинг, я серьёзно спрашиваю, и точно не хочу начинать срач. Я вроде бы понимаю, что язык - это просто инструмент, и сам по себе он не должен быть мерилом профессионализма. Мне хотелось бы услышать какие-то аргументы не для спора с кем-то, а для самого себя, чтобы избавиться от некоторых комплексов.
304 1455657
>>55656
Полное право имеют. Потому что даже самый высоконагруженгый сайтик с гиганстким стеком технологий не сравнится с написанием приложения для, например, банковской сферы.
305 1455681
>>55656
Всё зависит от того, какой у тебя уровень и какими технологиями ты владеешь.

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

В ПХП тоже есть, где развернуться и что изучить. Но обычно это уже дополнительные сервисы и коммуникация с ними.

Энтерпрайз в целом сложнее, чем веб. В веб у тебя обычно короткий жизненный цикл программы, особенно на ПХП, один запрос, один вызов. Долгая логика выносится в БД и внешние сервисы. В энтерпрайзе всё сложнее, очень сложные приложения могут быть.

Хотя многие реально клепают круд-говно, просто на других языках, шлёпают какие-нибудь формы к БД, которую даже и не они проектируют.
306 1455687
>>55657
>>55681
Спасибо за ответы, котаны.
307 1455692
>>55687
Хотя немного грустно стало от ваших ответов, честно говоря.
308 1455693
>>55692
А какая нахуй разница, если бабки платят? Ну грустно и хуй с ним, зато сытно.
309 1455697
>>55693
Хмм, а в этом есть логика, ведь если платят, то видимо не просто так платят.

И кстати, на Хабре в какой-то теме про ПХП я читал, что работа на Симфони в целом по сложности и приятности не многим отличается от работы на той же Джаве, это правда так?
310 1455699
>>55681

> В ПХП тоже есть, где развернуться и что изучить. Но обычно это уже дополнительные сервисы и коммуникация с ними.



Вот это спорный тезис. Какие-то +/- серьёзные проекты на чистом рнр не напишут. Как прослойка для чего-то ещё может быть. Вся разработка на рнр в 95% сводится к оптимизации запросов к БД и обработке данных полученных из форм. Написание плагинов для WP/1C-Битрикс. Серьёзный проект не написать.

Я как-то взял observium для мониторинга устройств по snmp и как же прибалдел от кривизны. Но ещё больше прибалдел от увиденного под капотом. Код на рнр запускал питон, который выполнял свою часть работы и возвращал в рнр... и это так криво работало, что пораждало кучу процессов в системе, что в окончании приводило к нехватке памяти и свопом, ну короче со всеми вытекающими.

Коли уж заговорил про WP, то это адская говнина, которую 24/7 надо мониторить на предмет уязвимостей. Короче тезис таков, что у рнр были шансы, но ребята всё пребали. Сейчас с 0 писать какой-то высоконагруженный проект не имеет смысла.
311 1455701
>>55697
На голой джаве так-то тоже не пишут. Spring и иже с ним. Понятное дело, что либа навороченная и в неё надо вникать.
312 1455714
>>55699
Много есть каких-то больших проектов на PHP, не только мелочь. Если годами пишешь на ПХП и хорошо владеешь всеми инструментами, то почему бы и для нового проекта не взять привычный инструмент? Точно ли альтернативы плюсы дадут?

Всё-таки ПХП как-то развивается. Я давно с ним серьёзно дела не имел, не в курсе, но что-то там есть. Там сам язык мощный, и поддержка мультитредов-процессов, что-то мутят с асинхронностью.

Я не знаю, возможно ли сейчас сделать веб-сервис на ПХП, чтобы он один раз запустился, принимал последовательно, а лучше параллельно очень много соединений, и не требовал регулярного перезапуска, чтобы мог неделю проработать, обслужив многие тысячи подключений за это время?

Это для меня критерий полноценного инструмента. Я думаю это возможно.

Но я уже к другим инструментам привык, у меня такой потребности нет.
313 1455716
>>55699

Точно так же можно найти лапшу и на других языках. Ну например, в упоминаемых вами банках часто держат какие-то древние компьютеры (или эмулируют их), чтобы не переписывать написанную 20 лет назад систему, которую сегодня никто не сможет поддерживать. И именно из-за гор легаси кода вам, например, могут сказать "вот где карту получали, туда и идите" (и это не только сбербанк, но и в коммерческих банках).

Гораздо важнее тут соблюдение определенных стандартов, соглашений. Ява, да, в этом плане хороша тем, что там с давних времен есть отлаженный процесс стандартизации (JSR).

Пример утилиты observium вообще ни о чем не говорит. Это же open source - кто-то делал для себя и поделился. Может быть, эта утилита решила требуемую задачу. А если ее сесть писать на Яве с тщательным проектированием, составлением спецификаций, тестированием, это займет в 3 раза больше времени и даст такой же результат.

Open source - это не "а ну напишите мне бесплатно качественный продукт", это "смотрите, я это для себя делал, если интересно, присоединяйтесь". Взял бы и исправил косяки.

И насколько я знаю, фейсубк и вконтакте именно на PHP писать начинали. А на Яве написаны одноклассники.
314 1455722
>>55716

>И насколько я знаю, фейсубк и вконтакте именно на PHP писать начинали.


Это было 15 лет назад, другая эпоха. Кто-нибудь сейчас стартует большие проекты на ПХП? На самом деле кажется, что всё-таки да, но сейчас явных преимуществ ПХП над другими языками нет, на ПХП уже не принято писать, как 15 лет назад.
315 1455727
>>55722

Делал ли ты выборку по hh.ru по языкам или же твое мнение базируется на сообщениях анонимных безработных экспертов с двачей? Потому что про смерть PHP (и Windows) я слышу уже лет 5 если не больше.
316 1455803
>>55699
Диван не отлежал ещё? PHP используется в разработке в том числе и новых проектов, например тут искали симфониста в новое направление Яндекса: https://moikrug.ru/vacancies/1000049016
Сейчас вакансии не мониторю, когда полгода назад мониторил - наткнулся на эту. Попробуй и ты поискать - поймёшь, что не прав.

>>55657

> Полное право имеют.


Джависты ничем от отличаются от PHP-разработчиков. Клепают такие же формы, пишут такие же REST/GraphQL API по общепринятым спецификациям в веб-разработке, интегрируют такие же инструменты для поиска и очередей (Elasticsearch, RabbitMQ), пользуются теми же облачными сервисами. Ладно если бы они ракеты в космос запускали или писали ПО для беспилотных автомобилей, но нет - такие же формошлёпы, как и PHP-шники. Есть подозрение, что ты далёк как от PHP, так и от современной Java- разработки.
317 1455826
>>55716
При чём тут open source? Опен сурс проекты так-то пишет не 1 человек. Взять, например, арч или дебиан. Целая ОС, которую создавали на голом энтузиазме.

Суть в том, что рнр с его костылями не может дать гибкости как змея или ява. Он прост для вкатывания, написания каких-то простых вещей он и задумывался как язык для домашних страничек с обработкой форм, заебались через cgi perl запускать, ещё один язык, который придуман был для обработки текста. Мэил ру на перле написан и хули? Ну допиливают они его, и хули? Перл развивается, 6 версия не за горами, и хули?

Сколько написнно на явк и си решетке и сколько на рнр =) пример с легаси в банках глупость полная, там от такого уже ушли. Есть конечно какие-то исключения, но то единичные случаи. Если бы вы это лет 10 назад написали, я согласился бы.
318 1455828
>>55803
Не отлежал. Пишут не с 0 на рнр, а на либе. Это как бы 2 разные вещи. Ну и от души посмеялся от знания го и змеи, это значит, что рнр в этом резюме как прокладка между чем-то. Собственно о чём я выше и писал. Бекэнд на рнр уже изживает себя. Я не отрицаю, что сайт легко и просто развернуть на рнр, но что-то более серьёзное, увы.

Бекэнд у вашего резюме даже не рнр обрабатывает, я больше чем уверен.
319 1455829
>>55803
У тебя кругозор слишком узкий, видимо студент или крутишься в вебе. Джава как и змея используются для форма клепства сопру нет, но спектр задач гораздо шире. На рнр ты кое как бекэнд обработаешь да json оаспарсишь, а на джаве сервер напишешь, а на питоне вообще всё что угодно сделаешь, только пиздец как медленно.
320 1455831
>>55656
Подобными вопросами задавался и я год-два назад.

На самом деле ПХП мне нравится. Пробовал питон - не зашел, нода - тоже. У ПХП есть какое-то ощущение чтоли прочности (как и у питона) и наличие си-подобного синатксиса (как у ЖС). Писал на нем все на свете.

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

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

Та же хуйня у меня была с линуксами. Всю жизнь я просидел на винде, попробовал линукс - не смог, порвалась жопа, сидел на 10ке и оправдывал это, и все бы хорошо, но мне почемуто пиздец как хотел перейти на линукс, у этого небыло объективной потребности, просто хотелось, в конце концов я решил уйти и превозмогать пока не вкачусь. В конце концов укатился, сейчас сижу на арче и не жалею, чувствую себя спокойным и удовлетворенным.

хз зачем я это высрал
похуй, всеравно анонимная борда
321 1455835
Аноны нужна помощь.
Вообщем столкнулся я с задачей по ООП, где нужно написать функцию padLeft и padRight используя функции mbstring, но вот беда, модуль этот по стандарту не включен, нагуглил что нужно раскомментировать строку отвечающий за этот модуль в файле php.ini, но в папке php у меня его нет, а phpinfo() пишет что ini файл находиться в c:\windows, но там его тоже нет. Что делать?
322 1455837
>>55831
Наобот спасибо, что высрал написал.
323 1455842
>>55835

В phpinfo() надо смотреть не "место, где ищется php.ini", а строку, где написано "использованные ini-файлы" или как-то так. Скинь скриншот верхней части таблицы, если найти не можешь.
324 1455850
Всем привет

Прошу прощения за платиновый вопрос и то, что не читаю в гугле.
МОжет подскажете, как дела в европе с PHP? через пару месяцев меня ждет релокация в Чехию или, менее вероятно, но есть шанс, в Гермашку (скорее первое) по основной работе, которую после дропну нахуй. Понимаю, что там своим спецов дохуя , и я буду нубом, но с финаносовой подушкой есть полгода-год, чтобы поуизучать + по текущей работе есть реальные примеры, что могу поделать (допилить аддоны в облаке, могу просто попросится проверять и помогать коллегам)
image.png158 Кб, 1366x768
325 1455860
>>55842
Судя по Loaded Configuration File (none) ini файла у меня попросту не существует.
326 1455861
>>55835
Раскомментировать подойдет если у тебя стоит пыха такая как ее делали разрабы пыхи, что на большинстве дистрибутивов врядли. Скорее всего надо просто поставить нужный модуль. Но поскольку ты на винде - хз как это сделать
327 1455869
>>55861
Нужный модуль у меня находиться в папке php\ext, но для его включения нужен ini файл, вот я и ищу его.
328 1455870
>>55869
У тебя опен сервер?
329 1455873
>>55870
Нет, я использую встроенный php сервер.
330 1455876
>>55860
У тебя же написано что Configuration file (php.ini) path - находится в C:\Windows
331 1455878
>>55876
Так в том то и дело, что его нет там.
332 1455879
>>55878
Советую тебе поставить apache или nginx, чтобы ты все смог настраивать, там то они (конф. файлы) точно будут
333 1455880
>>55879
Ладно, попробую, спасибо за помощь.
334 1455905
>>55860

У тебя все ясно написано: PHP ищет конфиг в c:\windows\, но там его нет. Ну так создай файл php.ini (нужны права админа) и положи туда.

Обычно установщик при установке прописывает в реестр расположение папки PHP, и он ищет конфиг в ней.

Вот мануал, объясняющий где PHP ищет конфиг: https://www.php.net/manual/en/configuration.file.php

Ты можешь либо создать конфиг и положить в c:\windows\php.ini, либо создать в другом месте и указывать путь к нему опцией -c при запуске PHP (php.exe -c d:\php\php.ini )
335 1455923
Доктрина или елокуент?
336 1455977
>>55459

>Используй неймспейсы


Жопой читаем?
337 1455980
>>53528

Поддержка пространств имен нужна только для защиты от конфликтов (совпадений имен классов, функций, констант).

Чтобы подключить - надо смотреть мануал по библиотеке. Если там надо просто подключить файл (например, библиотека предоставляет файл-загрузчик), то его можно прописать в composer.json в секцию autoload.files, мануал тут: https://getcomposer.org/doc/04-schema.md#files

Если такого файла нет, можно использовать classmap в composer.json, который просканирует файлы и создаст автозагрузчик для классов сам.

Если нужно выполнить какой-то кастомный код, то делаешь функцию в своем приложении и вызываешь в bootstrap-файле (при запуске приложения).

Если подключение библиотеки требует много ресурсов, то делаешь функцию для подключения и вызываешь только когда это нужно.
338 1456004
>>55923
елокуент и в пизду этот падающий от любого ика менеджера сущностей
339 1456059
Аноны, привет, на связи пидораха. Хочу стать человеком. А точнее программистом который хочет глубже познать суть.
Так что мне видимо требуется открыть для себя волшебный мир структур данных и алгоритмов, я прав?
Подскажите книгов пожалуйста.
340 1456087
В последнее время всё чаще думаю, что все попытки демонизировать php - это ошибка. Постоянно встречается говно с тем, что память течёт, системный io блокирующий, нормальных инструментов для ассинхронной работы нет, возникает необходимость в супервизоре, хелсчеках, таймаутах на операцию и т.п. Да и зачем, если php под это тупо не задизайнён?
Та же связка nginx-phpfpm (а теперь ещё и в php7.4 пред-загрузка появилась) дают огромную производительность, в которую ты уже не упрешься практически никогда (потому что узкое место - это обычно база данных, а приложения на php масштабировать очень просто), если написано нормально, а не через жопу.
Даже если задача такова, что нужно вычитывать из вебсокета или очереди, то есть куча инструментов (тот же nginx), которые умеют вычитывать данные и слать http-запросы, позволяя php работать as designed, а не как сова на глобусе.
341 1456133
>>56087
так и есть , или ждать пхп8 когда сделают асинхронность из коробки на низком уровне ядра , всё остальное ReactPHP и тд шняги для бенчмарков + пет проекты уровня хелло ворлд
342 1456136
>>55923
2 разных подходи , вопрос сорт оф автомобиль или лодка
343 1456140
>>55850
подтягивай тогда лучше англ , джуны без нетива на уровне б1 не нужны , по работе она есть , не так много как например в укропском ДС но есть.

мимо варшава кун
344 1456164
>>56140
Спасибо
С ним как раз проблем нет
345 1456191
>>55980
Спасибо.
Всегда пишу через неймспейсы + композер, не хочется напрямую инклюдить, в обход общей структуры приложения.
346 1456201
>>56087
Так возьми ту же ноду, чё как фуфел? Или ты из тех чуваков, что пхп - ван лав?
347 1456213
>>56059
Ты тредом ошибся.
348 1456283
Пачаны, где искать задачки на подобие ОПовых? Одна мука в инете, сосчитать 2 + 2 и прочее гавно из жопы.
349 1456305
>>56283
кстати да + вопрос
350 1456316
>>56087
Расскажи что за задачи ты решаешь? Личный интерес
351 1456376
как сделать личный кабинет?
352 1456452
>>56376
берешь и делаешь
sage 353 1456458
Подскажите как можно реализовать такую логику mysql. Есть таблица с полями id/user_id/token. При регистрации в этой таблице создается поле для пользователя. Если он решит выйти и снова авторизироваться, вместо новой записи в таблице должна обновляться старая запись. Я пробовал сделать это через
INSERT INTO t8rv0_mobile_tokens (user_id, token) VALUES (:user_id, :token) ON DUPLICATE KEY UPDATE user_id = values(user_id), token = values(token)
Но, видимо из-за того, что токены различаются, оно создает новую запись вместо обновления старой. Спасибо
354 1456472
>>56452
не могу,потому что не понимаю
sage 355 1456485
>>56458
Появилась идея. При создании линковоной таблицы создаются пустые записы под слинковую колонку? Просто сам объект пользователя сохраняется в другой таблице. Если слинковать и создать шаблонные записи под каждого созданного пользователя и создавать новые при создании новой записи пользователя и использовать UPDATE
356 1456579
>>56201
Этот вопрос уже 100500 раз обсосан. Это тебе в твоём манямирке на 2 с половиной юзера и полтора формошлёпа всё заебись, можешь хоть каждый день всё на новый язык переписать. А когда у тебя 50 разработчиков и кодовая база в несколько десятков тысяч строк, то ты каждый раз будешь думать, тащить ли новую технологию или сделать на старой. Потому что любой новый стек, это разработчики, которые должны уметь на этом кодить, девопсы, которые должны уметь это поддерживать, ещё одна экосистема, от которой ты зависишь и так далее. Для тебя это может быть пустой звук - но для бизнеса - нет, и дописать лишнюю точку входа в существующий монолит (или не совсем монолит, не суть) оказывается проще, чем тащить что-то новое.
Поэтому пхп не ван лав, просто нужно оценивать риски и профит. Та же нода - норм, но это если у тебя есть минимум 2 девелопера и 2 девопса, чтобы это готовить. И задача подходящая.
Во всех прочих случаях отдельный гейтвей для сокетов и обычный бекенд за ним решает 99% проблем, не принося новых.
А на пет проектах я сам на чём только не пишу.

>>56316
У текущей компании много продуктов, в большинстве бекенд написан на php. В основном, всякие сервисы по работе с хостингом, доменами и прочими сертификатами. Но я - выходец с аутсорса и работал в том числе над сайтами для компаний из fortune-500 (в-основном интранеты, интернет-магазины, прочие веб-приложени). Почти везде и почти всегда связка cron + php решала все проблемы и мне не приходилось изобретать велосипеды.
357 1456630
>>56579

>Почти везде и почти всегда связка cron + php решала все проблемы


Я наверное не понял тебя сначала извини. Думал ты как раз расскажешь про те задачи что не решить этой связкой
358 1456671
>>56630
А. Классическая задача - это запускать что-то раз в 10-15 секунд, кроном принципиально не решается.
Из реальных задач - у меня была задача максимально ускорить доставку писем клиентам (они содержали подтверждение платежей). Крон, который рассылал письма клиентам из очереди раз в минуту бизнес не устраивал. Решается такое как раз набором демонов, вычитывающих всё из очереди в тот же момент, когда оно туда попадает.
Ещё, у меня была задача подгружать много данных из разных источников, компоновать их, и возвращать в едином списке. Понятно, что кэшировалось, но изначально-то это была композиция ассинхронных запросов. Решал через по тем временам модный Gearman.
С сокетами тоже была задача, как раз нужно было слать пуши на девайс и обратно, причём быстро. Вообще на php есть Ratchet, который вроде как умеет в сокеты, но я тогда (уже не помню, по какой причине) написал простенький прокси на socket.io, который умел принимать http-запросы из php и пересылать их на девайс, принимать запросы с девайса и пинать php по http. Тут могла бы быть проблема в случае добавления новых нод (потому что пришлось бы как-то узнавать, к какому из инстансов ноды прицеплен конкретный пользователь), но там трафика было достаточно мало, чтобы этим пока что не заморачиваться. Если бы понадобилось, то, наверное, хранил бы в каком-нибудь хранилище (редисе, к примеру) связку пользователь-девайс-нода.
359 1456709
>>56283
codewars. Там вроде уже есть клан двачеров, но лучше не вступай туда.
360 1456711
>>56579

>Этот вопрос уже 100500 раз обсосан


Только не рвись, дружок.
361 1456733
У меня небольшой вопрос twig и slim. Делаю сайт, на каждой странице сайта нужно выводить список категорий из бд. Я поместил код получения из бд в middleware и там же добавляю массив категорий как сервис twig, чтобы каждый раз не писать это в контроллерах. Все правильно делаю? Мне кажется, что это сложное решение, и можно как-то проще сделать...
362 1456747
>>56733
в контроллере собирай массив и передавай во вью
363 1456760
>>56671
Интересно. Спасибо
364 1456785
>>56747
А если у меня 100 вью, то каждый раз в ручную передавать?
365 1456817
Анонче, помоги с апачем. Делаю автоматические поддомены.

Сейчас мой htaccess выглядит так:

RewriteEngine On
RewriteBase /
RewriteRule ^([-\w]+)?$ index.php?p1=$1
RewriteRule ^([-\w]+)/([-\w]+)?$ index.php?p1=$1&p2=$2
RewriteRule ^([-\w]+)/([-\w]+)/([-\w]+)?$ index.php?p1=$1&p2=$2&p3=$3

Каким кодом я могу также в GET передавать тот параметр, что идет вначале домена в виде поддомена?

Тоесть есть много адресов acer.domain.ru - нужно передать acer в скрипт, но при этом открывать тот же скрипт, что и domain.ru

На сколько я понял нужно как-то VirtualHost править
366 1456876
>>56817
Тысячу лет не имел дел с апачем, но вообще поддомен выглядит, как отдельный виртуальный хост. Может, там можно плейсхолдер херануть, чтобы у тебя, к примеру, было два виртуальных хоста, *.domain.com и domain.com
367 1456914
>>56817

А ты не хочешь просто смотреть оригинальный домен в $_SERVER['HTTP_HOST'] ? https://www.php.net/manual/en/reserved.variables.server.php

А так, открой мануал и изучи внимательно: https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule

> In addition to plain text, the Substitution string can include


>


> back-references ($N) to the RewriteRule pattern


> back-references (%N) to the last matched RewriteCond pattern


> server-variables as in rule condition test-strings (%{VARNAME})



Список "server-variables" есть на этой же странице выше.
368 1456917
>>56733

middleware не для этого, это для работы на уровне HTTP-протокола вроде логгирования, сжатия, кеширования, зашифровки кук.

middleware не позволяет нормально передать переменные во view, как я понял.

У тебя есть такие варианты:

- наследовать все контроллеры (если это классы) от базового и в базовом генерировать "общие" данные и добавлять их в массив при рендеринге
- перед вызовом $app->run() сделать вызов своей функции, которая получит нужные данные и передаст в твиг как глобальные переменные:

function prepareLayoutData(...) {
$x = ....
$container->get('view')->getEnvironment()->addGlobal(...);
}

...

prepareLayoutData($app);
$app->run();

- сделать "контроллер" или "сервис" общих данных, который их будет получать их. Передать экземпляр этого сервиса в твиг как глоб. переменную. И далее использовать:

{% for layoutService.getMenu() as menuItem %}
....

И да, названия у меня ужасные, придумай что-нибудь получше.
368 1456917
>>56733

middleware не для этого, это для работы на уровне HTTP-протокола вроде логгирования, сжатия, кеширования, зашифровки кук.

middleware не позволяет нормально передать переменные во view, как я понял.

У тебя есть такие варианты:

- наследовать все контроллеры (если это классы) от базового и в базовом генерировать "общие" данные и добавлять их в массив при рендеринге
- перед вызовом $app->run() сделать вызов своей функции, которая получит нужные данные и передаст в твиг как глобальные переменные:

function prepareLayoutData(...) {
$x = ....
$container->get('view')->getEnvironment()->addGlobal(...);
}

...

prepareLayoutData($app);
$app->run();

- сделать "контроллер" или "сервис" общих данных, который их будет получать их. Передать экземпляр этого сервиса в твиг как глоб. переменную. И далее использовать:

{% for layoutService.getMenu() as menuItem %}
....

И да, названия у меня ужасные, придумай что-нибудь получше.
369 1456918
>>56785

Так-то добавить их можно одной строчкой:

$viewData = addCommonViewData($app, $viewData);
370 1456953
>>56472
Декомпозируй задачу
371 1456997
>>56917
Спасибо большое! У меня теперь ещё один вопрос последний: ещё в middleware я ограничиваю доступ неавторизованных пользователей к некоторым разделам сайта. Это правильно, или фильтрацию надо в другом месте делать?
372 1457051
>>56785
Ты создай контроллер а остальных наследуй от него
373 1457174
>>56997

Это можно, но на практике может быть неудобно, так как тебе для принятия решения о доступе нужно получить какую-то сущность, которая получается в контроллере. И придется дублировать код ее получения.

Зато плюс middleware - что ты можешь разом ограничить доступ к целой ветке по URL, а в случае контроллера тебе надо не забыть это прописать.

Можно комбинировать оба подхода: требовать авторизации при входе в закрытый раздел на уровне middleware, а на уровне контроллера делать дополнительные проверки.

>>56458

А тебя не устраивает вариант с 2 запросами? Проверить наличие записи, и если надо, послать запрос UPDATE для обновления.

Если тебя беспокоит проблема "гонки" (за промежуток между 2 запросами другой процесс что-то поменяет в таблице, например, удалит юзера), то можно использовать транзакции и пессимистичные блокировки с использованием SELECT ... FOR SHARE / FOR UPDATE: https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html

Ты можешь попробовать поискать ответ в мануале (он очень подробный), но скорее всего, решения там не будет: https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

Поведение запроса INSERT ... UPDATE зависит от наличия уникальных ключей, по каким колонкам они сделаны. У тебя наверно ключ по (user_id, token) отсюда и такое поведение.
374 1457176
>>56283

А тебе тех, что есть в шапке, недостаточно, и ты уже сделал задачу про студентов, про файлообменник итд? Или ты имел в виду простые задачки по основам?

Если есть время, я бы посоветовал codeforces https://codeforces.com/problemset - тут, правда, задачи в основном вроде олимпиадных, на алгоритмы. Не бойся сложности: там есть простые задачи, которые легко увидеть по количеству решивших: если это несколько тысяч человек, то и ты, наверно, решишь (пример простой задачи, я додумался до решения за 5 минут: https://codeforces.com/problemset/problem/1206/A ). Если что, я готов дать подсказку.

>>56376

Уточни пожалуйста, что именно тебе не понятно. Личный кабинет - это просто набор страниц, доступ к которым ограничен с помощью авторизации.

Один из простейших способов авторизации - это куки с токеном. Если пользователь вводит логин/пароль, и они правильные, то сервер выдает ему куку, содержащую токен ("пропуск"), который должен:

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

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

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

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

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

Если ты не знаешь, что такое куки, то изучи сначала. Тебе может быть придется также прочесть про протокол HTTP, у меня есть урок: https://github.com/codedokode/pasta/blob/master/network/http.md
374 1457176
>>56283

А тебе тех, что есть в шапке, недостаточно, и ты уже сделал задачу про студентов, про файлообменник итд? Или ты имел в виду простые задачки по основам?

Если есть время, я бы посоветовал codeforces https://codeforces.com/problemset - тут, правда, задачи в основном вроде олимпиадных, на алгоритмы. Не бойся сложности: там есть простые задачи, которые легко увидеть по количеству решивших: если это несколько тысяч человек, то и ты, наверно, решишь (пример простой задачи, я додумался до решения за 5 минут: https://codeforces.com/problemset/problem/1206/A ). Если что, я готов дать подсказку.

>>56376

Уточни пожалуйста, что именно тебе не понятно. Личный кабинет - это просто набор страниц, доступ к которым ограничен с помощью авторизации.

Один из простейших способов авторизации - это куки с токеном. Если пользователь вводит логин/пароль, и они правильные, то сервер выдает ему куку, содержащую токен ("пропуск"), который должен:

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

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

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

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

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

Если ты не знаешь, что такое куки, то изучи сначала. Тебе может быть придется также прочесть про протокол HTTP, у меня есть урок: https://github.com/codedokode/pasta/blob/master/network/http.md
375 1457179
>>56059

Попробуй погуглить по "алгоритмы и структуры данных". Я тебе могу дать список самых базовых вещей, которые можно изучить: связанные списки, стек, деревья и графы и алгоритмы на них, бинарные деревья, хеш-таблицы.

>>56004

"менеджер сущностей" имеет свои плюс: он умеет сам искать изменения. Ты изменил (или создал) сущность и несколько связанных с ней, и одной командой все изменения находятся и сбрасываются в БД в нужном порядке. Хотя, конечно, это можно реализовать и в ActiveRecord.
376 1457371
>>56917

>И да, названия у меня ужасные, придумай что-нибудь получше.


Поясни, знающий анон, как функции называть? Почему prepareLayoutData это плохо? Я думал плохо это TovarTyt() или VzatVelichiny()
377 1457430
>>57176

> Или ты имел в виду простые задачки по основам?


Так точно.
378 1457560
Аноны, приведите позязя простейшую реализацию защиты от XSRF. Если я просто создам кукиесу с рандомными цифрами, вставлю ее в хидден поле формы, а потом при получении данных с этой формы буду проверять текущую куки и присланную - это прокатит?
379 1457586
>>55476

>Нет это плохо с точки зрения читабельности кода


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

Вот записывать так сложные условия - уже не очень.
А строка типа
hui && pizda читается изи.
380 1457589
>>53317
Правда, жалко, это не работает с конструкциями языка. Только с функциями.
Например, unset () так не сделаешь
381 1457595
>>55474

>Апач не используют по другой причине.


А более вменяемая и легкая настройка - это недостаточная причина?
Всегда люто блевал с этого апача, прежде чем научился настраивать это говно.
Nginx освоил за неделю, ибо там все в полторы строки делается.
382 1457600
>>57586
я другой анон, но тоже не понимаю зачем вы if в сточку пишите. Мне читабельности не добавляет. Зачем экономить? Может ты еще и туалетную бумагу бережешь и пакетик три раза завариваешь? Смотри какая экономия выходит
383 1457769
>>57600

>Зачем экономить?


Затем, чтобы методы по 500 строк не были
14166852016920.jpg11 Кб, 480x270
384 1457771
Как изменить ключи во время итерации по многомерному массиву?
385 1457859
>>57769

>методы по 500 строк


Неправильно декомпозируешь скорее всего. Ещё и на читабельности начинаешь экономить.

Много коротких строк лучше чем мало длинных.
70916971.png213 Кб, 1861x2008
386 1457981
Table_1

NameName_id
===================
Eva 222222
Joe 333333

Table_2

IdValueUnique_id
===================
8880 222222
99100 333333

Card

Card_nameCard_valueCard_id
===============================
Eva 20 88

Логика такая:

Table_1.Name = Card.Card_name
Table_1.Name_id = Table_2.Unique_id
Table_2.Id = Card.Card_id
Table_2.Value = Card.Card_value

В пустое поле "Card.Card_name" посылается только имя
UPDATE `Card` SET `Card`.`Card_name` = 'Eva'
Как сделать так, чтоб за один UPDATE не только имя посылалось, но и
значение из "Card.Card_value" прибалялось к "Table_2.Value"?

Пожалуйста реши анон, это обучающая таблица, весь день голову ломаю с иннер джоинами.
Хочу посмотреть на этом примере логику отношений таблиц.

Только начал про подключение PHP к таблицам через PDO и пришёл к этому, сильно не бейте.

Сами таблицы http://sqlfiddle.com/#!9/5b279e
70916971.png213 Кб, 1861x2008
386 1457981
Table_1

NameName_id
===================
Eva 222222
Joe 333333

Table_2

IdValueUnique_id
===================
8880 222222
99100 333333

Card

Card_nameCard_valueCard_id
===============================
Eva 20 88

Логика такая:

Table_1.Name = Card.Card_name
Table_1.Name_id = Table_2.Unique_id
Table_2.Id = Card.Card_id
Table_2.Value = Card.Card_value

В пустое поле "Card.Card_name" посылается только имя
UPDATE `Card` SET `Card`.`Card_name` = 'Eva'
Как сделать так, чтоб за один UPDATE не только имя посылалось, но и
значение из "Card.Card_value" прибалялось к "Table_2.Value"?

Пожалуйста реши анон, это обучающая таблица, весь день голову ломаю с иннер джоинами.
Хочу посмотреть на этом примере логику отношений таблиц.

Только начал про подключение PHP к таблицам через PDO и пришёл к этому, сильно не бейте.

Сами таблицы http://sqlfiddle.com/#!9/5b279e
388 1458027
>>57987
Спасибо, я уже это вчера читал. Это совсем не то, кстати.
У меня не обновление множества форм за раз, а отправка имени в пустое поле уже готовой формы и (самое сложное, из-за чего проблема-то) нужно с налёта сверить это имя с именем в 1й таблице и только потом скопировать уже имеющиеся значения в 3й таблице, сверив айди имени 1й таблицы с айди мени во 2й. Здесь вроде триггер нужен, но это пока сложно для меня.
389 1458144
>>57981

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

Ты разобрался с джойнами в запросе SELECT? Если нет, я бы советовал изучить:

- JOIN (INNER JOIN)
- LEFT JOIN
- связи один-к-одному, один-ко-многим, многие-ко-кногим

Далее. твоя схема таблиц странная:

> Table_1.Name = Card.Card_name



Какой смысл дублировать имя в 2 таблицах? Если у тебя имена хранятся в Table1, то в Card достаточно сделать ссылку (внешний ключ) на поле Table1.Name_id . Так, как у тебя, обычно не делают (ну или может есть какая-то причина?).

Я бы советовал тебе прочесть еще мой урок про нормализацию, чтобы такого не допускать: https://github.com/codedokode/pasta/blob/master/db/normalization.md

Если тебе надо обновить 2 таблицы, самым простым способом будет открыть транзакцию, сделать 2 UPDATE, закоммитить транзакцию.

> UPDATE `Card` SET `Card`.`Card_name` = 'Eva'



Ты учел, что это обновит не одну строчку, а во всей таблице во всех строчках обновит поле?
390 1458178
>>57981
Если я правильно тебя понял то http://sqlfiddle.com/#!9/ef7058/1 (update в левой панели).
изображение.png5 Кб, 623x75
391 1458246
Заказал хостинг от GoDaddy. В phpinfo() выводит вот это.

Как жить дальше? Можно ли поменять api на apache или nginx?
392 1458314
>>58144

>Джойны применяются обычно при выполнении выборки, SELECT.


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

UPDATE `Card`,
`Table_2`,
`Table_1`
SET
`Card`.`Card_name` = 'Eva',
`Table_2`.`Value` = `Table_2`.`Value` + `Card`.`Card_value`

Как ты и написал, заполняются именем Eva вся таблица "Card" и прибавляются все значения во всей таблице "Table_2".

Вообще я думаю, что это что-то нужно в WHERE
WHERE
`Table_2`.`Unique_id` = `Table_1`.`Name_id`

Или AFTER UPDTE `Card`.`Card_name` ...

Иначе как база будет брать Eva в момент её заполнения и тут же выполнять другие действия, основываясь на этом имени и уникальном айди на лету за раз.

>Я бы советовал тебе прочесть


Спасибо, почитаю.
393 1458343
>>58246

Надо смотреть документацию, но обычно shared hosting подразумевает, что ты просто получаешь папку на диске, а веб-сервер настраиваешь не ты. Но тебе надо посмотреть, может быть у них есть какие-то опции, это все-таки известный хостер.
394 1458346
>>48813
Metanit.com
395 1458405
>>58144

>Ты учел, что это обновит не одну строчку, а во всей таблице во всех строчках обновит поле?


Сделал
WHERE
`Card`.`Card_id` = 88
Теперь обновляет только нужную строчку, но всё ещё

>прибавляются все значения во всей таблице "Table_2"


а не к нужной айди имени...
Снимок.PNG32 Кб, 568x439
396 1458550
Пока самое чистое, что я >>57981 родил:

UPDATE `Card`,
`Table_2`,
`Table_1`
SET
`Card`.`Card_name` = 'Eva',
`Table_2`.`Value` = `Table_2`.`Value` + `Card`.`Card_value`
WHERE
`Card`.`Card_id` = 88
AND `Table_2`.`Unique_id` = `Table_1`.`Name_id`
AND `Table_1`.`Name` = `Card`.`Card_name`;

Без ошибок, но ничего не посылается, т.к. не проходит проверку `Table_1`.`Name` = `Card`.`Card_name` из-за того, что `Card`.`Card_name` пустое. Если вручную вписать `Card`.`Card_name` , то в `Table_2` происходит всё как надо. Всё логично, т.к. SET и WHERE пыполняются одновременно, а не последовательно, но куда рыть тогда? Всё же CREATE PROCEDURE и триггер AFTER UPDATE А может всё же можно как-то без них? ?
397 1458617
Аноны, тут можно вопрос по фремворкам задавать?
398 1458624
>>58617
Нет.
399 1458634
>>58343
Спасибо за ответ.
В теъ. поддержке ответили что поменять api можно только на выделенном сервере.
400 1458747
>>58617
Конечно, не стесняйся.
Безымянный.jpg147 Кб, 832x680
401 1458774
/ Братишки, помогите разобраться.
Вот такой код. Выдаёт синтаксическую ошибку. Хотя синтаксической ошибки вроде как нет.
Не могу понять, тут какая-то неверная конструкция или что-то действительно не так с синтаксисом.
Пытался спросить у Гугла, не нашел ответ
/

<?php
public static function get_all_versions() : array {
global $CFG;

self::init();

$versions = array();

$versions['core'] = self::fetch_core_version();

$usecache = false;
if (CACHE_DISABLE_ALL or (defined('IGNORE_COMPONENT_CACHE') and IGNORE_COMPONENT_CACHE)) {
$usecache = true;
}
?>
402 1458814
>>58774
Версия пхп какая?
403 1458888
>>58774
У тебя не поддерживает указание типа возвращаемого значения. Возможно ты пишешь на php 5. Просто убери ": array". Должно заработать
27HJ-yAEPNU.jpg242 Кб, 1014x1024
404 1459010
>>58814
>>58888
Спасибо, няши. Добра. Несовместимость версий, действительно.
405 1459021
406 1459025
407 1459037
Григории, только начинаю разбираться в гите. Поясните, если я пушнул свой проект на гитхаб, то туда скопировались ВСЕ коммиты и изменения? То-есть если в первых версиях у меня реальный пароль к базе данных сохранен был, то все на гитхабе его увидят? И это фиксится только удалением проекта на гитхабе, удалением папки гит на локалке, initом нового проекта на локалке уже без пароля в файлах и пушем в гитхаб? А можно как-нито сказать "удалите пожалуйста историю до такого-то коммита"?
408 1459075
>>59037

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

У Гитхаба есть мануал: https://help.github.com/en/articles/removing-sensitive-data-from-a-repository
409 1459084
>>59075
Благодарю, то что нужно
410 1459108
Совсем никаких подсказок по этому >>58550
? Эх...
411 1459306
Уже не надо. Всё решил одним апдейтом, как и хотел.
>>59108
412 1459317
ПАМАГИТИ

Смотрю вот это обучающее видео и повторяю практически все, как там есть:
https://www.youtube.com/watch?v=xihMCwARRpk

Разве что название сайта я поставил свое, плюс у меня не MySQL, как у автора, а MariaDB, но я читал, что они практически идентичны, т.к. мария - ответвление SQL. По идее все эти вещи никак не могут стать причиной ошибки, которую я получил.

Я уже где-то на 26-27 минуте видео. Не знаю даже, с какого лучше момента это смотреть, чтобы понять суть моего трабла.

В общем, автор ролика там собирается из базы данных вывести на сайт названия категорий статей в шапке. У него это получается, а у меня нет, потому что вылезает ошибка. У него тоже вылезают ошибки зачастую, но он их по ходу дела быстро исправляет. Я же так и не понял, что в моем случае не так.

Я запоролся на том моменте, где надо в конфиге прописать require, чтобы подключить db.php.

Мне выдает ошибку, что такого файла нет (см. скрин). Но файл-то есть. И он находится в той же папке, что и конфиг. Что может быть не так с моим файлом или путем к нему? Не удивлюсь, если я проглядел что-то совсем уж очевидное. Такое часто у меня бывает, но сейчас что-то совсем долго не могу самостоятельно найти решение.

Кстати, заметил, что автор ролика когда делает какие-то подключения, в одном случае ставит помимо кавычек еще скобочки вокруг ссылки, а в другом случае просто ставит кавычки. Я так понимаю, вообще без разницы, как это оформлять, но какой способ лучше?

Может кто-нибудь оценить актуальность и полезность этого ролик? А то вдруг я хуитой занимаюсь? Те туториалы, которые выложены в этом треде в шапке, я решил потом чекнуть. До этого учил html и css на сайтах codecademy и htmlacademy(по сути русский аналог предыдущего).
413 1459340
>>59317
Не надо смотреть всяких ютубных професси-аналов, тем более учиться по их хайповым высерам. Достань нормальные курсы с подачей и структурой материала, нормальным преподавателем и лабораторками. И не брезгуй задачами из ОПпоста.

Хуетой занимаешься.
414 1459344
>>59317

Будь внимательнее - ты опечатался в имени файла. Смотреть видео мне лень, скобки в require не требуются, значит, можно их не ставить.

MariaDB обратно совместима с MySQL и на ней все запросы должны работать нормально. Если что, список различий:

https://mariadb.com/kb/en/library/mariadb-vs-mysql-features/
https://mariadb.com/kb/en/library/mariadb-vs-mysql-compatibility/
415 1459384
>>59340
Кстати, а какие есть действительно годные курсы для новичка по php? Чтобы при этом не разжевывали по 50 минут мелочи, потому что я немного в теме.

мимо
416 1459414
Смотрю исходники вордпресса - ну там и ад. Всё валится в кучу - и шаблоны, и пхп-код, функции отдают на вывод когда захочется автору. Осспаде, что за продукт говнокодера? Похерено очень многое из принципов разработки - никаким солидом там и не пахнет даже рядом.
Узнал, что можно жс-код прямо в пхп-функциях прописывать, а потом выводить на страничку. У автора наверняка была шизофрения.
417 1459424
>>59344
Спасибо, анон. Ну я и даун. Удивительно, что я так долго не замечал этой опечатки. Хотя не исключено, что траблы со зрением сыграли свою роль.
418 1459452
>>59414

>вордпресса


Всегда было поделием для пиндосских домохозяек. Сорт оф эпл в мире бложиков. Чего ты ожидал?
419 1459458
как работает такая махина,как фейсбук?
420 1459494
>>59458
На реактивной тяге Цукера.
421 1459505
>>59452
По крайней мере теперь понятно откуда у пхпшников слава обезян за клавиатурой - благодаря таким вот мартыханским поделиям.
Я бы и сам так считал, если бы не знал, что это дикое легаси.
422 1459508
как вам статья?
http://phpfaq.ru/pdo
423 1459513
>>59508
Вроде норм.
424 1459521
там ларавел 6 вышел!
425 1459603
>>57771
Делай новый массив
426 1459626
Анонче, вкатываюсь в пыху дабы вкатиться в ойти любыми способами, закончить вышку и перекатиться в ПМы. Годный план?
427 1459702
>>59626
На кого учишься?
428 1459760
>>59384

>Кстати, а какие есть действительно годные курсы для новичка по php?


https://www.php.net/manual/ru/langref.php
429 1459900
>>59760
А видеокурсы?
430 1459944
>>53317
Пилю еще пару лайфаков.

Лайфак №2. List.
[$year, $month, $day] = $this->getCurrentCalendarDate($_calendar_name);
Иногда функции надо вернуть несколько значений, но городить отдельный объект данных зачастую лень, долго и нецелесооразно.
Тогда просто в функции возвращаем массив с нужными значениями, а потом распаковываем его в переменные с помощью list.

Лайфак №3. Общепогромистский.
Когда надо сформировать таблицу из N строк и K столбцов, то, как правило, делают 2 вложенных цикла.

Но можно обойтись и одним циклом!
Зачастую это очень полезно, когда таблицы разных размеров и количество строк и столбцов заранее неизвестно.

$cols = 4;
$result = [];

foreach ($array as $index => $value) {
$row = (int)\floor($index / $cols);
$col = $index % $cols;
$result[$row][$col] = $value;
}

Этот код сформирует таблицу из 4 столбцов и нужного количества строк.
Охуенно простая формула, целочисленное деление (с округлением вниз) + остаток от деления всегда дают точные номер строки и столбца для данных.
Во многих случаях облегчает жизнь.
431 1459983
режим обработки ошибок обязательно пихать в пдо?
432 1459986
Уважаемые пхписты, правда, что именно на пхп удобнее и выгоднее фрилансом заниматься?
433 1460011
>>59986
в мыВамПерезвоним тредах писали что платят за пшп меньше, но вакансий/работы в разы больше
434 1460026
Опчик, если у тебя будет время, посмотри, пожалуйста, список студентов https://github.com/baraboolka/StudentList
сайт http://koromiav.beget.tech/students/public/
435 1460031
>>60011
Платят меньше по сравнению с чем?
image.png41 Кб, 815x497
436 1460036
>>46969 (OP)
ДА КАКОГО ХУЯ БЛЯТЬ. Я В РЕЗЮМЕ НЕ ПИСАЛ ЧТО ЗНАЮ ВОРДПРЕСС ОНИ ЕБАНУТЫЕ?????
437 1460039
>>60036
Опарыш-неосилятор, ты?
438 1460042
>>60039
твой батя
439 1460051
>>59944
только что вышел из спячки

>[$year, $month, $day] = $this


Теперь можно без list($year, $month, $day) ?
Пили еще мне нравится.
440 1460067
>>60036
А что ты хотел, уча пхп?
441 1460070
>>60042
Припекло попочку рукожопу-неумехе, лол
442 1460071
>>60067
Я хотел создавать сайты. А не разбираться в готовых плагинах.
Помимо пхп я знаю кучу других языков. К тому же ПХП был в учебной программе, а вот вордпресс нихуя.

Пускай бухгалтерш сажают за вордпресс какого хуя программистов в этом разбираться заставляют?
443 1460072
>>60070
хочешь срать иди в б там посри. Здесь успешные люди сидят.
image.png629 Кб, 1913x680
444 1460074
>>60067
>>60070
Лучше объясните как эту ебалу всунуть в вордпресс. Мне самому компонент создавать придется? Я нихуя с CRM не работал ктонибудь ХЕЕЕЕЕЕЛП
445 1460076
>>60074
Нахуй ты берёшься за эту работу, если нихуя не имеешь опыта в вп? Дальше на дваче по каждому кейсу будешь помощи просить?
446 1460078
>>60072
Угу. Успех уровня /зк.
447 1460082
>>60076

>Нахуй ты берёшься за эту работу, если нихуя не имеешь опыта в вп?


ВО 1) вакансия без опыта работы. Т.к. я сам без него. Там были скилы php js mysql и тд стандартный набор. Я откликнулся потому что думал меня там азам научат, что логично, потому что вордпрессу в учебных заведениях не обучают.
ВО 2) в резюме указан гитхаб аккаунт с моими проектами. Смысла в тестовых заданиях я не вижу по этой причине.

>Дальше на дваче по каждому кейсу будешь помощи просить?


>кейс


Смешной язык у тебя. Нет не буду просить.
448 1460083
>>60074
Моё лицо когда попросили запихать верстку в вордпресс.
449 1460086
>>60083
Верстка (спизженый слайдер) без футера и хедера. Но даже так я не ебу как это сделать. Реквестирую хоть малейшую помощь.

Мне было бы проще сделать это задание на голой пыхе в десятки тысяч раз.
450 1460119
>>60086
Попробуй там https://2ch.hk/web/res/109087.html (М) поспрашивать
451 1460140
Что помимо php необходимо знать, чтобы можно было откликаться на вакансии и не быть посланным из-за того, что знаешь недостаточно или вообще нихуя?
452 1460190
>>60086

Возможно, они проверяют твою способность разобраться в технологии. Возможно, им нужны только те, кто знает ВП. Либо ты делаешь, либо сидишь дальше жалуешься на жизнь в перезвоним-треде.

Вордпресс - это блоговый движок, который допускает расширение, как я помню, двумя способами: написанием тем (наборов HTML/PHP-шаблонов) и плагинов (PHP-код, добавляющий функционал в ядро вопрдпресса).

Вордпресс предоставляет тебе API, содержащее разные функции. Например, если ты делаешь шаблон страницы для вывода поста в блоге, вордпресс предоставляет тебе фукнцию, которая возвращает заголовок поста. Ты можешь его вывести, используя эту функцию.

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

Еще там есть виджеты - они добавляются в сайдбар блога.

Соответственно, для решения твоей задачи надо либо найти готовые плагин/тему, либо написать свои.

Вот документация по ВП: https://wordpress.org/support/

Вот документация по теме customizing: https://wordpress.org/support/category/customizing/

И тут, смотри, как много всего: https://codex.wordpress.org/Plugin_Resources

Ты можешь заметить, что в твоей задаче речь не о блоге. А кого это волнует? Значит, надо сделать блог, который выглядит как указано в задаче.

> Я откликнулся потому что думал меня там азам научат,



Ты с дуба рухнул? Учат в школе, колледже, на курсах. Коммерческой компании нужно зарабатывать, а не благотворительностью заниматься. Есть такая вещь, как internship (стажировка), но это в больших компаниях, которые могут себе это позволить, и там, я думаю, они учат каким-то специфичным внутрикорпоративным штукам (которым нигде в другом месте не учат). Так как учить вордпрессу нет особого смысла, его можно изучить самому или на курсах.
453 1460193
>>60074

Также, ты путаешь CMS и CRM. CRM - это штука со списком клиентов и заказов, которая помогает принимать звонки или делать обзвоны.
454 1460202
>>59317
ЗАМЕЧУ!

>localhost то же что 127.0.0.1


В свое время сильно погорел на этом на Винде. Пока писал везде localhost думал что код тормозит, искал где мог лохануться. Потом попросил друга запустить, а у него Линукс. И все залетало. Когда руки дошли это поменять у меня в коде, и все стало нормально, жопа хорошо так сгорела. До этого думал что программирование прямое как стрела, а оказалось рекой с камнями.
455 1460231
>>60193
опечатался соре. но все и так поняли что я имел ввиду
456 1460233
>>60190

>Ты с дуба рухнул? Учат в школе, колледже, на курсах.


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

Я смотрю ты спец, можешь посоветовать, что делать человеку без опыта в индустрии? Стоит ли идти буквально за копейки работать ради опыта или стоит сидеть дома, ебаться с тестовыми заданиями?
457 1460240
>>60086
Анон, я сам новичок, ничего дельного не посоветую. Но вот смотри, тебе же надо:
1.Инструмент, который бы в админке вордпресса давал возможность добавлять картинки для твоего слайдера
2.Выводить этот слайдер на страницу.

Скачал дистрибутив вордпресса:
https://ru.wordpress.org/download/
Установил его локально. Заходишь в админку - слева будет меню. В меню есть пункт "Медиафайлы" (\wordpress\wp-admin\upload.php). Этот компонент уже позволяет загружать файлы. Можешь грузить файлы через него, только добавляешь какую-нибудь галочку чтобы как-то различать просто файлы и свои - галерейные. Если хочешь - можешь вообще сделать копию этой страницы, переименовать в test.php, и перепрограммировать ее немножко, типа внутри путь к своей собственной папке поставить. Вывести твою новую страницу можно через файл menu-header.php, он выводит левое меню, я топорно вставил после 255 строки код
echo '<a href="test.php?post_type=page" class="menu-icon-page" aria-haspopup="false"><div class="wp-menu-arrow"><div></div></div><div class="wp-menu-image dashicons-before dashicons-admin-page"><br></div><div class="wp-menu-name">моя страница, скопированная с уплоад.пшп</div></a>';
и вроде работает. Если эту страницу подредактировать, поменять пути какие-нибудь, у тебя будет инструмент в админке для загрузки/редактирования твоих картинок. Останется в шаблоне главной страницы вывести загруженные файлы в верстку. Это очень топорный способ, по уму надо читать документацию, которую аноны выше предложили по созданию всяких модулей/плагинов. Но это может хоть как-нито помочь. Другой путь - сходить на рутрекер или другой ресурс, скачать плагин для вордпресса с каруселью и на его основе свой сделать
458 1460274
как на swoole делать сайт?
459 1460312
Привет
Решил что одному учиться грустно и ищe единомышленников, желательно адекватных с которыми можно обсудить проблемы/вместе писать проекты. Наверно это нужно писать в /soc но тем не менее.
Если что почта для связи korzinadlyamusnd,oraANUSgmaP\0ilPUNCTUMc,8Mom
460 1460317
Как мимокрокодил, хочу сообщить вам, что php - говно.
461 1460319
>>60071
Как раз программист и разберётся, даже начинающий. А вот крикливое хуйло без скиллов будет бегать по форумам и просить чтобы ему всё разжевали.
462 1460325
>>60071

А что ты хотел?
Php в России сейчас на 90%+ ВП, Юми и Битрикс.
Либо ращуй глаза перед отправкой резюме, либо пиздуй в другие языки, раз уж ты много их знаешь.
463 1460327
>>60312

>одному учиться грустно и ищe единомышленников


В смысле - всей кучей тех же студентов из ОПпоста писать? Зачем?
Тебе ментора искать надо, а не единомышленников.
464 1460331
>>60325
С другими языками сложности. Так как у меня все проекты веб, либо чисто фронтенд, либо пыха. Курсач и игру спейс инвайдерс на сишарпе делал. Мб их залить на гитхаб показать работодателю.

Как думаешь стоит ли на сишарпе поискать работу раз в рашке только вп, битрикс вместо пыхи?
465 1460332
>>60325
Алсо проблема в том что мне очень нравится веб-разработка, но и программирование тоже. Что делать собственно?
466 1460335
>>60331

На шарме тоже докуя веба.
Кури net core.
467 1460342
>>60335
Но жалко что в рашке это нихуя не популярно. Я же сидел на апворке ахуел сколько там заказов на сишарпе. Эх ну почему так?

+ я тока десктопные приложения умею пилить + немного асинхронных процессов изучил. Но нашему пынябизнесу это офк нинужна
468 1460357
>>60342

Ты чо баба?
Хватит ныть.
Просто найди любую работу программиста. Любую. Хоть ВордПресс, хоть сап, не к вечеру помянут.

А там уже учись дальше и сможешь найти любой проект/стек/коллектив/условия.
469 1460359
>>60071
Как же я тебе двачую блядь. Как заебали эти битриксы блядские.

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

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

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

Все cms это готовая хуйня для клиента - прогеру там делать нехуй. Есть готовые темы и плагины - пиздую в админку и кликай, пердолится с этим - это не программирование.

Отдельное горение возникает от того, когда клиенту надо поменять чтобы что-то готовое было другим блядь. ЕСЛИ ТЕБЕ НЕ ПОДХОДЯТ ГОТОВЫЕ РЕШЕНИЯ - ПРОСИ МЕНЯ НАПИСАТЬ СВОЮ ПРОГРУММУ НА ФРЕЙМВОРКЕ ИЛИ ВАНИЛЬНЫМ КОДОМ, А НЕ ПЕРДОЛИТЬСЯ С ЭТИМ ГОВНОМ
470 1460360
>>60140
очевидный mysql
html/css - это мастхэв для любого ЯП в принципе
js - тоже мастхэв для всех, но достаточно знать его по верхам

Зависит от того что за работа. Если написано, что надо знать Laravel, то надо его знать хуле.

По опыту скажу, что надо знать все, но тебя особо не ебут если не знаешь. Просто за то, что знаешь ЗП повышают.

Так например когда я устраивался я вообще толком не шарил в линупсах и администрировании серверов, расчехлился начал уметь это все настраивать - ЗП подняли, а я и не против - мне интересно.
471 1460364
>>60359

>Отдельное горение возникает от того, когда клиенту надо поменять чтобы что-то готовое было другим блядь.



Люто двачую. Это говно вообще за гранью моего понимания. Помню как-то знакомый подкинул работку добавить какой-то блять новый тип(?) для комерс плагина, я вп никогда не трогал(так и не трогаю) но деньги были норм и решил посмотреть что там. Короче у этого плагина есть своя архитектура и главный тип Product везде захардкожен как строка, просто по всему коду. Я, если честно, так и не понял что от меня хотят и почему нельзя использовать дефолтные значения, как это задумывалось авторами, но потом нашел платную версию за 30$ и скинул ссылку.

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

Мне это напоминает какое-то болото, клиент использует какой-то популярный продукт, который не всегда к месту(интернет магазин на вп это сильно конечно), а потом на фрилансе заказы в стиле "всего лишь добавить один дропдаун, если вы ебать охуенный спец то дело на 5 мин" а там на самом деле чтобы этот дропдаун добавить раком пол дня стоять потому что везде спагетти из говна и палок, и "разработчик" вместо того, чтобы написать 10-20 строк кода за 30 минут, пол дня сидит и кликает мышкой по настройкам, что-то руками вбивает в бд, хакает кор фреймворка и т.д.
472 1460379
>>60364
И чем фреймворк так сильно от цмс-ки отличается, кроме количества готового кода?
473 1460392
>>60379
Тем что в популярных цмсках лютый древний непролазный говнокод. А современные цмски с нормальным кодом как правило малопопулярны. Ну и в цмсках в большинстве случаев все зависимости захардкожены под друг друга, а в фреймворках с DI можно поменять все, даже небо...
474 1460393
Manga4you
- добавил пару сайтов
- починила автозум
- сделал кэширование страничек
В планах:
- Запоминать позицию на странице
- отправлять главу в кэш
475 1460396
>>60317
брикинг ньюс!
476 1460399
>>60082
Пидораха как есть. Идёт на работу, чтобы его научили. Качаешь вп и изучаешь.
477 1460400
>>60392

> современные цмски с нормальным кодом


это какие?
479 1460413
>>60392
Это не говнокод, это НАСЛЕДИЕ доООПшных времён.
480 1460418
>>60360
Сколько зарабатываешь?

мимо
мимо Дудь
481 1460445
>>60379

>цмс-ки


Работают на уровне пользователя - чтобы быстренько навасянить что-то из готовых плагинов и тем. Обычно довольно сильно ограничены по функционалу и заточены под что-то одно. Часто является морально устаревшей хуйней.
Много откровенных говнокодеров и плохая безопасность как следствие.

>фреймворк


Более низкий уровень - каркас приложения для программиста. Часто требуют некоторых умений и знаний для использования. Ограничений нет - можно писать хоть собственную цмс, форум, магазин, лэндос, твою мать, и аллаха.
Приложения на них являются чем-то вроде костюма по личной мерке, а не штамповкой из украденных на рынке цветных тряпок.
Разработка стоит дороже, но программисты, обычно, на них лучше + безопасность выше.
482 1460446
>>60445
а если писать на чистом пхп-это какая категория?
483 1460453
>>60445

>>цмс-ки


Алсо, являются сильно условно-бесплатными. Как только захочется сделать что-то большее чем стандартный шаблон с парой правок - для интернет-вывески, то сразу начнут доить по каждому пункту. Причём получишь за свои деньги штампованный продукт, который ещё и доводить до ума надо, опять же деньги.
Из бесплатного там только самый минимум.

Ковырял как-то модный у васянов элементор и охуел от того факта, что вообще все хедеры и футеры у них платные - это где они сайт без хедеров и футеров видели? То есть вообще все 10 штук. И далее везде такое.
484 1460456
как связать два кода,что бы результат одного перешел в другой и отобр на странице?
485 1460460
>>60446
Джун.
Никто вменяемый не будет писать коммерческие вещи на чистой пыхе - долго и дорого. Потом ещё и поддерживать это задолбаешься.
486 1460461
>>60456
1 Коды в одном файле - используй переменную
2 Коды в разных файлах - используй include
3 Коды в разных файлах и помещены в классы - используй автозагрузку классов. Например композером.
487 1460474
а как обезопасить то,что я передаю из формы в код?
488 1460475
>>60474
intval(), strval() и подготовленные выражения в pdo.
489 1460479
>>60405

>composer


Ясно.
490 1460480
>>60379
Основное отличие, с точки зрения разраба - фреймворки сделаны для того, чтобы можно было писать расширяемый/дополняемый/изменяемый код. ЦМС - чтобы подключать готовые решения из админки, править тамошний код - побочная хуйня.

Все дело в том, что клиентам почему-то кажется, что раз цмс - это почти готовая хуйня то ее и пилить меньше, в то время как больше времени ты проебешь на разбор того, как устроен очередной говноплагин, чтобы поменять там цвет какой-то залупы
491 1460483
вам нравиться работать с пхп?
492 1460485
>>60483
без мягкого знака
493 1460502
Интересная фича в Sublime Text 3:
Можно выделить всю строку если нажать на ее номер. Так-же можно выделять несколько строк.
494 1460506
>>60502
И еще одну фичу нашел — можно создавать новый файл при двойном клике на поле с вкладками.
Список студентов 495 1460537
Оп, доделал твоё задание со списком студентов, проверь пожалуйста.
Чувствую наговнокодил.. но вроде всё работает..
Правда поиск только по одному слову ищет, так и не понял как сделать поиск по нескольким словам(а нужен ли он вообще?).
https://github.com/hikkej/student_list
496 1460540
>>60506
>>60502
Абалдеть. А блоки кода можно схлопывать?
497 1460614
>>60399
А где по твоему опыт я буду брать? Из онлайн туториола? Чтобы потом работодатель говорил "мы нитак делаем пошел нахуй"?

И вообще что значит научили? Программировать я умею а вот в сраном ВП не шарю. Здесь нет моей вины.
498 1460617
>>60357
Да было бы все так просто. У меня фобия что из-за того что нет военника меня никуда не возьмут. + все вакансии это вп ебучий.
499 1460623
>>60453
Посмотри сколько Битрикс стоит
500 1460636
>>60399

>Качаешь вп и изучаешь


я не он, но кто его кормить будет пока он учится? И кстати да, вп скачать можно, а вот битрикс...
501 1460639
>>60636
Бля с биртиксом делал тестовое неделю назад. HR говорит сделай за день ну я и сделал в итоге он начал пиздеть что нихуя не может проверить. Завтра типа сможет. Но завтра он не написал и вообще нихуя не ответил.
Наес тестовые задания))))))))
Алсо реквестирую способы борьбы с такими пидорасами.
502 1460644
>>60639
Вангую что они уже нашли кого то.
503 1460649
>>60636
Битрикс тоже можно скачать.
Мимо, ковыряюсь в нем
504 1460660
>>60623
Доплачивать всё равно придётся.
505 1460661
>>60636

>кто его кормить будет пока он учится?


А кого это ебёт? Работодатель ему мамочка что ли? Повзрослейте уже.
506 1460668
>>60661

>Повзрослейте уже


по твоей логике выходит, что ты сразу из роддома работать пошел? Тебя самого родители не обеспечивали?
507 1460669
>>46969 (OP)
Какую зп джуну просить в дс2 без опыта работы?
508 1460674
>>60669
Людям из дс-ов вообще платить не надо. Они - кровопийцы и сосут последнее из наших регионов.
509 1460676
>>60668

>по твоей логике выходит


>сразу из роддома работать пошел


У тебя проблемы с пониманием контекста?
Речь о работодателе идёт.
510 1460679
>>60674
Все деньги Москва сжирает, а потом перераспределяет по регионам. Так в чем виноват я житель дс2?
511 1460688
>>60669
50-55 если ты хорош в пет-проектах и тех интервью.
512 1460710
Может тупой вопрос, но можно ли как-то сделать так, чтобы при создании какой-то новой хуйни в базе данных на phpmyadmin ей, согласно автоинкрименту давался айди не в зависимости от того, какой она по счету в принципе создается, а в зависимости от того, какой самый большой айди уже имеется в базе данных?
Не очень понятно сформулировал, наверное. Суть в том, что, допустим, если я удаляю из базы данных что-то с айди 7, к примеру, то при создании следующего объекта ему будет присвоен 8-ой, в то время как я хочу, чтобы был 7-ой айди, потому что он не занят после удаления старого. В общем, как сделать, чтобы так сделать? Сорри за косноязычность.
513 1460711
>>60710
Это делается тригерами.
514 1460714
>>60710
Анон, а зачем тебе так делать? Если ты хочешь в таблице, например, фамилий вывести слева столбец с красивыми числами по-порядку, то это не айдишники надо выводить, а тупо сделать какой-нибудь $num-плюс-плюс. Зачем еще такая штука может понадобиться?
515 1460718
>>60714
Я вывожу статьи. У каждой свой айди. Мне не нравится, что после удаления некоторых "тестовых" статей из базы данных, их айди уходят в небытие, а остаются только те, которые не удалялись, но при этом айди для новой статьи выводится в зависимости от того, сколько уже статей создавалось, а не отсчитывается от последнего созданного айди с прибавкой единицы.
516 1460719
>>60711
Вот этими?
https://habr.com/ru/post/37693/
Спасибо. Еще бы какой-нибудь гайд по этим триггерам исчерпывающий.

Я пока что совсем новичок в программировании.
image.png55 Кб, 670x520
517 1460731
Аноны, простите за тупой вопрос. Учу ларавель по скачаному видеоуроку про форум на английском. Так вот парень который снимал один раз использовал be(), а в другом уроке начал юзать actingAs(). Собсна вопрос: а какая разница между ними, если один метод просто вызывает другой. Если так, то зачем он нужен?
518 1460736
>>60688
Бля стояло 50к и ни одна сука не взяла на работу. Такое ощущение что туда приходят додики за 35к. В итоге рыночек решает что я не рентабелен. Может такое быть?

Стоит ли мне понизить планку до 35-45к ради опыта работы?
519 1460737
>>60718
Да и нормально. У тебя какой-то нездоровый перфекционизм.
520 1460747
>>60736
Что значит стояло? На собесе обсуждали зарплату?
Что умеешь вообще?
521 1460748
Сап, анон, нужно завернуть xml с рандомного сайта, как сделать не используя curl?
522 1460756
>>60614
Опыта набираются во воемя учебы. Скачал виртуалку, развернул вордпресс, открыл вакансии с вордпрессом, откликаешься на заявки и клянчишь тестовое задание, делаешь их, самые мнтересные в гитхаб. Вот тебе и опыт.

Дебил ты ебаный ну сколько тебе лет? Залупа ты дроченая, ну хуле ты такой тупорылый?
523 1460757
>>60636
Волка ноги кормят. Ещё один даун блядь. Учится надо в перерывах между работой. Хоть грузчиком, хоть таксистом, а в свободное время учеба.
524 1460761
>>60747

>Что значит стояло?


Значит что я сейчас думаю делать ли ниже ЗП в резюме на хх.ру.
В данный момент стоит 50к рублей. Изначально в начале августа при создании резюме я столько указал.

>На собесе обсуждали зарплату?
С одной hr-кой в пулково 3. Она сказала что устраивает. Еще один "бос" Михаил Грохотов игнорщик с битриксом сказал что устраивает.

>Что умеешь вообще?


Умею PHP, Symfony, MySQL, JS ES6, HTML5, CSS.
Хорошо владею C# + изучали в шараге С/С++, Delphi, pascal, assembler.
Сам я дипломированный специалист.

>>60756
Мне 20 лет. А вообще пошел нахуй с таким общением.
525 1460773
>>60761
Ты очень "душный тип", судя по постам. Возможно отлетаешь из-за people skills.
По частям:

>Умею PHP, Symfony, MySQL, JS ES6, HTML5, CSS.


На гитхабе есть что показать сложнее круда?

Все упирается в код, техническое собеседование и общую адекватность.

>Хорошо владею C# + изучали в шараге С/С++, Delphi, pascal, assembler.


Это в резюме не клади. Оно сразу в корзину улетит.

>Сам я дипломированный специалист.


"имею профильное образование"

Как ты в 20 лет уже с дипломом, поступил в 15?
526 1460777
>>60773
Я же писал что в шараге учился "изучали в шараге". Конкретно ФСПО.
Мне люди никогда не говорили что я душный. Наоборот веселый позитивный.

Хорошо уберу лишнее из резюме.

Но как поступить с заработной платой? Ты сам с какого города?
527 1460779
>>60761

> Мне 20 лет. А вообще пошел нахуй с таким общением.



Шлюха, слушай старших, если у самого ума нет нихуя. Как ты собрался выживать без мамкиной сиськи? Девочка, ты будешь сидеть итт и внимать всему, что я тебе скажу. Ты ещё мал и глуп, чтобы выёбыаться и своё мнение навязывать. Понял, блядь?

Я хуею с вас дебилов малолетних как вы не можете крутится и прокладывать свою дорогу. Всему вас мудаков учить надо.

Ох блядь и дуры вы дурные.
528 1460786
>>60614

>Программировать я умею а вот в сраном ВП не шарю


Значит не умеешь.
Что за нытьё вообще? Либо умеешь и делаешь, либо идёшь нахуй с поезда.
529 1460850
>>60757
Ты лицемер. Уверен, тебя все детство содержали родители, кормили, одевали. И что-то я не думаю, что ты отвергал их помощь, крича "Я ВОЛК МЯМЯ РЫЫЫ!" И мат тебя не красит, ты не выглядишь взрослее и мужественней, наоборот, мат - это показатель идиота
530 1460852
>>60748
а через file_get_contents не получается?
531 1460859
>>60850
С чего ты решил, что работодатель должен к тебе относиться как родитель? Ты у начальника ещё сисю попроси в обед - быстро трудовую на руки получишь.
532 1460869
>>60859

Прекращайте бесполезный флуд, тут не тред перезванивающих.

>>60773

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

>>60756

Не умеешь нормально общаться, лучше ничего не пиши.

>>60736

Жалобы на работодателей в тред перезвонивших.

>>60731

С виду смысла нет.
533 1460872
>>60869

>Прекращайте бесполезный флуд


А то что?
534 1460883
>>60850
Я изрекаю мысль как хочу, обилие мата доставляет мне эстетическое удовольствие.

Касаемо твоего высера - я с 15 лет работаю. К слову мне сейчас 32. Начинал я как принеси, подай, пошёл нахуй, не мешай. И не разрабом, а в сраном автосервисе. Среди моих знакомых не было ни одного человека, кто бы увлекался вебом. Даже в местной шараге, в которой я учился, я единственный кто писал диплом про веб разработку. Преподы вообще нихуя не поняли про что диплом.

>>60869
Я умею общаться, но когда вижу инфантильных мальчиков меня аж клинить начинает. Жаль, что мы не спартанцы. Тебя бы сразу с обрыва сбросить нахуй надо было бы.
535 1460927
>>60718
Пользователь сохранил в избранном на статью с большими хуями, ты ту статью удалил, а id теперь принадлежит статье с сиськами. И вот хочет пользователь подрочить вслатсть, открывает избранное, переходит по автоматически сгенерированной ссылке, а ты ему вместо хуёв сиськи подсовываешь. Плохо, нельзя так делат.
536 1460931
Сап, аноны. Как в 2к19 стоит писать интернет-магазины и прочие порталы с регистрацией и активностью пользователей? Сам я рачелло еще тот и склоняюсь к тому,чтобы все ручками клепать. Собственно я и хочу узнать как кто пишет подобные проекты.
537 1460933
>>60718
Так и должно быть, иначе у тебя получается не удаление статьи, а замена одной статьи на другую.

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



Для урл наверное лучше генерировать какой-то уникальный slug из названия статьи, так ты скрываешь сколько у тебя в общем статей на сайте, это вроде как лучше для сео и т.п.
538 1460934
>>60931

Самопис дает возможность сделать что угодно, но стоит больше денег (либо времени на разработку). Крупные торговые сети вроде как обычно пилят что-то свое. CMS позволяют быстро создать шаблонный магазин, иногда без программирования, но кастомизация (например: скидочные программы, логика оформления заказа и тд) может быть болью.

Хороший разработчик способен разобраться и в том, и в том.
539 1460948
>>46971
Ставлю ; после }, отбиваю вложения табуляцией.
540 1460950
>>60934
Я вкатывальщик 19 лвла, есть заказ на автомобильный магазин. Клиент не шарит вообще и был найден по сарафанному радио ( т.е не крупная какая-то сеть, а частник). Последние два дня повкатывался в CMS (Modx,WP). В целом я как программист могу и обойтись без этого. Но хочется с этим проектом продвинутся в теме современного веба, А то мне подумалось что самописы это изобретение велосипедов, поправь мои рассуждения, если я не прав.
541 1460959
>>60931
Интернет-магазины сейчас не нужно писать, это глупо. Там до жопы фич нужно, заказы, корзины, интеграции с платёжными системами, выгрузки, купоны, акции, скидки, витрины, напоминания, dwh и прочая и прочая.
Полноценно писать такую систему очень долго (несколько лет) и сложно (потому что это коммерц, там много нетривиальных задач), и написать её хорошо сразу не получится (те системы, что уже есть на рынке, развиваются и пишутся последние лет 10, множеством программистов).
Конечно, можно начать с нуля и потихоньку наворачивать одну фичу над другой, но во-первых это будет обрекать тебя на цикл разработки сразу же, как захочется хоть что-нибудь изменить, а во-вторых некоторые вещи вроде event sourcing'а закладываются в архитектуру сразу же и я не верю в то, что ты сумеешь заложить сразу всё правильно.
Да и бизнесу это всё не нужно.
Короче, если у тебя рядом (или ты сам) сидит мамкин бизнесмен и хочет себе интернет-магазин - бусть башляет 1000 рублей любой онлайн-платформе для этого и получает сразу вообще всё готовое. Максимум, потратится на дизайнера и фронтендщика. Зато ему не придётся думать о хостинге, бекапах и прочем.
Если есть твёрдое решение хоститься у себя - берите уже готовое решение, магенту, друпал коммерц (есть сборка commerce kickstart), вордпресс (у него должны быть плагины) и т.п.
542 1461002
>>60872
угомонись, матершинник. Ты не вписываешься в тред. Советы дельные не даешь, всех оскорбляешь. Здесь новичкам помогают, а не матерят их. Поищи себе другую доску, уверен в /au ты найдешь единомышленников. Там и тачки можно обсудить, и свою зазнобу, и тугосерю, и спорт - все, что интересно человеку, начавшему трудовой пусть в пятнадцать лет с разгрузки товорняков с зеками
image.png95 Кб, 1360x768
543 1461009
Двачик помоги в пхп слаб!
image.png96 Кб, 1360x768
544 1461024
1.jpg35 Кб, 800x375
545 1461032
>>61009
анон, я сам слаб в пшп, вот сам код, который уже работает, но без запроса командной строки о вводе твоих чисел. Погугли как это делается
546 1461048
Здравствуйте, тред как всегда фиг найдешь. Пусть и не релейтед но мб кто знает ответ на мой вопрос. Все таки мой родной тред.

Есть старый сайт который пилится уже 10 лет, на нем обычная перезагрузка страниц, никакого спа. Заказчику нужно прикрутить на сайт систему звонков и прочего. У сторонней системы которую интегрируем есть виджет звонков, не вездесущее "мы_вам_перевозним_через_2_минуты_вы_только_оставьтетелефон-говно" , а реальное voip на js'e, который как я понимаю заточен под спа и работает на реакте (в доках написано, сам я не знаю что там на самом деле).

В общем есть проблема с тем, что при перезагрузке кусок js'a который отвечает за этот виджет эхается снова, по новой загружается виджет и все такое. А нужно что бы пользователь мог общаться без разрывов, перезагрузок сессий и прочего и при этом продолжать серфить сайт потенциально, то есть не быть привязанным к одной странице на время звонка.

По сути вопрос в том, что есть ли какой-то механизм, когда пользователь ливает со страницы на другую, то какой-то окуклить js и перенести его на другую страницу?
547 1461054
Поздно вкатываться в пхп в 25 лет? Если на сях пишу, прошиваю микроконтроллеры.
548 1461057
>>61054
Зачем? Хз смотря что хочешь делать.Так же можно легко угодить не в программирование на пхп а в разработку на вордпрессе, модх, опенкартах и прочем дерьме. Будешь не прогать а васянить одну херню к другой.
549 1461064
>>61057

>Будешь не прогать а васянить одну херню к другой.


Не понял.
550 1461076
>>61002
Шизоид, ты сейчас с другим человеком переписываешься.
В тред не вписываешься именно ты, со своими дружбой и понями. Вали на свой доброчан, двуличная скотина - заебал со своим нытьём.
Кто тебе вообще право дал - других одёргивать? У тебя гондурас опух выше всякой меры и хуесосят тебя тут по делу.
551 1461077
>>61048
Пытаться делать стабильный js внутри перезагружающейся веб-страницы противречит логике работы браузеров и, поэтому, бессмысленно.
Просто открывай по клику на это говно новое окно/вкладку, в которой уже и будет колл. Google так же делает в своём Hangouts по той же самой причине - при клике на видеозвонок открывается новое окно.
552 1461082
>>61064
Он про то, что есть куча вакансий, заключающихся в формошлёпстве, где ты двумя заученными клацами по веб-интерфейсу в CMS-ке будешь накликивать примерно то же самое день за днём. Такое сайт-кликерство - это низшая квалификация "веб-разработки" и потому презирается.

По теме, вкатываться никогда не поздно, но, как и всегда, лучше приложить максимум усилий для поиска достойного работодателя. Тебе потребуется работадатель с современным стеком (только symphony / laravel, всех васянов с yii/вордпрессом/самописками/прочим говном посылай сразу нахер), поставленным процессом(git, dev-stage-prod, код-ревью, ci/cd, докер и всё такое) и системой наставничества, чтобы ты мог получать знания от компетентных людей.
В противном случае влезешь в говноконтору и там и залипнешь на неопределённый срок, да ещё и плохих практик нахватаешься (а узнать, плохие они или хорошие не сможешь, т.к. опыта нет).
553 1461097
>>61076

>Кто тебе вообще право дал - других одёргивать?


это ты, дурачок залетный, закатился в тред и начал всех оскорблять.

>и хуесосят тебя тут по делу


Почему во множественном числе? Ты типичная слабовольная овца, что ищет поддержки и апеллирует к какому-то стаду? Повторяю, тред создан для помощи новичкам, помощь не предполагает оскорблений и флуда. А ты только флудишь и оскорбляешь. Для тридцатилетнего ты слишком глуп
554 1461107
>>61097

>залетный


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

>Почему во множественном числе?


Потому, что не я один так считаю.

>тред создан для помощи новичкам, помощь не предполагает оскорблений и флуда


У тебя ебать какие комплексы по этому поводу, да? Из треда в тред твердишь свою мантру. Видать тебя везде хуями кроют раз у тебя такая фиксация. И немудрено.

>только флудишь и оскорбляешь


Тебя ебать это не должно, полицай.
555 1461120
>>61082
кех

>только symphony / laravel


>yii



пора бы уже давно выкатываться из интерпрайз медленного говна
https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=query&l=zik073-f

>самописками


тот же баду самописка сомнительно что это плохая контара

>поставленным процессом(git, dev-stage-prod, код-ревью, ci/cd, докер и всё такое)



тут +

>системой наставничества, чтобы ты мог получать знания от компетентных людей


как ты это определишь если

>т.к. опыта нет



алсо в ПХП сейчас эра аутсорса , аутсорс бизнес постраоин чем быстрее тем лучше , потому на рынке сейчас 70% в СНГ подобных котор
556 1461136
>>61120
Бенчмарк нерепрезентативен, потому что узкое место в 99% это либо база, либо крайне плохой код.
Тем более, slim, phalcon, reactphp и симфони в одном месте - это что-то совсем странное. Одно - микрофреймворки и наборы компонентов для написания ассинхронного кода, а второе - это, блин, полноценный фреймворк.
Симфоня же пропагандирует принципы хорошей архитектуры и компонентного подхода, за что ей плюс. Да и я бы не сказал, что она медленная.

> тот же баду самописка сомнительно что это плохая контара


Поработав на каком-нибудь ларавеле раз - ты легко переключишься на другой проект, что даёт тебе больше возможностей при поиске работы. А вот второго badoo как-то и нет, да и задачи там придётся решать далеко не те, что в большинстве других компаний. Из-за этого тоже не так просто потом будет работу менять.

> как ты это определишь если


По отзывам от действующих сотрудников и ответам на вопросы о наставничестве на собеседовании.

> алсо в ПХП сейчас эра аутсорса , аутсорс бизнес постраоин чем быстрее тем лучше , потому на рынке сейчас 70% в СНГ подобных котор


Я работал на аутсорсе до недавнего времени. Симфони-компоненты (за счёт того, что все проекты были построены на одном стеке - очень легко было шарить знания и просить помощи), dev-stage-prod, ci/cd, и т.п. Не сказал бы, что плохо или что был слишком большой перевес в сторону скорости в ущерб качеству.

> нтерпрайз медленного говна


Ну и да, этой теме уже лет 10, но я всё же выскажусь. Такие вещи, как симфони, дают небольшой оверхед в начале перед тупым кастомным кодом, но очень быстро начинают себя оправдывать за счёт грамотного структурирования кодовой базы и архитектуры, позволяя строить сложные приложения большим командам разработчиков. А вот те, кто начинают разрабатывать с принципом "нахер всё, делаем максимально просто на кастомном коде" очень быстро с нарастанием кодовой базы превращают проект в огромный неподдерживаемый сгусток кода (как-то так: https://www.bangkokpost.com/media/content/dcx/2018/05/04/2749833_620x413.jpg).
Далее, "медленный" - это понятие относительное. быстрее почти всегда будет код на си - но мы же что-то не нём разрабатываем, правильно? Бизнесу не нужно оптимизировать микросекунды, ему нужна примемлемая скорость разработки с приемлемой скоростью отдачи данных пользователям. Своего рода компромисс.
Учитывая пред-загрузку файлов, кэширование на самых разных слоях (включая грядущий JIT), современные компьютерные мощности и производительность современного PHP - писать код можно во вполне широких пределах, жертвуя миллисекундами в угоду читаемости кода и его поддерживаемости.
Уточню, я не имею ввиду "говнокодим и пофиг, оперативка дешёвая", я имею ввиду - слой абстракции, котороый структурирует код, упростив какие-то вещи, но будет требовать создания одного-двух объектов в рантайме - это неплохой компромисс.
Но всегда нужно руководствоваться критерием разумности и оправданности, конечно.
556 1461136
>>61120
Бенчмарк нерепрезентативен, потому что узкое место в 99% это либо база, либо крайне плохой код.
Тем более, slim, phalcon, reactphp и симфони в одном месте - это что-то совсем странное. Одно - микрофреймворки и наборы компонентов для написания ассинхронного кода, а второе - это, блин, полноценный фреймворк.
Симфоня же пропагандирует принципы хорошей архитектуры и компонентного подхода, за что ей плюс. Да и я бы не сказал, что она медленная.

> тот же баду самописка сомнительно что это плохая контара


Поработав на каком-нибудь ларавеле раз - ты легко переключишься на другой проект, что даёт тебе больше возможностей при поиске работы. А вот второго badoo как-то и нет, да и задачи там придётся решать далеко не те, что в большинстве других компаний. Из-за этого тоже не так просто потом будет работу менять.

> как ты это определишь если


По отзывам от действующих сотрудников и ответам на вопросы о наставничестве на собеседовании.

> алсо в ПХП сейчас эра аутсорса , аутсорс бизнес постраоин чем быстрее тем лучше , потому на рынке сейчас 70% в СНГ подобных котор


Я работал на аутсорсе до недавнего времени. Симфони-компоненты (за счёт того, что все проекты были построены на одном стеке - очень легко было шарить знания и просить помощи), dev-stage-prod, ci/cd, и т.п. Не сказал бы, что плохо или что был слишком большой перевес в сторону скорости в ущерб качеству.

> нтерпрайз медленного говна


Ну и да, этой теме уже лет 10, но я всё же выскажусь. Такие вещи, как симфони, дают небольшой оверхед в начале перед тупым кастомным кодом, но очень быстро начинают себя оправдывать за счёт грамотного структурирования кодовой базы и архитектуры, позволяя строить сложные приложения большим командам разработчиков. А вот те, кто начинают разрабатывать с принципом "нахер всё, делаем максимально просто на кастомном коде" очень быстро с нарастанием кодовой базы превращают проект в огромный неподдерживаемый сгусток кода (как-то так: https://www.bangkokpost.com/media/content/dcx/2018/05/04/2749833_620x413.jpg).
Далее, "медленный" - это понятие относительное. быстрее почти всегда будет код на си - но мы же что-то не нём разрабатываем, правильно? Бизнесу не нужно оптимизировать микросекунды, ему нужна примемлемая скорость разработки с приемлемой скоростью отдачи данных пользователям. Своего рода компромисс.
Учитывая пред-загрузку файлов, кэширование на самых разных слоях (включая грядущий JIT), современные компьютерные мощности и производительность современного PHP - писать код можно во вполне широких пределах, жертвуя миллисекундами в угоду читаемости кода и его поддерживаемости.
Уточню, я не имею ввиду "говнокодим и пофиг, оперативка дешёвая", я имею ввиду - слой абстракции, котороый структурирует код, упростив какие-то вещи, но будет требовать создания одного-двух объектов в рантайме - это неплохой компромисс.
Но всегда нужно руководствоваться критерием разумности и оправданности, конечно.
558 1461161
>>61136
так то посыл все верен , только как пользоваться молотком (фреймом) ломать головы или бить гвозди дело сугубо пользователя , по сему как строить грамотную архитектуру это уже к разработчикам а не фреймам , асинк фреймы всё больше набирают обороты , и это очевидно логично в эру микросервисной архитектуры потому на всякие swoole я бы обращал по более внимания. Но в основном с картинкой да ты прав, хотя опять таки это если мы пишем монолит.
559 1461179
>>61161

> Монолит


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

> Асинк


Просто по статистике с сайтов вакансий, асинк пока не особо популярен. Да и никто не мешает делать асинк и симфони одновременно.
Тем более, что асинк сам-по-себе в пхп сделан через костыли. Я бы писал на обычном классическом php-fpm с симфоней обычный монолит, а узкие части писал бы на golang.
560 1461230
>>61179
Дико извиняюсь за тупой вопрос а как использовать php с другими языками на одном сервере?
561 1461244
>>61179
пожалуй под всем подпишусь анончик , спасибо за лайтовый конструктивный разговор ,

разве что асинк должен появиться как стандарт в языке 8 пхп
562 1461245
>>61230
нечего не мешает делить запросы через тот же nginx между разными софтинами на разных языках
563 1461246
>>61230
>>61245
так же ещё вполне возможно через очереди например
564 1461266
>>61230
В итоге у тебя получаются несколько приложений, одно центральное - это монолит, а прочие - это сервисы, которые отвечают за отдельные аспекты функциональности, требующие производительности или специфических фич (вебсокеты, нейронки, многопоточная обработка).
В итоге у тебя возникнет три задачи, обеспечения этих сервисов, доступа к ним и поддержки.
Первое решается множеством способов в зависимости от стека, требований и просто вкусов создающих. Самый тупой и сомнительный вариант - запускать прямо из php через shell_exec. Самый простой из нормальных - поднимать всё ручками, рядом или на соседнем сервере. Самый хайповый - это kubernetes и прочие системы оркестрации.
По поводу второго камрады из
>>61245
>>61246
уже высказались. Тут нужно определиться с двумя вещами, типом взаимодействия и транспортом. Тип - это синхронные вызовы (по сути rpc, например, jsonrpc) или ассинхронные (событийность, подписка/отписка). Транспорт же может быть любым, это могут быть сетевые вызовы (http-запросы), может быть брокер сообщений (отдельная система по доставке, например, rabbitmq) или твои сервисы могут просто пользоваться одной и той же базой данных (сомнительный вариант, но иногда встречается).
Третье - это поддержка, и связан он с тем, что такие распределённые (состоящие из нескольких узлов) системы не так просто поддерживать, например, дебажить. Из очевидного, каждая из этих систем должна писать свои логи и ты должен понимать, как ты будешь их деплоить (потому что они будут разворачиваться не одновременно, что вызовет временные отказы в связанных компонентах). Из неочевидного, это какие-то общие конфигурации и трасировка: ты должен предусмотреть возможность понять, к какому запросу в монолит у тебя относится твоя задача в стороннем сервисе. Делается не особо сложно, генерируешь на уровне входящего запроса случайный идентификатор REQUEST_ID, прокидываешь его во все последующие запросы и пишешь во всех логах. Таким образом, поискав по всем логам всех сервисов по этому REQUEST_ID, ты поймешь кто и что вызвал, и почему.
Ну и в принципе, правильное логирование - залог стабильной системы.
564 1461266
>>61230
В итоге у тебя получаются несколько приложений, одно центральное - это монолит, а прочие - это сервисы, которые отвечают за отдельные аспекты функциональности, требующие производительности или специфических фич (вебсокеты, нейронки, многопоточная обработка).
В итоге у тебя возникнет три задачи, обеспечения этих сервисов, доступа к ним и поддержки.
Первое решается множеством способов в зависимости от стека, требований и просто вкусов создающих. Самый тупой и сомнительный вариант - запускать прямо из php через shell_exec. Самый простой из нормальных - поднимать всё ручками, рядом или на соседнем сервере. Самый хайповый - это kubernetes и прочие системы оркестрации.
По поводу второго камрады из
>>61245
>>61246
уже высказались. Тут нужно определиться с двумя вещами, типом взаимодействия и транспортом. Тип - это синхронные вызовы (по сути rpc, например, jsonrpc) или ассинхронные (событийность, подписка/отписка). Транспорт же может быть любым, это могут быть сетевые вызовы (http-запросы), может быть брокер сообщений (отдельная система по доставке, например, rabbitmq) или твои сервисы могут просто пользоваться одной и той же базой данных (сомнительный вариант, но иногда встречается).
Третье - это поддержка, и связан он с тем, что такие распределённые (состоящие из нескольких узлов) системы не так просто поддерживать, например, дебажить. Из очевидного, каждая из этих систем должна писать свои логи и ты должен понимать, как ты будешь их деплоить (потому что они будут разворачиваться не одновременно, что вызовет временные отказы в связанных компонентах). Из неочевидного, это какие-то общие конфигурации и трасировка: ты должен предусмотреть возможность понять, к какому запросу в монолит у тебя относится твоя задача в стороннем сервисе. Делается не особо сложно, генерируешь на уровне входящего запроса случайный идентификатор REQUEST_ID, прокидываешь его во все последующие запросы и пишешь во всех логах. Таким образом, поискав по всем логам всех сервисов по этому REQUEST_ID, ты поймешь кто и что вызвал, и почему.
Ну и в принципе, правильное логирование - залог стабильной системы.
565 1461275
>>61266
А, ну и главное забыл. Ключ к правильной структуре приложения - это правильное разделение областей ответственности между компонентами (это не только в SOA, это в принципе так).
Соответственно, 95% логики должно быть в монолите, а в другие компоненты нужно выносить то и только то, что слишком тяжёлое/сложное/долгое для монолита. В идеале оно не должно быть связано с другими частями, будучи "чистой функцией": получает аргументы, возвращает результат, без вызовов в другие компоненты.
К примеру, у нас был монолит и нужно было генерировать огромные PDF'ки, что сильно выжирало процессор и оперативную память. Мы в тот раз написали отдельный маленький сервис, который получал данные для документа, генерировал pdf и слал её назад отдельным запросом. В итоге, мы вынесли тяжелый процесс в отдельное место (и он перестал влиять на производительность пользовательских запросов), сохранив неизменной бизнес-логику внутри монолита (методы "создай отчёт", "дай отчёт" остались в монолите, как и раньше).
566 1461339
Так аноны, знаю что я ахуевший, но все таки, собираюсь найти работу через 1 месяц, теперь расскажите что мне делать учитывая, что знаю неплохо питон и чучуть жс, то есть напишите план как вы бы с нуля в пхп до работы дошли, буду очень признателен и будет интересно почитать.
someApprentice !EaaiHmIJms 567 1461363
https://phpclub.tech/pr/res/1415604.html#1440220

>Вопросы по схеме БД:


>- что за URL указывается в поле message.content? URL на стороннем сервере? На своем? Если на своем, не логичнее ли вместо URL указать внешних ключ на таблицу файлов, либо какой-то идентификатор файла, из которого строится URL? Идентификатор удобен тем, что позволяет в будущем менять вид URL файла.



https://github.com/someApprentice/Crypter/blob/master/schema.sql#L93

А как составлять URL на основе идентификатора?

Изначально я хотел чтобы URL хранил в себе относительную ссылку от сервера, а в клиенте (то есть в html версии где строится ссылка), если меняется адрес хранилища, просто менять адрес хранилища в ссылках.

То есть, в БД message.url = "path/to/file.jpg", а при выдаче html версии склеивать эту ссылку с адресом хранилища.

Как лучше всего хранить записи о файлах, чтобы было гибко, при любом переносе данных можно было легко построить ссылку? Посоветуйте пожалуйста лучшую практику.

А ещё вопрос.

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

Лучше сразу на будущее делать таблицу, или можно оставить просто? А если потом всё таки делать реализацию нескольких ключей, то придётся переносить все ключи из user в новую таблицу? А если пользователей миллионы, это не будет времяёмкой задачей? Как обычно поступают в таких ситуациях?

>>50056

>>>- зачем нужна таблица participant, если есть conference_reference? Я не понимаю, чем таблица participant отличается от conference_reference.


>> Это денормализация чтобы получить конференцию по собеседнику, в случае приватных конференций


>


>Тут мне кажется, непонимание. Я вижу, что в таблице conference_reference есть поля-ссылки:


>


>- "user" -> на таблицу users


>- "participant" -> на таблицу users


>- conference -> на таблицу conference


>


>А еще есть таблица participant с такими полями:


>


>- user -> на таблицу users


>- conference -> на таблицу conference


>


>Соответственно вопрос, чем таблица participant отличается от conference_reference? Они обе содержат поля user и conference, и не хранят ли они одно и то же?


>


>В моем понимании диалог выглядит так: есть conference, есть 2 ссылающихся на него conference_reference (вид на диалог со стороны каждого собеседника). Что тут делает таблица participant? На нее нет внешних ключей, то есть никто на нее не ссылается.



>Соответственно вопрос, чем таблица participant отличается от conference_reference? Они обе содержат поля user и conference, и не хранят ли они одно и то же?


Нет, они хранят разные значения.

В случае conference_reference:
"user" - это пользователь которому принадлежит ссылка на конференцию

В случае с participant:
"user" - это конкретный получатель в конференции

То есть, пользователь может удалить свою ссылку на конференцию, но всё равно оставаться получателем и получать уведомления. Кстати у меня ошибка в коде и реализовано совсем наоборот. Исправлю.

>В моем понимании диалог выглядит так: есть conference, есть 2 ссылающихся на него conference_reference (вид на диалог со стороны каждого собеседника). Что тут делает таблица participant? На нее нет внешних ключей, то есть никто на нее не ссылается.


Таблица собеседников нужна для хранения всех собеседников в той или иной конференции. Это нужно для публичных конференций, а приватные представлены так же как и публичные, но только всего из двух собеседников.

>> builtins.TypeError: catching classes that do not inherit from BaseException is not allowed


>> except (InvalidSignatureError, UserNotFoundError, WrongTokenError, Exception) as e:


>


>Это скорее всего из-за того, что классы не импортированы или импортированы неправильно и Питон путает их с какими-то другими классами. Для надежности можно отркыть исходный код, где они определены, и проверить, что они действительно наследуются от базового класса исключений.


Да, они действительно наследуется от базового класса исключений https://github.com/jpadilla/pyjwt/blob/d25c92ca5e9980ca7bc8b31420bf36e3f4a9e3f0/jwt/exceptions.py#L16
someApprentice !EaaiHmIJms 567 1461363
https://phpclub.tech/pr/res/1415604.html#1440220

>Вопросы по схеме БД:


>- что за URL указывается в поле message.content? URL на стороннем сервере? На своем? Если на своем, не логичнее ли вместо URL указать внешних ключ на таблицу файлов, либо какой-то идентификатор файла, из которого строится URL? Идентификатор удобен тем, что позволяет в будущем менять вид URL файла.



https://github.com/someApprentice/Crypter/blob/master/schema.sql#L93

А как составлять URL на основе идентификатора?

Изначально я хотел чтобы URL хранил в себе относительную ссылку от сервера, а в клиенте (то есть в html версии где строится ссылка), если меняется адрес хранилища, просто менять адрес хранилища в ссылках.

То есть, в БД message.url = "path/to/file.jpg", а при выдаче html версии склеивать эту ссылку с адресом хранилища.

Как лучше всего хранить записи о файлах, чтобы было гибко, при любом переносе данных можно было легко построить ссылку? Посоветуйте пожалуйста лучшую практику.

А ещё вопрос.

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

Лучше сразу на будущее делать таблицу, или можно оставить просто? А если потом всё таки делать реализацию нескольких ключей, то придётся переносить все ключи из user в новую таблицу? А если пользователей миллионы, это не будет времяёмкой задачей? Как обычно поступают в таких ситуациях?

>>50056

>>>- зачем нужна таблица participant, если есть conference_reference? Я не понимаю, чем таблица participant отличается от conference_reference.


>> Это денормализация чтобы получить конференцию по собеседнику, в случае приватных конференций


>


>Тут мне кажется, непонимание. Я вижу, что в таблице conference_reference есть поля-ссылки:


>


>- "user" -> на таблицу users


>- "participant" -> на таблицу users


>- conference -> на таблицу conference


>


>А еще есть таблица participant с такими полями:


>


>- user -> на таблицу users


>- conference -> на таблицу conference


>


>Соответственно вопрос, чем таблица participant отличается от conference_reference? Они обе содержат поля user и conference, и не хранят ли они одно и то же?


>


>В моем понимании диалог выглядит так: есть conference, есть 2 ссылающихся на него conference_reference (вид на диалог со стороны каждого собеседника). Что тут делает таблица participant? На нее нет внешних ключей, то есть никто на нее не ссылается.



>Соответственно вопрос, чем таблица participant отличается от conference_reference? Они обе содержат поля user и conference, и не хранят ли они одно и то же?


Нет, они хранят разные значения.

В случае conference_reference:
"user" - это пользователь которому принадлежит ссылка на конференцию

В случае с participant:
"user" - это конкретный получатель в конференции

То есть, пользователь может удалить свою ссылку на конференцию, но всё равно оставаться получателем и получать уведомления. Кстати у меня ошибка в коде и реализовано совсем наоборот. Исправлю.

>В моем понимании диалог выглядит так: есть conference, есть 2 ссылающихся на него conference_reference (вид на диалог со стороны каждого собеседника). Что тут делает таблица participant? На нее нет внешних ключей, то есть никто на нее не ссылается.


Таблица собеседников нужна для хранения всех собеседников в той или иной конференции. Это нужно для публичных конференций, а приватные представлены так же как и публичные, но только всего из двух собеседников.

>> builtins.TypeError: catching classes that do not inherit from BaseException is not allowed


>> except (InvalidSignatureError, UserNotFoundError, WrongTokenError, Exception) as e:


>


>Это скорее всего из-за того, что классы не импортированы или импортированы неправильно и Питон путает их с какими-то другими классами. Для надежности можно отркыть исходный код, где они определены, и проверить, что они действительно наследуются от базового класса исключений.


Да, они действительно наследуется от базового класса исключений https://github.com/jpadilla/pyjwt/blob/d25c92ca5e9980ca7bc8b31420bf36e3f4a9e3f0/jwt/exceptions.py#L16
568 1461364
>>61339
А добавлю что html/css знаю.
569 1461412
можно ли на пхп замутить такое?
1 пользователь двигает объект с помощью жс
2 юзер видит это передвижение
570 1461461
>>61364
Я сделал пару пет проджектов: "музыку вконтакте", где можно было грузить треки и проигрывать их и ещё аналог гисметео, карту России с прогнозами погоды по городам (тянул из какого-то апи). Ну и вроде классический туду лист слепил.
Приходил на собесы с ноутом, говорил, что джуниор, но вот смотрите, что сделал.
Потом было тестовое в одну контору, сделать блог без использования фреймворков. Я написал свой mvc фреймворк и уже на нём сделал тестовое.
В итоге взяли.
Но это было уже лет 6 назад, если не больше.
571 1461491
>>61461
на какую зп?
572 1461497
>>61461
Спасибо за ответ, вот я тоже думаю запилить петпрожект, думал пару сайтов сделать, это лучшая практика, да и на собесе покажу сразу.
573 1461504
>>61461
Делал бота в телеграм, копался в темах вордпресса, парсил всякое говно, игрался разными с апи, лепил калькуляторы на жикуери и жс, тыкал палочкой ноду, есть гитхаб с собственной приватной помойкой на парочку проектов. MVC, паттерны, сотни статей в одно лицо и 60 часов лекций на старте. Дома давно уже стоит серверная убунта из старого нетбука на которой собираю всякое под нужду.

На работу не пробовался ещё. Стрёмно как-то.
574 1461517
Тест.
575 1461633
>>61491
Будучи совсем ничего не знающим джуном работал за еду 20к, но довольно быстро зп выросла до 50к, а потом и до 70к (с бонусами иногда переваливало за 100к). В моём мухосранске это вполне себе деньги, но в итоге я через несколько лет после первого найма поменял работу и там уже в районе 150к начал получать.
576 1461635
>>61497
>>61504
Советую запилить хотя бы один high-quality проджект, потому что

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


звучит, как "пробовал 100500 разных технологий, но всегда получалось говно". Ты пойми, как это будет выглядеть для работодателя. Твоё резюме будет смотреть сеньор (например, я). Он получит от HRа ссылку на твой гитхаб с просьбой оценить. Зайдёт на один проджект, посмотрит, поморщиться. Зайдёт на другой, блеванёт. На третий уже не зайдёт, напишет "чувак знатный говнокодер, в разработке не разбирается от слова совсем" и hr пойдёт писать тебе отказ (или тупо заигнорит, если овца).
Лучше собрать один эталонный проект по бест-практикам, который ты и будешь совать под нос всем работодателям.
Я бы взял laravel и реакт, прочитал бест практики, посмотрел примеры приложений и прочие скелетоны и написал бы, к примеру, двач. С анонимными постами, картиночками, тредами, цитатами, капчой и админкой. Ну и сверстал бы под мобилки его отдельно, конечно же.
Чтобы ревьювер (всё ещё, например, я) начал смотреть и такой: "Ага, паттерны. Ага, структура. Ага, конфиги. Ага, докер. Ага. Всё понятно, всё красиво, всё по стандартам. Ну вот тут шероховатости, но джуниор же, не страшно. Берём!"
577 1461669
>>61633
для 6 лет назад вполне себе знания нет?
578 1461671
>>61669
Не понял вопроса.
579 1461705
>>61635

>ТЫ ГАВНО А Я СИНЬЕР-РЕВЬЮЕР


Читаю такие высеры, и в очередной раз убеждаюсь, какое же среди прогеров высокомерное говно бывает. У нас на заводе был Дядьпаша такой же вахтер, который новичкам не помогал, а отбивал охоту работать. "Я бетон по часовой мешаю и вы мешайте, это технология!"

>ВОТ ТЫ СДЕЛОЛ МАЛЕНЬКИЙ ПРОЕКТ - Я ПОМОРЩЮСЬ И НИВАЗЬМУ ТИБЯ, А ВОТ КАК ТЫ ДВАЧ СДЕЛОИШЬ - Я СРАЗУ УВИЖУ СПИЦА!


А ты, дурачок, в его мелких проектах паттерны, структуру, конфиги не увидишь? Там стандарты какие-то другие? У тебя стандарты и красивый код от скольки-размерных-проектов начинаются?
Ты пойми, что ты мудак и отбиваешь человеку желание программировать. Почитает тебя ньюфаг и подумает вон "специалист" советует сразу большие проджекты писать, чтобы меня признали, сделаю как я фейсбук. И закономерно соснет, потому что он не знает как две переменные складывать, а ты его за большой проект сажаешь.
580 1461754
>>61635
Так-то у меня есть вещь, которую я 4 месяца на голом пхп задротил и 2 раза переписывал - там и паттерны и практики, и жопа с ручкой.
Обязательно фейсбук надо писать, чтобы очередной великий мастер оценил?
Про говно - ты сам придумал, а на деле за два дня это всё поднимается, если через композеровские либы делать. Да и дохуя как-то негатива у тебя в посте только на выдумке + какой-то подростковый максимализм.

Вчера вот на google cloud platform туторы проходил. Годно зделоли. Местными хостерами уже пользовался, теперь с этим хочу попробовать.
581 1461764
>>61705
Чувак, у тебя явно пригорает и/или ты обижен на кого-то, поэтому взрываешься тут на адекватные советы.
Я анону сказал правдивую вещь: засылай на ревью хороший код, потому что небольшой качественно сделанный проект в глазах ревьювера (например моих) будет весить больше, чем 10 некачественно сделанных проектов. Увы, мир так работает, что людей оценивают по результатам и показывать нужно лучшее, что можешь вообще продемонстрировать.
Стандарты и паттерны у меня начинаются сразу, я в принципе стараюсь плохой код не писать, даже если нужно по-быстрому наговнякать - чтобы не страдать при поддержке и не отвечать за плохой код в будущем (когда спришвают "что за плохой код годичной давности" обычно аргумент "эээ, ну там сроки горели" не проканывает).
Далее, про большие проекты я не писал, как и не отбивал охоту. что-то делать. Я сказал чуваку выбрать стек, изучить бест-практики (в которых будут и конфиги, и паттерны и всё такое) и сделать настолько хороший проект, насколько он сможет. К слову, "написать двач" - довольно изичный пет проджект, не виду ничего "большого", где новичок "соснёт".

> сделаю как я фейсбук


> не знает как две переменные складывать


Вот и узнает. Ты забываешь, что мы не в детский сад играем, и чем меньше джун знает, тем сильнее он сядет мне на шею, если я его возьму. Если он будет знать, что нужно использовать конфиги, нельзя писать весь код в одном классе и нужно использовать ORM вместо кастомных запросов, то это значит, что мне можно будет больше времени объяснять ему, как сделать задачу, нежели как пользоваться инструментами и как складывать переменные.
Соответственно да, я ожидаю от джуна понимания на начальном уровне, как пользоваться языком программирования (чтобы он понимал, что такое "отнаследуй класс" и "реализуй интерфейс") и то, как следует пользоваться фреймворком (всё ещё на начальном уровне, что конфиги нужно выносить вот сюда, база данных описывается вот в таких классов и так далее). Я считаю это справедливым требованием, тем более, что изучать это действительно просто, заходишь в любой мануал "пишем блог на XXX" и там тебе всё распишут.
581 1461764
>>61705
Чувак, у тебя явно пригорает и/или ты обижен на кого-то, поэтому взрываешься тут на адекватные советы.
Я анону сказал правдивую вещь: засылай на ревью хороший код, потому что небольшой качественно сделанный проект в глазах ревьювера (например моих) будет весить больше, чем 10 некачественно сделанных проектов. Увы, мир так работает, что людей оценивают по результатам и показывать нужно лучшее, что можешь вообще продемонстрировать.
Стандарты и паттерны у меня начинаются сразу, я в принципе стараюсь плохой код не писать, даже если нужно по-быстрому наговнякать - чтобы не страдать при поддержке и не отвечать за плохой код в будущем (когда спришвают "что за плохой код годичной давности" обычно аргумент "эээ, ну там сроки горели" не проканывает).
Далее, про большие проекты я не писал, как и не отбивал охоту. что-то делать. Я сказал чуваку выбрать стек, изучить бест-практики (в которых будут и конфиги, и паттерны и всё такое) и сделать настолько хороший проект, насколько он сможет. К слову, "написать двач" - довольно изичный пет проджект, не виду ничего "большого", где новичок "соснёт".

> сделаю как я фейсбук


> не знает как две переменные складывать


Вот и узнает. Ты забываешь, что мы не в детский сад играем, и чем меньше джун знает, тем сильнее он сядет мне на шею, если я его возьму. Если он будет знать, что нужно использовать конфиги, нельзя писать весь код в одном классе и нужно использовать ORM вместо кастомных запросов, то это значит, что мне можно будет больше времени объяснять ему, как сделать задачу, нежели как пользоваться инструментами и как складывать переменные.
Соответственно да, я ожидаю от джуна понимания на начальном уровне, как пользоваться языком программирования (чтобы он понимал, что такое "отнаследуй класс" и "реализуй интерфейс") и то, как следует пользоваться фреймворком (всё ещё на начальном уровне, что конфиги нужно выносить вот сюда, база данных описывается вот в таких классов и так далее). Я считаю это справедливым требованием, тем более, что изучать это действительно просто, заходишь в любой мануал "пишем блог на XXX" и там тебе всё распишут.
582 1461765
>>61635

>написал бы, к примеру, двач


Я бы не стал работать с чуваком, который выпячивает тот факт, что он двачер. Мне местных раковых рвотных конфочек хватило. Тайный двачер лучше явных трёх.
583 1461792
>>61765
Да какая разница. Двач, форчан, реддит, блог - это зависит от вкуса того, кто делать будет, его же пет-проект.
Просто он должен быть достаточно подъёмным для новичка, но при этом достаточно большим, чтобы можно было хоть на что-то посмотреть (потому что я видел тестовый в которых был 1 контроллер, 1 модель и 3 метода которые эту модель сохраняли, или удаляли).
Советовать сделать бложег как-то скучно, имиджборда - хотя бы оригинально.
584 1461793
>>61764
Отчасти потому и стрёмно устраиваться - вдруг на такого как ты попаду. Ты мне ничего нового не сказал, но ЧСВ у тебя определённо большое.
585 1461810
>>61792

>потому что я видел тестовый в которых был 1 контроллер, 1 модель и 3 метода


Падажжи. Наличие контроллера, модели и методов говорит о том, что человек понимает в ООП и MVC. А что должно говорить наличие пяти контроллеров и трёх моделей? Это просто количественная характеристика - всегда можно напилить ещё больше.
Походу ты сам плаваешь в своих же требованиях.
586 1461813
В любом случае - проект для демонстрации скиллов работодателю это именно целевой проект, а не рабочее приложение. И у него не стоит цели быть максимально жирным и обширным - оно просто показывает скиллы соискателя.
В конце-концов, если у меня есть собственный двач, то нахуй ты мне сдался со своей конторой.
587 1461814
>>61793
Не устраивайся, мне безразлично.

>>61810
И тем не менее, 20 строчек кастомного кода в одном файле - это слишком мало. Выводы делаются в конце-концов по кастомному коду, а есои этот кастомый код - это строка
```
function someAction($id) {
return someModel::load($id)
}
```
в минимальных вариациях, то это ничего не говорит о том, какого качества разработчик пишет это. Это несомненно плюс, что он показывает контроллер вместо самописного обращения к $_GET, но всё ещё недостаточно.
Это как принимать на работу чувака, поговорить с ним минуту и выяснить, что он знает русский язык. Знание языка - это необходимое условие, но не достаточное.
588 1461817
>>61814

>20 строчек


Давай только про крайности не говорить. Ты который пост уже выдумываешь какие-то вычурные вещи.
589 1461820
зачем вы изучаете это дерьмо?
590 1461821
>>61820
а почему бы собственно им нет ?
591 1461822
>>61821
вы говноеды?
592 1461823
>>61822
нет
593 1461826
>>61823
ну и зачем вы тогда учите это старье и заним проф деградацией?
594 1461828
>>61826
по каким критериям это старьё ?
595 1461829
>>61828
как и перл он сдохнет
596 1461832
>>61829
Всё сдохнет и даже ты.
597 1461833
>>61829

>как и перл он сдохнет


как и Java как и C как и С++ и любой другой язык программирования , дальше то что ?
598 1461837
>>61829
алсо в

>Платиновые вопросы


есть твой вопрос

> Почему PHP?


там есть ответ.
599 1461842
>>61837
так вы проф деграданты?
600 1461844
>>61814

>МОИ 20 строчек крутые, твои - нет


Демагог эз из.
601 1461847
>>61842
а как тебе такой ответ
echo "fusk yuo"
602 1461853
>>61817
>>61844
Вы правда считаете утверждения "тестовое задание с использованием паттернов и бест-практик" и "тестовое задание со значимым объёмом кастомного кода" взаимоисключающими, да?
Ну и да, если уже начались придирки к словам, то я ухожу из треда, здесь не будет диалога. Если вам хочется делать как-то по-другому и вы не готовы признавать, что бывает и другое мнение - то пожалуйста, как угодно.
603 1461873
>>61853
анон не обращай внимания , верные же вещи пишешь
604 1461879
>>61461
Не понимаю чего они к тебе докопались. Все 3 опытных погроммиста с которыми я знаком, говорили мне примерно тоже самое:
- сделай пару мелких
- придумай и сделай большой проект
- начинай ходить по собесам
605 1461889
>>61853
Ты с тем шизиком общаешься, который своим нытьем, о том что ему все должны весь тред засрал. Не понял еще?
606 1461899
Новый тред будет?
607 1461914
>>61899
Мы перекатываем в раене 800+ постов. Иначе много большая часть треда оффтоп и срачи. Осенью будет полегче.
608 1461940
>>61914
У школьников начнутся уроки просто, лол.
609 1461954
есть ли чем заменить сраное PDO?
611 1462000
>>61970
устарел,советуют пдо.
есть мож какая библиотека,которая нах между ПДО и монстрами типа доктрины и eloquent?
612 1462032
>>62000
Я бы не назвал eloquent монстром, можно свободно отдельно брать и подключать, работает стабильно, хотя и active record. Ещё есть всякие propel, phpixie, зендовские компоненты.. Но я бы всё-таки eloquent взял.
613 1462053
>>62032
а где взять его отдельно?
614 1462060
>>62053
composer require illuminate/database
615 1462061
>>62060
что за команда?
616 1462063
>>62061
Почитай про композер.
617 1462089
Приветствую пыхарея, я загульный из C#. Т.к. в родном треде молчат, спрошу тут. Кто нибудь Trial на Azure деплоил? Трафик платный, я правильно понял?
618 1462171
>>61853
Ну ты и камрад чувак.
Снимок экрана 2019-08-28 в 9.15.00.png86 Кб, 1124x462
619 1462327
Всем привет!
Надеюсь по адресу)
Есть таблица пользователя. (у нее есть расширенные данные в виде профиля)
Есть таблица профиля. (она в свою очередь может и не иметь пользователя)
В профиле есть "возраст", который может принимать 1 из 3х значений. (Для этого я выделил еще 1 табличку?)
В профиле есть "занятость" которая может иметь несколько вариантов из списка.

Собственно вопросы:
1) Как грамотно реализовать вышесказанное, есть ли смысл в отдельной таблице для возраста?
2) После того, как разобрались с представлением, у меня все равно есть вопросы по взаимосвязям в таблицах.(1-к-1? м-к-м??)
3)Да и вообще как это делается? Уникальный-не уникальный, Индекс-хуиндекс
Пик - как я это себе представляю.

Если с третьим пунктом гугл легко справится, то вот насчет первых двух прошу совета! А если не впадлу, можно и за за последний пояснить.
620 1462408
>>62327

Возраст это связь 1-М: многие люди могут иметь один итот же возраст, но один человек не может иметь 2 разных возраста.

Реализовано ка ку тебя. Также есть вариант не делать таблицу и использовать ENUM.

Другой пример 1-M -это пост и комментарии к нему. У одного поста может быть много комментариев, но не наоборот.

Занятость - если человек может выбрать несколько вариантов одновременно, то это M-N. Так как у многих людей может быть одна и та же профессия, и одной профессии может соответствовать много людей.

Другой пример M-N это теги и статьи. У статьи может быть много тегов, а тегу соответствует много статей.

Реализуется она через таблицу занятостей и связи (из колонок user_id, profession_id и составным первичным ключом по ним).

Пользователь - профиль это отношение один-к-одному. Оно реализуется как и 1-M, через внешний ключ, но с добавлением уникального индекса на внешний ключ (внешний ключ - это поле типа profile_id которое ссылается на другую таблицу).

Также, может быть тебе будет полезна статья про нормализацию, хотя она не очень простая: https://github.com/codedokode/pasta/blob/master/db/normalization.md
621 1462411
Привет аноны. Посоветуйте что почитать на вот какую тему:
На работке мне нужно написать некий сервис отчетов, определенная выборка из нашей базы. То есть пользователь заходит под своей учеткой, и ему выдается список доступных ему отчетов. Один и тот же отчет может быть доступен всем пользователям.

У меня самособранный MVC-фреймворк. И сейчас я думаю куда помещать сами отчеты (их может быть пару десятков).
Может делать общую для всех контроллеров модель, в которой будут все отчеты? А от общей модели уже наследовать модель конкретного контроллера?
622 1462413
>>62408
Вооу, спасибо большое!!
Сейчас подкреплюсь и пойду воплощать в дело тобою сказанное.
Еще раз спасибо!
623 1462416
>>61853

>и вы не готовы признавать, что бывает и другое мнение - то пожалуйста


весь дискас как раз и начался с того, что в тред залетел идиот-матершинник и стал оскорблять новичков, безапеляционно верещя "Я ЗНАЮ КАК НАДО, С ПЯТНАДЦАТИ ЛЕТ РАБОТАЛ А ВЫ ВСЕ ДЕРЬМО И ИНФАНТИЛЫ ВЫ МЕНЯ БЕСИТЕ". Ему тактично намекнули, что если не можешь помочь, а только ругаешь - то иди в другой тред
624 1462417
>>61940
ага ололо вот они лохи да не то што мы студенты первого курса
625 1462541
Аноны, у меня на апаче самопальный пхп MVC-фреймворк.
Все это дело работает на http, как переехать на https?
1. Нужно убедиться что модуль отвечающий за https на сервере включен
2. Сделать редирект любого запроса по http на https в .htaccesse?
Все ?
626 1462620
>>62541
Тебе нужно подложить ssl-сертификат (если всё локально - то модно самоподписной) и сонфигать сервер, чтобы он через этот сертификат работал.
Редирект не обязателен, делают обычно для удобства, чтобы быть на 100% уверенными, что все юзеры ходят под https.
627 1462691
Нашёл в исходниках опенкарта оператор ^ и не могу нагуглить что он делает.
Знает кто?
image.png381 Кб, 471x604
629 1462785
630 1462815
>>46969 (OP)
https://github.com/asdasdasdasddasasdasdas/Filesharing Двач оцени мой файлообменник.
631 1463103
https://phpclub.tech/
Почему сайт откис?
632 1463542
>>63103
Поднял. Заодно настроил uptime бота на постоянную проверку статуса главной страницы. В случае 500-й ошибки от сервера бот будет оповещать нас в слаке.

>>62691
ОП кстати писал на эту тему: https://phpclub.tech/pr/res/1019301.html#1027969
Ещё тут есть теория и практика: https://learn.javascript.ru/bitwise-operators
633 1464104
Аноны есть такой вопрос. Задача конвертировать текстовый файл в эксель. Реализовывать пытаюсь через csv файл дабы избежать использование spreadsheet библиотек. Так вот, при ее решении возникла проблема. Не получается разделить строку на 3 столбика. Дело идет в цикле...
$row = array();
$row[1] = trim(substr($data,0,7));
$row[2] = trim(substr($data,7,20));
$row[3] = trim(substr($data,27,25));

пытаюсь сделать через substr. Но substr используется только для строк, потому выдает ошибку. Вопрос, как разделить текстовый файл на 3 столбика и поместить их в csv?

А после я просто переименую .csv в .xls получив экселевский файл
635 1464152
>>64115
Ее тоже находил, но не совсем понял как она работает. В моем примере цикл в котором есть массив построчно делит каждую строку по 3 столбика символами. А в этом не понимаю как использовать.
636 1464287
>>64104
Это точно задача для php?
637 1464328
>>64287
Чому нет? Распарсить текстовый файл любой современный ЯП может.
638 1464370
>>64328
Не, на пыхе можно и десктоп писать, конечно. Но зачем?
639 1464388
>>64370
сопля
640 1464424
Аноны, есть ли в php полноценная перегрузка функций? А то гуглил, и чё-т, если она и есть, то очень странная
641 1464456
>>64370
Причём тут десктоп? Речь шла о файле.
Да и кому нужен этот десктоп, если есть веб-приложения?
642 1464457
>>64388
на месте
643 1464460
>>64424
Нет и не нужна. Если у тебя у нескольких функций отличается сигнатура, то и назови их по-разному. Для создания объектов частенько применяют static конструкторы, это хорошая практика не только в PHP мире:
$money = Money::parse('$1,200.00')
$money = Money::USD(1200);

Примеры из Symfony:
- https://github.com/symfony/http-foundation/blob/master/Request.php#L283
- https://github.com/symfony/http-foundation/blob/master/Request.php#L313
644 1464491
Ребята подскажите как в csv файл(открывается в экселе) положить массив во второй столбик?(B1,B2...) обычно все время кладет в столбик А.
645 1464547
>>64460

>нинужно


А вот это не факт. Хуже никому от этого не стало бы.
646 1464570
>>64547
Перегрузка методов и функций усложняет понимание кода, так как без IDE сложно понять какая версия метода вызывается - нужно сверять типы и сравнивать количество аргументов. Код не только через IDE смотрят - если ты делаешь код-ревью коллеге в гитлабе/гитхабе, то скорее всего будешь искать метод через Ctrl+F на странице и перегрузка будет мешать и отнимать время. Опиши реальную проблему. Есть подозрение, что ты решаешь её не с той стороны.
647 1464724
>>64491
а нельзя добавить перед твоим массивом B добавлять сначала массив A с пустыми значениями/пробелами? Или так коряво выйдет?
648 1464752
Пыханы, вот у меня есть, например, доменный объект с кучей приватных свойств. Можно ли в конструктор передавать массив этих свойств или обязательно поимённо? Как принято делать в таких случаях?
649 1464765
>>64724
так коряво выйдет. Планировал по очереди записать информацию в столбики. Сначала первый ,потом второй, потом третий.
650 1464788
Ребята которые в laravel умеют, помогите пожалуйста. Что это за переменная такая - $query. Где и когда она создается? В методе с использованием scope? А если имя метода без scope - переменная $query задана не будет? Разобрался, что она состоит из информации о sql запросе, где поле from задается по принципу "модель где определена переменная -> таблица этой модели в бд".

Наверное очень плохо обьяснил, да и вопрос нубский. Первый раз в такой тупик зашел.
651 1464876
>>64752
Массивы в PHP не типизируются, есть риск какой-то ключ забыть/опечататься, а потом долго искать причину ошибки в другом месте. Вместо кучи аргументов можно группировать данные в объекты, например вместо

$entity = new Entity($dateFrom, $dateTo, $country, $city, $street, $lat, $lan);

писать

$entity = new Entity(
new DateRange(new DateTime('now'), new DateTime('+30 days')),
new Address($country, $city, $street, new Location($lat, $lan)),
);

В БД это будет храниться в одной строке, Доктрина такое может через Embeddable: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/embeddables.html

Плюсы здесь в том, что у Value Object могут быть дополнительные методы, например $dateRange->isOverlapping($dateRange2)
652 1464893
>>64788

> это за переменная такая - $query.


Вангую, что строка запроса, которую билдер собирает.
653 1464940
Что значит "знать" фреймворк. Знать ведь можно на разных уровнях. Нужно от и до все выучить, будто я сам его написал?
654 1464970
>>64788
Scope в ларавел это "магический" метод, подозреваю что работает как-то через __call() и scope{MethodName}, который ты можешь чейнить с кверибилдером. Например ты ищешь только публичные посты, вместо того чтобы делать Post::where('public', true)->get(), ты можешь сделать scopePublic(), НО для удобства вызывается этот скоуп просто как Post::public(). Переменная $query это и есть объект текущего билдера, к которому ты вызываешь этот скоуп. Сам билдер возвращается тыщей разных методов, with, where и т.п. У меня всегда были проблемы со слогом.
655 1464980
>>64970
Все более-менее понял. Спасибо за ответ!
656 1465001
Анончики, какие плагины для sublime посоветуете поставить?
15409879986510.png185 Кб, 576x1024
657 1465069
Ура! Работает!

$thread = "https://2ch.hk/pr/res/1446969.html (М)";

$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_URL, $thread);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

$data = curl_exec($curl);
preg_match_all("/c\/(.)\" class=\"post__image-link\"/", $data, $images);

preg_match('/hk\/(.
)\/r/', $thread, $board);
$board = $board[1];

foreach ($images[1] as $image) {
$image_small = preg_replace('/[^0-9\/]/', "", $image);
print "<a href='https://2ch.hk/$board/src/{$image}' (М)><img src='https://2ch.hk/$board/thumb/{$image_small}s.jpg' (М)></a>";
};
658 1465439
>>64940
То и значит, "знать фреймворк на уровне джуниора/миддла/сеньора".
Вообще, как правило, ожидается знание архитектуры, набора компонентов, используемых паттернов и наличие практических навыков работы с ними для решения хотя бы повседневных задач.
659 1465498
>>65439
https://badcode.ru/chto-nuzhno-znat-laravel-junior-proghrammistu/

Это нормальные требования для того же джуниора? Я просто недавно начал учить, то что в статье той написано кажется довольно простыми вещами.
Что аноны могут по поводу видео-курсов по 20+ часов сказать? То же создание блога с ларакаста, сайт обьявлений Елисеева. Может быть смотрел кто полностью?
660 1465532
>>65001
vscode
YotsugiOnonoki.png1,4 Мб, 1920x1080
661 1465547
>>65001
A File Icon - чтоб иконки красивые были у файлов и zzz A File Icon zzz
AceJump - быстрое перемещение по коду
Alignment - массив выровнять чтоб приятно смотрелось либо группу объявления переменных
All Autocomplit - автодополнение в текущей вкладке со всех открытых вкладок
BracketHighlighter - подсветка парных скобок
DocBlockr - блоки для функций переменных и тд (ну вот кстати дисскасс имеет ли сейчас смысл писать в описании тип если ты его уже указал в самой функции? зачем дублировать)
Emmet - ну если ты вдруг фулстек или иногда приходится накалякать html+css
Laravel 5 artisan - можно звать команды прям из редактора. Но есть у тебя в проекте несколько микросервисов то поведение довольно рандомное.
Laravel Blade Highlighter - подсветка синтаксиса.
PHP Codebeutifier - приведение к стандарту стиля кода
PHP Companion - основная для меня фича: кликаешь ф5 и он дописывает декларацию класса есть и другие но не особо пользую
PHPUnitKit - удобрый запуск phpunit тестов но если работаешь чередз дохер то не работает и проще написать конфигурацию для билда
QNav - ну иногда когда не хочется alt-0
Requester - тестить апишку можно прям сценарии писать (так как можно обращаться к значениям предыдущего запроса) но зачем они такое ебанутое форматирование сделали для json я не понимаю - хочешь свернуть большой объект - хуй
SidebarEnhancements - дополнительные команды к файлам в основном удобно duplicte
SublimeLinter - основа для линтеров
SublimeLinter-php
SublimeLinter-phpcs
SublimeLinter-phpmd - отключен. он хороший но долго думает
SublimeLinter-phpins - подсветка когда забыл подключить класс или на русском написал букву "c" или забыл указать переменную что используешь
662 1465577
>>65547
Благодарю
663 1465663
>>65498

> Это нормальные требования для того же джуниора?


Всё зависит от конкретной компании. Не существует эталона требований для джуниора, какие-то компании нанимают совсем никаких студентов, другие ожидают от джуна опыт в несколько лет коммерческой разработки.
Лучше выбрать 2-3 компании, куда хотел бы попасть, посмотреть на их требования + нагуглить сотрудников этих компаний и выспросить с них ожидания от джунов. Тут не стоит стесняться, то, что ты так проактивно подходишь к трудоустройству - будет скорее дополнительным плюсом, потому что любая адекватная компания понимает, что первый условный год джун работает в лучшем случае в 0, потому что учится - и только потом начинает приносить в прибыль. Значит, если чувак сначала выяснил требования, потом потратил месяц на самообучение, потом пришёл на собеседования - значит, он ответственный и целеустремлённый и не сольётся через 6 месяцев, не оправдав вложений в его обучение.

> https://badcode.ru/chto-nuzhno-znat-laravel-junior-proghrammistu/


На мой вкус, данный список выглядит неплохо, лучше, чем 90% дерьмовых советов из интернетов.
664 1465695
>>65663

>и не сольётся через 6 месяцев, не оправдав вложений в его обучение


По этому и спрашивал, что не хочется быть совсем уж "грузом", и не вылететь даже если меня возьмут. Но с другой стороны слишком долго сидеть без работы тоже не вариант.
Большое спасибо за ответ
665 1465794
Есть приложение, оно состоит из "главного" класса root и еще пары классов, которые выполняют определенные функции (cl1, cl2, cl3). При этом, приложение пишет лог. Лог - это объект другого класса (cllog).

Вопрос: как мне сделать так, чтобы я мог писать в лог из всего приложения? На первый взгляд логичным кажется создать объект класса cllog в объекте класса root и работать с ним. И всё бы ничего, но мне ведь нужно к логу обращаться из остальных классов. То есть, все 4 класса (root, cl<1-3>) должны работать с одним объектом.

Мне в голову пришли следующие решения:

1. В каждом классе реализуется метод, который позволяет установить ссылку на лог. То есть, в классе root я создаю объект класса cllog, создаю объект класса cl1 и по ссылке (&) передаю в него объект с логом. Минусы очевидны: мне нужно в каждый класс пихать этот метод, это во-первых, во-вторых - а если логов несколько? Или если помимо лога есть еще что-то, что должно быть доступно из всех классов? Пилить десяток методов, которые по ссылке будут устанавливать? Короче, хуета какая-то.

2. Класс root содержит СТАТИЧЕСКОЕ свойство $log, которое хранит в себе лог. Соответственно, если мне нужно откуда-то написать в лог, то я делаю примерно так: root::$log->addRecord(). Вроде звучит хорошо, но, опять же, рассмотрим ситуацию, в которой у меня несколько логов. Есть общий лог приложения - root::$log. Но, в то же время, есть еще один лог, который касается какой-то конкретной части приложения, которая состоит из нескольких классов. Т. е, грубо говоря,в root:$log будут писать из всех классов, а в root:$logTwo из cl1 и cl2. С чего бы этому логу храниться в классе root, если он относится к cl1 и cl2? Сваливать абсолютно все объекты, которые должны быть доступны из нескольких классов в root - звучит не очень адекватно.

3. Существует еще один абстрактный класс - допустим, global. В нём есть статическое свойство global::$log. Я внутри root создаю объект лога и дальше делаю примерно так: global::$log = &$this->log.
В этом варианте я минусов не вижу, но хз, насколько это адекватно с точки зрения ООП. Я, по сути, создаю собственную глобальную область видимости с блекджеком и шлюхами.

Короче, максимально сокращая вопрос: что делать, если у меня есть какой-то объект, который должен быть доступен из нескольких классов?
665 1465794
Есть приложение, оно состоит из "главного" класса root и еще пары классов, которые выполняют определенные функции (cl1, cl2, cl3). При этом, приложение пишет лог. Лог - это объект другого класса (cllog).

Вопрос: как мне сделать так, чтобы я мог писать в лог из всего приложения? На первый взгляд логичным кажется создать объект класса cllog в объекте класса root и работать с ним. И всё бы ничего, но мне ведь нужно к логу обращаться из остальных классов. То есть, все 4 класса (root, cl<1-3>) должны работать с одним объектом.

Мне в голову пришли следующие решения:

1. В каждом классе реализуется метод, который позволяет установить ссылку на лог. То есть, в классе root я создаю объект класса cllog, создаю объект класса cl1 и по ссылке (&) передаю в него объект с логом. Минусы очевидны: мне нужно в каждый класс пихать этот метод, это во-первых, во-вторых - а если логов несколько? Или если помимо лога есть еще что-то, что должно быть доступно из всех классов? Пилить десяток методов, которые по ссылке будут устанавливать? Короче, хуета какая-то.

2. Класс root содержит СТАТИЧЕСКОЕ свойство $log, которое хранит в себе лог. Соответственно, если мне нужно откуда-то написать в лог, то я делаю примерно так: root::$log->addRecord(). Вроде звучит хорошо, но, опять же, рассмотрим ситуацию, в которой у меня несколько логов. Есть общий лог приложения - root::$log. Но, в то же время, есть еще один лог, который касается какой-то конкретной части приложения, которая состоит из нескольких классов. Т. е, грубо говоря,в root:$log будут писать из всех классов, а в root:$logTwo из cl1 и cl2. С чего бы этому логу храниться в классе root, если он относится к cl1 и cl2? Сваливать абсолютно все объекты, которые должны быть доступны из нескольких классов в root - звучит не очень адекватно.

3. Существует еще один абстрактный класс - допустим, global. В нём есть статическое свойство global::$log. Я внутри root создаю объект лога и дальше делаю примерно так: global::$log = &$this->log.
В этом варианте я минусов не вижу, но хз, насколько это адекватно с точки зрения ООП. Я, по сути, создаю собственную глобальную область видимости с блекджеком и шлюхами.

Короче, максимально сокращая вопрос: что делать, если у меня есть какой-то объект, который должен быть доступен из нескольких классов?
666 1465943
>>65794

Это прямо таки типичный пример Dependency Injection: https://github.com/codedokode/pasta/blob/master/arch/di.md

Также, классы стоит называть с большой буквы и без странных сокращений. Не cllog, а Logger.

Также, для логгера есть рекомендация PSR: https://www.php-fig.org/psr/psr-3/ Не стоит изобретать тут велосипед.

Также, ссылки для объектов использовались в PHP4 много лет назад, а с PHP5 они не нужны, обнови свои знания.
667 1465964
>>65943

>Также, классы стоит называть с большой буквы и без странных сокращений


Я знаю, это просто пример. Реальные имена другие.

>Также, классы стоит называть с большой буквы и без странных сокращений


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

Насколько я понял (а понял я, конечно же, не так много, нужно еще пару раз перечитать), Сатана, в статье идёт речь о том самом, спасибо. На счёт ссылок - действительно, сейчас проверил и они правда не нужны. Но если говорить о сути вопроса, то мой первый вариант с кучей методов типа setLogger оказался ближе всего к истине? Довольно внезапно, конечно.
668 1466025
ОП, глянь задачу про абитуриентов, пожалуйста.
Гитхаб github.com/deadj/student-list/
Хостинг http://f914421i.beget.tech
pizdoliz.png258 Кб, 625x679
669 1466082
Пыхоблядки, как же вы пропустили такую тему?

Организаторы отменили европейскую конференцию по php, потому, что туда записались только белые мужчины.

https://2019.phpce.eu/en/ (см. там ссылки на твиты)
https://wptavern.com/php-central-europe-conference-canceled-due-to-lack-of-speaker-diversity

В твиттере им напихали хуёв в панаму - поляки, русские, украинцы, в основном, но не только.

А я вот думаю, что это такой тонкий наброс и реклама пыхи.
Типа "php - технология белых людей".

твит не мой
670 1466106
>>66082

Иди в любой другой тред ныть про притеснение белых мужчин, плиз.
671 1466107
>>66106
Не могли бы вы пояснить свою мысль, уважаемый(-ая)?
672 1466118
>>65964

>Но если говорить о сути вопроса, то мой первый вариант с кучей методов типа setLogger оказался ближе всего к истине?



нет ты просто плохо понимаешь что такое DI контейнер, перечитай ещё раз.

мимо другой анон
673 1466125
>>65794
DI - это хорошо, конечно, но нужен контейнер.
У тебя он есть? Если да - читай документацию к нему.

А если нет?
Используй статические методы класса, как в джаве.

Напрмер, на джаве в клиентском коде будет:
Logger log = Logger.getLogger(name);
log.fine("OLOLO");

log - это экземпляр класса Logger.
getLogger() - это статический метод класса Logger. Он доступен везде. И он возвращает сконфигурированный логгер (не создаёт он уже создан ранее).

Другой статический метод этого класса позволяет сконфигурировать логгер при старте приложения - открыть файл и т.п..

Т.е., по сути, мы имеем статическую "глобальную" переменную внутри класса. Она не глобальная, естественно. Она - в пространстве имён "Logger". Но, может быть доступна везде.
Ещё это можно назвать модулем.
Т.е., в джаве класс - это 2 в 1 - и модуль и класс.

В пыхе так можно? Если да - так и делай.
674 1466131
>>66125
Бля, я таки дал себе труд прочитать, что ты там (>>65794) написал.
Вообще непонятно, в чём у тебя проблема, если честно.
Про статические методы ты знаешь (но классы называешь по-блядски).
Сделай внутри лог-менеджера несколько логгеров, выбирай по именам, пиши в разные файлы.
А лучше - не изобретай велосипед, а загугли php logging library.
675 1466149
>>66125

Контейнер не обязателен. Мы можем руками передать логгер при создании объектов:

$logger = new Logger;
$c1 = new Class1($logger);
...

Контейнер просто позволяет это упростить и автоматизировать, но можно и без него.

Ты же предлагаешь какие-то кривые самодельные костыли. В твоем варианте со статическими методами, как передать 2 разных логгера в разные классы? Как в тесте подменить логгер на другой тип?

В уроке про DI это все упоминается, и описаны недостатки статических методов.
676 1466166
>>66118
Иван Величко @Ostrovski
dllweb: DI - это на самом деле очень просто. Берете и явно (ключевое слово именно явно) передаете зависимости в код, который их требует. Через параметры функции/метода или через конструктор. А DIC - это о том, как этот процесс автоматизировать/универсализировать на уровне сервисов веб-приложения. Т.е. у вас есть куча сервисов, каждый явно определяет, от каких других сервисов он зависит (через параметры конструктора). А DIC умеет создавать экземпляры сервисов, скармливая им экземпляры тех сервисов, от которых они зависят.

Сурс: https://toster.ru/q/195091#comment_662753

Разве это не довольно близко к тому, что сказал я?
677 1466167
>>66166
Ну, то есть, я понимаю, что мой вариант (еще и с ссылками) относительно адекватной реализации = это каменный топор относительно танка, но сама философия и там и там заключается в том, что мы в каждый объект явно передаём его зависимости. DIC просто сокращает/автоматизирует этот процесс.

Нет?
678 1466182
>>66149

>как передать 2 разных логгера в разные классы?


Как два пальца обоссать. Хоть 22.
Там же написано: Logger.getLogger(name);

Но, у вас тут, похоже, своя атмосфера, лол.
Пыха открывает для себя ООП, DI и прочие взрослые игрушки.
679 1466192
>>66149
Добавлю ещё, что когда ты сам, руками передаёшь зависимости как параметры в конструктор - это не DI. DI - это когда это делает контейнер за тебя, а ты просто пишешь аннотации.

И логгер - это не зависимость, в обычном понимании.
Передавать логгер в конструктор - это ебанизм.
Хотя, возможно, в пыхе это норма.
680 1466223
>>66192

> передаёшь зависимости как параметры в конструктор - это не DI. DI - это когда это делает контейнер за тебя



вопрос без подъеба ты явист?
681 1466229
>>66223
Разумеется, я выше это написал.
Чувак, I = Injection.
В данном случае можно перевести как внедрение, хотя, оттенок немного не тот. Т.е. что-то внедряет в твой код зависимость извне, понимаешь?

А когда ты делаешь это руками - ну какой же это, нахуй, инжекшн, ну сам подумай? Это обычное программирование, никакие особые термины для этого не нужны.

>явист


Ява - это остров такой.
И мотоцикл такой ещё был, охуенный.
А язык называется "джава".
11.png1,3 Мб, 1200x686
682 1466237
>>66082

>Организаторы отменили европейскую конференцию по php, потому, что туда записались только белые мужчины.


Черные айтишники тоже могли бы записаться, но они все еще сидят А ю гарет гайз? сидят ин джейл!
1.jpg42 Кб, 600x450
683 1466244
>>66182

>Пыха открывает для себя ООП, DI и прочие взрослые игрушки.


Ненавижу ждава пидарастов за то, что у них переменные без $ объявляются. Тупо рандомное слово без идентификации. Мрази. Насколько надо быть дурными, что даже до значка не додуматься? А потом заходит такой ополоум в благородный тред и поучать начинает.
684 1466260
Нужели им не хватает six figures в долларах для душевного спокойствия?
685 1466263
>>66182

В твоем подходе в классе просто жестко прописано получение логгера (Logger.getLogger) и мы не можем снаружи выбрать, что в него передать. Мы не можем выбрать тип логгера при создании класса, так как там все захардкожено. Мы не можем создать 2 экземпляра класса с разными логгерами. Мы не можем в тестах передать другой тип логгера.

Да, иногда это и не требуется и можно прописать получение логгера жестко, но это частный случай. Первоначальный вопрос был именно про то, как правильно передавать зависимости в объекты (не только логгер) в общем случае, и DI тут самый простой и логичный способ. Потому я и дал ссылку на урок про DI.

Ты же даже оригинальный вопрос не прочел, а просто пишешь тут частный пример, то, как где-то в Яве кто-то предпочитает прописывать получение логгера статическими методами. Причем не даешь других вариантов, не даешь описания плюсов и минусов.

Логгер такая же зависимость, как и любой другой объект.

> Добавлю ещё, что когда ты сам, руками передаёшь зависимости как параметры в конструктор - это не DI.



А что? DI - это принцип передачи зависимостей снаружи (а не поиска их объектомсамостоятельно), а DIC - вспомогательный класс для реализации этого принципа.

DI/IoC описан у Фаулера тут: https://martinfowler.com/articles/injection.html

Тут есть явное противопоставление DI vs ServiceLocator:

> I'm going to start by talking about the various forms of dependency injection, but I'll point out now that that's not the only way of removing the dependency from the application class to the plugin implementation. The other pattern you can use to do this is Service Locator



Также, нигде явно не написано про обязательность "контейнера":

> The basic idea of the Dependency Injection is to have a separate object, an assembler, that populates a field in the lister class with an appropriate implementation for the finder interface



Да, тут упомянут некий "assembler", но к нему не предъявляется никаких требований и не сказано, что это должен быть "контейнер".
685 1466263
>>66182

В твоем подходе в классе просто жестко прописано получение логгера (Logger.getLogger) и мы не можем снаружи выбрать, что в него передать. Мы не можем выбрать тип логгера при создании класса, так как там все захардкожено. Мы не можем создать 2 экземпляра класса с разными логгерами. Мы не можем в тестах передать другой тип логгера.

Да, иногда это и не требуется и можно прописать получение логгера жестко, но это частный случай. Первоначальный вопрос был именно про то, как правильно передавать зависимости в объекты (не только логгер) в общем случае, и DI тут самый простой и логичный способ. Потому я и дал ссылку на урок про DI.

Ты же даже оригинальный вопрос не прочел, а просто пишешь тут частный пример, то, как где-то в Яве кто-то предпочитает прописывать получение логгера статическими методами. Причем не даешь других вариантов, не даешь описания плюсов и минусов.

Логгер такая же зависимость, как и любой другой объект.

> Добавлю ещё, что когда ты сам, руками передаёшь зависимости как параметры в конструктор - это не DI.



А что? DI - это принцип передачи зависимостей снаружи (а не поиска их объектомсамостоятельно), а DIC - вспомогательный класс для реализации этого принципа.

DI/IoC описан у Фаулера тут: https://martinfowler.com/articles/injection.html

Тут есть явное противопоставление DI vs ServiceLocator:

> I'm going to start by talking about the various forms of dependency injection, but I'll point out now that that's not the only way of removing the dependency from the application class to the plugin implementation. The other pattern you can use to do this is Service Locator



Также, нигде явно не написано про обязательность "контейнера":

> The basic idea of the Dependency Injection is to have a separate object, an assembler, that populates a field in the lister class with an appropriate implementation for the finder interface



Да, тут упомянут некий "assembler", но к нему не предъявляется никаких требований и не сказано, что это должен быть "контейнер".
686 1466271
>>66244

Значок $ скорее по историческим причинам, унаследован от Перла, а тем от программ-оболочек командной строки (shells). Тут есть как плюсы: его удобно подставлять в строку, так и минусы: надо писать на один символ больше.

Java унаследовала синтаксис от Си, где доллар не пишется.

Еще были языки, где суффикс или префикс переменной определял ее тип.

>>66229

Если понимать дословно, то как раз все логично: мы "внедряем" зависимости в объект, передавая их при создании. Можно почитать статью Фаулера и поискать определение там: https://martinfowler.com/articles/injection.html

>>66131

> Сделай внутри лог-менеджера несколько логгеров, выбирай по именам, пиши в разные файлы.



Это ты начинаешь изобретать костыли вместо DI. Исходный вопрос был не только про логгеры, а вообще про инъекцию зависимостей.
687 1466294
>>66263

>В твоем подходе в классе просто жестко прописано получение логгера (Logger.getLogger) и мы не можем снаружи выбрать, что в него передать. Мы не можем выбрать тип логгера при создании класса, так как там все захардкожено. Мы не можем создать 2 экземпляра класса с разными логгерами. Мы не можем в тестах передать другой тип логгера.



Всё это мы можем. Как обоссать два пальца.

Статический метод - это просто способ вызова.
Функция, не привязанная к экземпляру какого-либо объекта.
Никаких недостатков у статических методов нет.
Какие могут быть недостатки у функции?
Но, конечно, их можно неправильно использовать. Всё что угодно можно неправильно использовать.

Я, всего лишь, привёл пример, как эта проблема (логгинг) решается в джаве.
В реальных профессиональных фреймворках и библиотеках.

Как правило, в реале логгеры конфигурируются в конфиге - xml и т.п. И не обязательно в конфиге приложения - у библиотеки логгинга может быть свой отдельный конфиг - просто файл в каталоге приложения, который она найдёт сама. Можно делать что угодно вообще.

Например, у меня логгеры сконфигурированы в конфиге DI контейнера, тем способом, которым он хочет. А получаю я их через Logger.getLogger(name) - тоже стандартным способом. Это две стороны одного целого.

В конфиге я могу писать if-else. И у меня всё это будет конфигурироваться по-разному, в зависимости от других условий. Само.
Более того, я могу даже сменить саму библиотеку логгинга (которая, собственно, пишет в файлы и т.п.), и у меня всё будет продолжать работать.

А в пыхе вместо конфига можно использовать просто код - это же динамический язык. Но, если ты так хочешь - пиши конфиг на json или yaml и парси.

Также, логгер - не обычная зависимость, и не надо тупо переносить на него правила работы с зависимостями в DI. Не надо стремиться сделать всё "универсально" - это типичная ошибка начинающих.
А передавать логгер через конструктор (или сеттер) - это просто верх ебанизма.

>Фаулер


Не перебарщивай с этим.
Суха теория, мой друг, а древо жизни вечно зеленеет, лол.

>>66271

>изобретать костыли вместо DI


Это не "костыли". И не "вместо" DI. Это вообще про другое.
687 1466294
>>66263

>В твоем подходе в классе просто жестко прописано получение логгера (Logger.getLogger) и мы не можем снаружи выбрать, что в него передать. Мы не можем выбрать тип логгера при создании класса, так как там все захардкожено. Мы не можем создать 2 экземпляра класса с разными логгерами. Мы не можем в тестах передать другой тип логгера.



Всё это мы можем. Как обоссать два пальца.

Статический метод - это просто способ вызова.
Функция, не привязанная к экземпляру какого-либо объекта.
Никаких недостатков у статических методов нет.
Какие могут быть недостатки у функции?
Но, конечно, их можно неправильно использовать. Всё что угодно можно неправильно использовать.

Я, всего лишь, привёл пример, как эта проблема (логгинг) решается в джаве.
В реальных профессиональных фреймворках и библиотеках.

Как правило, в реале логгеры конфигурируются в конфиге - xml и т.п. И не обязательно в конфиге приложения - у библиотеки логгинга может быть свой отдельный конфиг - просто файл в каталоге приложения, который она найдёт сама. Можно делать что угодно вообще.

Например, у меня логгеры сконфигурированы в конфиге DI контейнера, тем способом, которым он хочет. А получаю я их через Logger.getLogger(name) - тоже стандартным способом. Это две стороны одного целого.

В конфиге я могу писать if-else. И у меня всё это будет конфигурироваться по-разному, в зависимости от других условий. Само.
Более того, я могу даже сменить саму библиотеку логгинга (которая, собственно, пишет в файлы и т.п.), и у меня всё будет продолжать работать.

А в пыхе вместо конфига можно использовать просто код - это же динамический язык. Но, если ты так хочешь - пиши конфиг на json или yaml и парси.

Также, логгер - не обычная зависимость, и не надо тупо переносить на него правила работы с зависимостями в DI. Не надо стремиться сделать всё "универсально" - это типичная ошибка начинающих.
А передавать логгер через конструктор (или сеттер) - это просто верх ебанизма.

>Фаулер


Не перебарщивай с этим.
Суха теория, мой друг, а древо жизни вечно зеленеет, лол.

>>66271

>изобретать костыли вместо DI


Это не "костыли". И не "вместо" DI. Это вообще про другое.
688 1466398
>>66082
Ты опоздал на пару лет, вся та СЖВ хуерга заглохла ещё в 2017, и только сейчас до рашки доходят отголоски.
Если начать разбираться в теме - выяснится что ВНЕЗАПНО, никто не смотрел на имя или цвет кожи, а отбирались докладчики по докладу. Комиссия не знала имён, пола или расы. Так что выбрали 20 самых адекватов из 253 подавших заявки.
ВНЕЗАПНО, оказалось что все 253 были белыми.
252 из них - мужиками.
Какой-то дебич, вдруг решил что свалить на пару недель куда-нибудь на сказочноебали будет лучше, чем сидеть в европках с ботанами и нердами и не придумал ничего лучше чем сказать "Там одни белые и тёлок нет", его поддержал ещё один докладчик. Так как за пару недель до события новых двух найти не удалось, решили что надо расходиться.
Но Всякие нытики в интернетах и твитере конечно преподносят это как СЖВ и вот это вот всё.
689 1466457
Аноны, а что-нибудь известно про ОП? Или он личность покрытая мраком? А может ОП вообще ИИ?
690 1466460
>>66457
он под 800 постов вроде появляется. Надо просто верить в него
#яверю #посмотриМоихСтудентов #устройНаРаботуЗаСтоМильеновВсек
691 1466477
>>66460
Не, я не о том, когда он проверит. Мне интересно чем он занимается, работает
692 1466520
Господа шарящие, объясните глупому анону про Slim. С помощью slim я пишу роутер, а модели и контроллеры на голом php?
693 1466525
>>66520
Тебе не всегда нужен весь фарш сразу и разом, некоторые предпочитают собирать проекты покомпонентно, выбирая каждый инструмент под задачу. Роутер от слима, базу от ларавела, валидатор от симфони и так далее.
694 1466541
>>66525
А касательно задачи про файлообменник, что можешь посоветовать? Я хочу от слима взять только роутер, остальное на чистом. Или лучше углубиться в слим для обучения?
695 1466573
возможно платина, но сейчас изучаю js и он далек от языка богов, понимаю что знать его надо как можно лучше, но у меня понос и рвота, как глубоко надо изучать это говно? ну в смысле всякие мапы и сеты когда нибудь понадобятся пхп боярину?
696 1466739
>>66541
Если я ничего не путаю, то в слиме нет ничего, кроме роутера и структуры, так что я бы взял его. Ну или lumen, если ты laravel не знаешь, так хоть познакомишься с частью компонентов.
697 1466741
>>66573
Js очень прост, как язык, там нечего долго изучать. Главное, изучать ES6 и тому подобное, модули, экосистему. Сложнее изучать фреймворки, библиотеки и подходы. react/redux,angular,saga и т.п.
Советую напичать пару простеньких фронтенд приложений с бекендом на ноде, потратишь неделю, но будет очень полезно.
Плюс, отдельно можешь тайпскриптом заполировать, он намного приятнее и будет полезен в будущем, он часто используется. Можешь писать на нём и фронт, и бэк.
698 1466762
>>66082
СЖВ-блядки лезут туда, куда их исторически не просили. Никто не мешает нигерам и феминисткам тоже записыватся, но они слишком тупые для этой сходочки белых парней.
699 1466769
>>66741
Расскажешь. Может тебе просто, с высоты опыта и тп. но новичок охуеет от того сколькими разными способами делается одно и то же, совершенно законно. Ни разу не легкий и не простой.
700 1466770
>>66741
спасибо, но жс не логичен, язык не поворачивается назвать его простым
701 1466779
>>66769
В js'е нет кастомных типов (только примитивные), классов, указателей, многопоточностей. Сравнительно просто.
На начальный уровень знания самого языка нужно выучить только типы, операции, сравнительно маленькую стандартную библиотеку, концепцию event loop и промисов. Ну и про стандарты прочитать.
702 1466781
>>66541

>Я хочу от слима взять только роутер, остальное на чистом


Аношка, я тоже делаю slim. Но я еще установил шаблонизатор твиг, про него в учебнике написано. Возьми еще и его в нагрузку, он простой, но авторитет в собственных глазах повышается. Еще можешь бутстрап юзать для верстки - считай ТРИ пакета используешь. У будущего работодателя соски встанут от такого резюме джуна
703 1466785
Аноны, помогите далбоебу.
Делаю сервис отчетов из бд.
Запросом из БД формирую отчет, пишу его в exel-файл и данный файл сохраняю в отдельной папочке.
Далее мне требуется этот файл отчета отдать клиенту, сделал ссылочку которая ведет на отдельный обработчик. Примерный код обработчика везде одинаков, у меня такой :

https://ideone.com/rB4236

Фигня в том что когда я сохраняю файл отчета на одном уровне с индексным файлом, то все отдается.
Но когда я размещаю файл в дочернем каталоге, то уже readfile не может найти файл. И ниче про это найти не могу.
704 1466789
>>66779

>классов


Прототипы, которые ломают мозг сильнее всяких классов.

>кастомных типов


Если бы такая фича и была (хотя она и не нужна в ваниле, есть typescript), и ты ещё жив, сможешь и с этим разобраться.

>указателей


В хаскелле тоже нет, но это не делает его простым для освоения.

>многопоточностей


Хороший пойнт. Но можно ведь

>выучить только

705 1466793
>>66789
Не понимаю, с чем ты споришь. В js'е, как языке, находится сравнительно мало фич. Кроме блядских прототипов и ряда исторически сложившихся нёх'ов там сильно нечего изучать, в языке.
Дальше нужно изучать экосистему и вот это уже пиздец, да.
706 1466794
>>66781
Ни разу не видел, чтобы работодатели хотели слим. Лучше уж тогда брать ларавел или симфони.
707 1466816
>>66785
я не очень умный, но может там в переменной path перед конечной папкой добавить глобальную переменную с серверным путем типа _DIR_
708 1466831
>>66785

>отдельный обработчик


Но нахуя?
У тебя веб-сервер не может нормально отдать excel-файл? Добавь ему mime-тип в конфиг, если так.
Или тебе нужны ограничения по безопасности, чтобы кто-то не мог брать чужие файлы и т.п.? Или с именами что-то мутить?

Проверь, что на самом деле является текущим каталогом у тебя - выведи в лог полый путь к "."
Дело в этом, скорее всего. А в readfile() может быть какая-то магия, и ты думаешь, что каталог скрипта у тебя текущий.
709 1467368
>>66831
Где то как ты сказал и получилось - я с php.net скопировал пример, под себя перекопал - все заработало. У меня видимо некие траблы с относительными и абсолютными путями и всей этой залупой со слешами и корнями приложения.
710 1467552
>>66781
Ты slim только для роутера используешь?
711 1467646
>>67552
Так там только роутинг и зависимости с логгером. Что ещё?
скрин.PNG72 Кб, 843x921
712 1467919
>>46969 (OP)
Как запустить приложение из примера: https://github.com/nesk/puphpeteer/

Пытаюсь запустить через xammp. В папку htdocs поместил test.php, обращаюсь через localhost/test.php, но сервак не видит либы установленные через composer.

Попробовал прописать их вречную через include, но на 20-й либе заебался?

Что я делаю не так? (на скрине нерабочий скрипт, не находит
очередной класс)
713 1467960
Насколько кровав PHP/Symfony/Doctrine по сравнению с Java/Spring/Hibernate?
714 1467987
>>67960

Ничего кровавого в пыхе нет.
715 1468052
>>67987
А как же заказчики?
716 1468059
>>67919

>PuPHPeteer


Это вроде как эмулятор браузер для загруженной странички?
Лихо закрутили.
717 1468092
>>67919
Контекст не особо читал, но после того как ты делаешь composer install он генерирует все подключения и тебе надо будет за иклудить только один файлик auto..чета там вроде load.php
718 1468528
Аноны, я немного заблудился в путях, относительных и абсолютных.

Вот у меня такая структура сайта -> в корне (он определяется $_SERVER['DOCUMENT_ROOT']) только файл .htassecc, который переадресует все запросы на дочерний каталог public, в котором находится уже index.php.

корень
.htaccess
----- папка public - тут каталоги картинок, стилей и тому подобное
----------index.php
----- папка App - в ней вся логика приложения, контроллеры, модели и представления

Я не очень понимаю что есть корень сайта для браузера в моем случае? Корень для браузера это $_SERVER['DOCUMENT_ROOT']- корень приложения, или для браузера корень - это то что находится в папке public, т.е. для браузера корневой каталог это каталог в котором выполняется index.php? И ниже него нельзя уже обратиться?

Проблема в том, что когда я в каком нибудь представлении размещаю ссылку на картинку которая находится не в каталоге public - картинка не отображается
719 1468539
>>68528

>для браузера корневой каталог это каталог в котором выполняется index.php


да

даже если попробовать ../folder/1.jpg тоже не отображается ?

обычно vhost настраивается сразу на папку public что бы не было плясок с .htaccess
720 1468575
>>68539
>>68539

>>для браузера корневой каталог это каталог в котором выполняется index.php


>>да



Похоже все же нет, потому что без .htaccess если просто создать структуру из каталогов - то браузер понимает конструкцию ../img/img.jpg и отображает изображение.

Первый .thaccess (который в корне) у меня таков:

AddDefaultCharset utf-8
Options -Indexes
RewriteEngine On
RewriteRule ^(.)$ /public/$1

он передает урл в каталог public (в нем находится индексный файл php), где запрос обрабатывается следующим .thaccess :

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.
) index.php?$1 [L,QSA]

В index.php у меня вызывается роутер, который уже разбирает запрос и вызывает нужные контроллеры.

Вопрос таков - все ссылки в тэгах <img> , все подключения стилей и так далее - это те же самые запросы, которые проходят всю цепочку из .thaccess.
То есть в <img src=' img/img.jpg ' > запрос "img/img.jpg" будет передан в папку public и открыт, согласно второму правилу не будет обработан index.php а отдан сервером сразу.
В таком же случае запрос "../img/img.jpg" не обрабатывается?
721 1468579
>>68575

>В таком же случае запрос "../img/img.jpg" не обрабатывается?


Почему же таком же случае запрос "../img/img.jpg" не обрабатывается?

самофикс
sage 722 1469095
>>46969 (OP)
Хочу сказать спасибо ОПу за существование этих тредов. Благодаря ему "вошёл в АйТи". Прошел его гайд, сделал студентов, файловый хостинг (правда здесь не показывал, ибо было стыдно, да и слишком хикка был ). Попытался устроиться на галеру в другой город (100к променял на 500к (было сложно, очень)). С первого же раза прошел собес (спасибо за упор на ООП и современные технологии, большинство вопросов были по ООП (собес был удаленно, вначале тряслись руки и было очень страшно)). Видимо им понравился файловый хостинг и мой проект на Node.JS. Предложили зп выше той, что я просил, готовы были взять хоть сейчас.

Четвертый месяц как сижу на галере. За это время успел съездить в командировку в UK (после годов хиккования - это было потрясающе (совершенно другой мир)). Узнал что такое Agile и Scrum.
Научился работать в команде. Стал гораздо более общителен, стал менее бояться окружающего мира. И много-много всего остального.

Просто огромное спасибо ОПу за существование сего треда и всем помогающим. Единственное, что могу посоветовать - не сдавайтесь, какими бы тупыми вы себя не считали. Вы не такие, раз смогли дойти до этого треда.

Написано в пьяном желании выразить благодарность.
723 1469111
>>69095
Двачую. ОП, ты очень крутой чел (а может и барышня, кто знает)
724 1469232
>>69095
Какой ценник в итоге получился?
725 1469284
Допустим, у нас есть метод, который принимает аргумент, который может иметь одно из следующих значений: "eot", "eroha".

Как это правильно реализовать? Чтобы в функцию нельзя было просто так передать значение "omega" без последствий.

Очевидный вариант: if ($arg !== "eot" || $arg !== "eroha") { ... }, но интуитивно кажется, что должен существовать какой-то более стройный способ.

Про enum я знаю, но стоит ли под каждый метод, который принимает одно из значений заводить enum? Это сделает код не слишком громоздким?
726 1469285
>>69284

>||


&&

fix
727 1469325
>>69284

>Очевидный вариант: if ($arg !== "eot" || $arg !== "eroha") { ... }, но интуитивно кажется, что должен существовать какой-то более стройный способ.


Можно так:
if (in_array($arg, ['eot', 'eroha'], true)) {}

Или вынести массив в отдельную переменную/поле_класса/константу:
$dvachers = [
'eot',
'eroha',
];
728 1469343
Знает кто как можно запустить анонимную функцию в контексте некоторого объекта? Пилю менеджер событий и запоролся на передаче зависимостей и параметров в обработчик события.

Пробовал через bindTo() но чёта ругается на ссылку $this в функции.

Не хочется городить глобальный контейнер для передачи в обработчики.
729 1469410
>>69343
Это как раз нормально и правильно, создавай класс либо интерфейс Context и прокидывай его.
730 1469486
Я дико извиняюсь за тупой вопрос, но правильно ли я понимаю что в скелете slim MVC паттерн нужно самому прописать? Я совсем не против, но мало ли он там уже осуществлен, а я просто найти его не могу
731 1469492
>>69486
Ты же просто в рутах указываешь обработчик, это или анонимная функция или путь к методу. Вот тебе и весь мвс
732 1469515
>>69410
Сделал передачу $this в обработчик. В этом $this сделал публичные поля, где надо. Вроде цивильно выглядит.
Так пойдёт?
733 1469534
>>69486
слим это контейнер с роутингом. Всю логику ты пишешь сам, по необходимости можно вьюхи подключить или отдавать по апи
734 1469565
>>69492
Так суть задания то в закреплении ооп и mvc

>>69534
Меня просто смутило что у меня сразу после установки 16 тестов c
class User implements JsonSerializable
735 1469623
>>69565
Какое то говно. Два часа не могу контроллер к роуту привязать. Все мини-фреймворки такие душные?
736 1469634
>>69623
Какая версия Слима? Возможно, что ты четвёртую скачал, а делаешь по докам на 3.
sage 737 1469647
>>69232
700. Для джуна без опыта - очень много. Сейчас понимаю, что очень повезло.
image.png353 Кб, 1440x900
738 1469875
Может кто-нибудь посоветовать, как быстрее всего вкатиться в безопасность? Где самые годные уроки/гайды?

Хотелось бы понимать, какие именно действия представляют угрозу для сайта и как уметь максимально от них этот сайт обезопасить. По крайней мере, на таком уровне, чтобы не было стыдно за свои работы на фрилансе (если я, конечно, когда-нибудь начну там получать бабос).

Сразу сорри за много букв. Немного конкретнее опишу свою проблему.

Занимался тут по одному видосу, где рассказывалось, как работать с базой данных, и сделал почти все, что нужно. Только автор видоса предлагал проблему безопасности сайта решить самому. Он обмолвился, что в моем случае можно полям с конкатенацией применить mysqli_real_escape_string. А также сказал что-то про XSS-атаку, от которой можно защититься посредством strip-tags. Я не понял, идет ли речь о том, что нужно выбрать что-то одно из этого, либо же надо несколько фильтров накладывать? Мне уже приходилось использовать strip-tags() для того, чтобы очистить текст от html-тэгов, и вроде как она фильтрует также PHP, но мне не очень ясно, как именно это помогает в безопасности.

Видов атак, я так понял, существует немалое количество. Как от всех них защищаться и в каких случаях нужно применять те или иные функции?

Верно ли я понимаю, что о безопасности впору думать всякий раз, когда на сайте есть какие-либо формы для ввода/работает GET или POST параметр? Но это вроде как касается только SQL-инъекций... Тут, казалось бы, достаточно сделать так, чтобы передаваемая от пользователя информация воспринималось только как текст или число, а не запрос в базу данных.

Собственно, в своем коде я применил mysqli_real_escape_string (как это рассказывается уже в другом ролике, но он на англ: https://www.youtube.com/watch?v=nTgFPcYRkys), а вот со strip-tags решил подождать. Потому что я не очень понимаю, нужен ли он. Нужно ли вообще прогонять информацию, получаемую через $_POST через несколько фильтров (для того, чтобы защититься от разных атак)? Подобные ухищрения кажутся немного нелепыми, но это первое, что пришло мне на ум, а именно создать еще 4 переменных и использовать очередную функцию (в данном случае strip-tags), прогоняя через нее уже имеющиеся переменные. Как паровозик через туннели, ё-мое. На комментарии в скрине внимание можно не обращать, я их оставляю для себя.

Я смотрел как-то еще один ролик, и там сразу про несколько функций рассказывалось, применяющихся для защиты. Помимо strip_tags() еще htmlspecialchars() и htmlentities().

Но из роликов и инфы в нете я получаю какую-то фрагментированную информацию. Знает ли кто-то адекватные источники на эту тему?

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

И что меня интересует больше всего, так это то, зачем в таких запросах нужна конкатенация с двух сторон, именно в таком виде? И еще кавычки внутри кавычек-апострофов. Это связано с безопасностью? В ролике автор как-то не очень объяснил этот момент. До того, как я применил strip-tags, в самом запросе mysqli_query на скрине там были не переменные, а POST-параметр.
image.png353 Кб, 1440x900
738 1469875
Может кто-нибудь посоветовать, как быстрее всего вкатиться в безопасность? Где самые годные уроки/гайды?

Хотелось бы понимать, какие именно действия представляют угрозу для сайта и как уметь максимально от них этот сайт обезопасить. По крайней мере, на таком уровне, чтобы не было стыдно за свои работы на фрилансе (если я, конечно, когда-нибудь начну там получать бабос).

Сразу сорри за много букв. Немного конкретнее опишу свою проблему.

Занимался тут по одному видосу, где рассказывалось, как работать с базой данных, и сделал почти все, что нужно. Только автор видоса предлагал проблему безопасности сайта решить самому. Он обмолвился, что в моем случае можно полям с конкатенацией применить mysqli_real_escape_string. А также сказал что-то про XSS-атаку, от которой можно защититься посредством strip-tags. Я не понял, идет ли речь о том, что нужно выбрать что-то одно из этого, либо же надо несколько фильтров накладывать? Мне уже приходилось использовать strip-tags() для того, чтобы очистить текст от html-тэгов, и вроде как она фильтрует также PHP, но мне не очень ясно, как именно это помогает в безопасности.

Видов атак, я так понял, существует немалое количество. Как от всех них защищаться и в каких случаях нужно применять те или иные функции?

Верно ли я понимаю, что о безопасности впору думать всякий раз, когда на сайте есть какие-либо формы для ввода/работает GET или POST параметр? Но это вроде как касается только SQL-инъекций... Тут, казалось бы, достаточно сделать так, чтобы передаваемая от пользователя информация воспринималось только как текст или число, а не запрос в базу данных.

Собственно, в своем коде я применил mysqli_real_escape_string (как это рассказывается уже в другом ролике, но он на англ: https://www.youtube.com/watch?v=nTgFPcYRkys), а вот со strip-tags решил подождать. Потому что я не очень понимаю, нужен ли он. Нужно ли вообще прогонять информацию, получаемую через $_POST через несколько фильтров (для того, чтобы защититься от разных атак)? Подобные ухищрения кажутся немного нелепыми, но это первое, что пришло мне на ум, а именно создать еще 4 переменных и использовать очередную функцию (в данном случае strip-tags), прогоняя через нее уже имеющиеся переменные. Как паровозик через туннели, ё-мое. На комментарии в скрине внимание можно не обращать, я их оставляю для себя.

Я смотрел как-то еще один ролик, и там сразу про несколько функций рассказывалось, применяющихся для защиты. Помимо strip_tags() еще htmlspecialchars() и htmlentities().

Но из роликов и инфы в нете я получаю какую-то фрагментированную информацию. Знает ли кто-то адекватные источники на эту тему?

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

И что меня интересует больше всего, так это то, зачем в таких запросах нужна конкатенация с двух сторон, именно в таком виде? И еще кавычки внутри кавычек-апострофов. Это связано с безопасностью? В ролике автор как-то не очень объяснил этот момент. До того, как я применил strip-tags, в самом запросе mysqli_query на скрине там были не переменные, а POST-параметр.
739 1469880
>>60202
Ты имеешь в виду, что лучше писать 127.0.0.1 вместо localhost?

Сорри за некропостинг.
740 1469959
.
741 1470004
>>69875
Ты пойми сразу что никто ничего не пишет с нуля.
А готовые решения уже содержат средства для валидации данных и защиты инъекций.
А дальше два подхода
если ты хочешь что то делать то ты изучаешь как правильно использовать продукт;
если ты хочешь понимать как проходят атаки гуглишь атаки конкретно для этого продукта и разбираешь их на сырцах
742 1470011
>>69095
сколько лет? сколько прошло между началом обучения и первым оффером? бочку делаешь?
743 1470014
>>70011
Не ведись глупенький
744 1470166
>>69634
Этот прав. Бери лучше третий слим, там доки лучше и инфы больше.
745 1470171
А какие плюсы у слим 4 ?
746 1470172
это >>70171 сюда>>70166
747 1470198
Оцените мои шансы попасть на работу, нет опыта работы, нет диплома, есть cайт магаза на голом пхп и еще один статический сайт, у меня вообще паническая атака, кажется что с этой хуйней даже бесплатно никто меня не возьмет работать. Скажите может что сделать еще, на работу надо обязательно через месяц.
748 1470233
>>70198
Я проигрываю с местных кастратов, лол.

>>у меня вообще паническая атака


Чтож вы такие немощные то?

Люди вообще нихуя не зная пхп и прочего говна, на джумле/вордпрессе работают и делают сайты на заказ, зарабатывают деньги.
749 1470237
>>70233
П.С.
Я не к тому что бы постебаться.
Я к тому, что любые знания можно продать, а ты >>70198
уже что то умеешь. Но как конченый овощ скулишь

>>Оцените мои шансы попасть на работу


позорище.

Напрягись сам и ищи то что тебе по уровню. Если упорно искать - найдешь обязательно. И прокачаешь решительность, упорство, смелость, умение брать ответственность.
А не стерильное " возьмите меня на работу, я кастрат".
Не будь тряпкой, и верь в себя.
750 1470255
>>70233
да кстати лол, у меня одноклассник так "работал", но ему лет 15 было лол. К 19 уже жоповозку купил учась в колледже.
751 1470256
>>70255
но он работал на себя, а не на дядю)
752 1470279
Поясните по композеру, анонисы. Я первым делом устанавливаю композер. Потом, если я хочу в голом проекте использовать какой-то пакет, я иду в консоль и пишу composer requre пакет/пакет. А что мне делать если у меня уже есть composer.json? Как мне сказать: компосер, выполняй вон тот файл? Просто composer uodate? А зачем тогда composer install?
753 1470297

>А что мне делать если у меня уже есть composer.json?


composer install

>Просто composer uodate?


Не делай composer update. Забудь про существование этой команды (пока, по крайней мере).
754 1470308
>>70279
Composer - это инструмент не только для скачивания, но и для фиксации версий. Потому что mypack@v1 может иметь функцию, которой уже нет в mypack@v2 и твой код, вызывающий её, сломается. Соответственно, необходимо куда-то записать, что ты используешь mypack с версией именно v1.
Так, композер поддерживает два файла файла:
composer.json - "проекту нужен mypack"
composer.lock - "нужно использовать mypack версии v1"

Команды:
composer require mypack v1 - добавит mypack в composer.json и v1 в composer.lock
composer update mypack - обновит версию mypack в composer.lock
composer install - скачает все пакеты из composer.lock с указанными версиями тебе в vendor.

composer install обычно используется при деплое. Твои composer.json и composer.lock лежат под гитом. Ты делаешь git clone или git pull и стягиваешь актуальные версии этих файлов на машину, потом делаешь composer install - и он выкачивает тебе нужные пакеты нужных версий. Всё, проект можно запускать.
755 1470312
>>70297
>>70308
Спасибо, очень доходчиво
756 1470373
>>69880
Да, по крайней мере у нас с товарищем было так. Наверное localhost виндой как-то по-другому интерпретируется, нежели просто ip циферками. Да чё, щас проверю ещё раз. / Да, все ещё есть задержка секунда- полторы. Интересно бы узнать как там, в глубине, это работает.
757 1470403
>>70373
Скорее всего, если ты указываешь адрес напрямую, то твой компьютер обращается по нему безо всяких промежуточных этапов.
А localhost требует вызова службы dns, которая пытается зарезолвить слово "localhost" в какой-то айпишник, обращается к кэшам, ещё куда-то, потом в hosts-файлик и в итоге возвращает 127.0.0.1, куда твой компьютер уже отправляет запрос так же, как и в варианте 1.
(собственно, слово localhost - это вообще нифига не стандарт, просто он прописан в локальном конфиге dns большинства ОСей, как 127.0.0.1)

Скорее всего, у тебя в винде какие-то проблемы с локальной службой dns. Или с ней же, но внутри докера, если ты его используешь. Где-то там в-общем, далее надо смотреть, что именно ты используешь и дебажить.
На всякий случае можешь сбросить локальный кэш dns.
758 1470514
>>70403
На ноде у меня нет такой проблемы, оба варианта работают быстро.
759 1470572
>>70308
>>70279
Хорошо, годно расписал.

Composer update обновит тебе все библиотеки до свежих версий и в большинстве случаев добавит тебе жопного веселья с пачкой новых багов. Обновлять библиотеки стоит по одной и только когда ты уверен, что оно тебе надо.
760 1470683
>>70373
Ок, спасибо, буду так делать на всякий случай.
761 1470690
>>70004

>ты пойми


Ничего не понял из твоего поста. Для меня это просто каша из непонятных слов, т.к. я совсем новичок в программировании.

>готовые решения


>валидация данных


>продукт


>на сырцах


Мне бы понять, в какую сторону вообще двигаться. Есть ли какой-то гайд или книга годная на эту тему?
762 1470854
>>70690
Приходит тебе заказ сделать сайт для компании, ты берешь например битрикс для реализации, потому как нет смысла для типичного проекта писать все руками с нуля.
Ты изучаешь как правильно им пользоваться. Например рядовое место для инъекций это формы (для отзывов, для записи на что либо). Соответственно ты смотришь примеры как это правильно сделать в битриксе. И если ты сделаешь по гайдам с офсайта то у тебя и не возникнет проблем.
763 1470869
>>70854
Чуваки, что угодно, только не битрикс. Действительно, что угодно, хоть yii, хоть древний, как говно мамонта, codeigniter, хоть wordpress (хотя тоже то ещё говно).
Но только не битрикс. Не заботитесь о себе - позаботьтесь о тех, кому после вас это поддерживать.
А новичку его вообще предлагать нельзя. Хороших паттернов он не выучит, навыки архитектуры не прокачает, на зарубежных клиентов работать не сможет. Эдакая западня.
Screenshot25.png9 Кб, 811x109
764 1470925
Пиздец, ну и говноедство.
И это убожество называется Laravel.

Действительно, почему бы при сраном удалении нескольких записей не создать инстанс объекта для каждой из них?

В который раз убеждаюсь, что все эти ORM годятся исключительно для васянских манясайтов с нагрузкой не больше 5 одновременных запросов.
765 1470942
>>70572
спасибо
766 1470953
>>70925
А что ты еще ожидал от пыхарей?
767 1470955
>>70869

>на зарубежных клиентов работать не сможет


Он их и так найти не сможет (нормальных, по крайней мере), если продолжит писать на php.
768 1470963
>>70955
О, вот и хейтеры подъехали.

Мимо-пыхарь-работает-удалённо-на-нидерланды-за-3-килобакса.
769 1470993
>>70963

>Мимо-пыхарь-работает-удалённо-на-нидерланды-за-3-килобакса.


Какие же пыхари дегенераты, простигосподи.

мимо-жавист-котлинист-работает-в-комфортном-офисе-за-300-килорублей
770 1470999
>>70925
Ты не дорос ещё.
771 1471043
>>70925

>Действительно, почему бы при сраном удалении нескольких записей не создать инстанс объекта для каждой из них?


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

Так-то тебе никто не мешает взять вордпресс и не ебать умным людям мозги.
772 1471069
ох как на понахватаются по верхам , а потом вот с такими и работать
>>71043
773 1471070
>>70993
мимо-жавист-котлинист-анонист-гребёт -в кандалах-на-галере-с-корпо -булшитом-за-300-килорублей
774 1471103
>>70854
Теперь немного понял. С нуля - т.е. на чистом пхп без всяких CMS, фреймворков и т.д., да? Т.е. нет особого смысла вкатываться в безопасность, пока не начну работать с фреймворками?
775 1471148
>>71069
Ты хр у нас не пройдёшь с такими тупыми вопросами. Рано тебе ещё работать.
776 1471153
>>71148
нахуя мне хрюндель и твоя помойка галера если я на себя работаю уже как с 10 лет

мимо вопрос не мой , другой анон
777 1471156
>>70925
а что ты ожидал от Eloquent и ОRM в целом ? сделано тупым говном для тупого говна как и сама Лара для написания чего-то на коленки за минимум секунд, алсо особые дауны пытаются пародировать dao и приминают подходы от туда.
778 1471418
>>71103
Да, да
Лучшее обучение разбирать чужой хороший код и делать так же
779 1471516
Подскажите пожалуйста на счет базы данных для файлообменника. Мне нужна 1 таблица, в которой будет храниться id,file_path, file_name, file_size, file_extension, created_at ? Или имя, разрешение, размер - лишняя информация, которую можно обрабатывать при необходимости каждый раз? Или этой информации вообще мало, и нужно добавить что то еще? И ведь правильно, что выходит только 1 модель и контролер? На первый взгляд задача кажется легкой, или ее смысл научить работать с файлами?
780 1471677
Господа, ответственно заявляю что я ленивая пидораха. Это самое хуевоe.
Уже месяцев 5 барахтаюсь на одном и том же уровне. Чето типа блога с ноля способен написать. И завис.
Есть работка, платят не среднюю по РФ, на работке есть паралельная задача написать определенный сервис, я его общую логику написал. Но я пишу его еле еле, кое как по три строки в день.
Если бы взялся уверенно - давно бы уже сделал, и мне бы ЗП подняли. Но я как дерьмо в проруби.
Пиздец мне это надоело.
781 1471678
>>71677
Как взять себя в руки, и перестать быть хуепутолом? :(
Слабак я.

это риторический вопрос
782 1471704
>>71677
Аношка, я уверен, если тебя прижмет, ты быстро и качественно выполнишь любую работу, так что не напрягайся зря. Выдели в день по десять минут на самосовершенствование - для начала. Просто каждый день эти 10 минут трать и постепенно увеличивай. И само пойдет - привычка сильная сила
783 1471707
>>71704
Я если честно себя уважать уже перестал, ну что это за дела?
Деньги пусть обычные платят, мозг не ебут, чему то я по итогу научился, задача есть. Время есть.
Мне блядь просто стыдно.
784 1471712
>>71707
Это обычная реакция умного человека - не напрягаться без нужды. Выдели 10 минут в день для начала и все
image.png2,1 Мб, 1280x960
785 1471850
Предлагаю Славика в шапку следующего треда. Способный малый оказывается.
786 1471852
>>71850
Зачем он девочке на ногу наступил?
787 1471867
>>71852
Солидный человек. Может себе позволить.
788 1471920
Уважаемые, а может кто подскажет, что именно делает директива pcre.jit = 0 в php.ini?
А то вот опытным путём обнаружил, что в тестировании конфигурации битрикса она убирает предупреждение про размер стека, но возникают подозрения, что этим я какой-то функционал отключаю.
789 1471969
>>71516
Собственно вопрос в том, что выгодней. Хранить такие данные или вычислять их при необходимости каждый раз?
image.png56 Кб, 739x457
790 1472006
Как мне найти эти методы? Пишут что смотреть остальные методы тут: https://github.com/symfony/symfony/blob/3.0/src/Symfony/Component/HttpFoundation/File/UploadedFile.php но там нет тех, что на скрине. Все классы родителей перерыл. Знаю что можно использовать стандартные функции для работы с файлами, но у меня с головы не выходит мысль что я не смог найти то, что мне нужно.
791 1472030
>>72006
Нашел. Когда искал пропустил trait FileHelpers
793 1472072
Ребят, уже часа 2 не могу разобраться с этим, не понимаю почему приходит только часть массива. Мне нужно загрузить файл через курл, но приходит как раз всё кроме файла. Контент тайп = мультипарт/форм-дата ставил.
794 1472103
Аноны, а это нормально забить гитхаб сайтами, которые я по урокам на ютубе делаю? Тип на работе не пробьют этот сайт и не чекнут что он спизжен?
795 1472121
>>72072
$_FILES
796 1472125
>>72121
thx, для довнс вроде меня тяжело даётся
но нравится
797 1472198
>>71103

>Т.е. нет особого смысла вкатываться в безопасность, пока не начну работать с фреймворками?


Очень спорное утверждение, аношка. За ним может скрываться чистая лень типа "я щас на голом php не буду делать проверку на инъекцию и эддслеши, зачем, ведь во фреймворках все есть". Но чисто для саморазвития, чего и хочет добиться оп, это плохо, потому что ты упускаешь кучу нюансов и можешь просто не понять как работает функция "безопасности" во фреймворке
798 1472199
>>71969
>>71516
Вроде как оп советует вычислить их один раз с помощью сторонней библиотеки/средствами скрипта и хранить в базе в виде jcon объекта. То-есть, как я понимаю, будет одно лишнее поле с текстом объекта. Кроме того, оп еще пишет делать комментарии к скачиваемым файлам, то-есть это еще одна таблица, у которой будет текст камента, айди камента, потом парент айди - для двевовидных каментов, и айди-файла - чтобы знать кому этот камент принадлежит. Хотя это может быть факультативным заданием со звездочкой
799 1472217
ОП и Компания, помогите додумать задачу "Алфавит по кругу". Вроде все правильно, но то как выглядит код меня не устраивает, ибо заготовка ОПа с $fromAngle = -80, $toAngle = 260; явно должна была использоваться как то по другому. И какого черта у меня ноль градусов находится в районе 6 часов, а не как у ОПа в районе 3 часов, отсюда и проблема с $fromAngle = -80; $toAngle = 260; да и сам алфавит у меня верх ногами получился, пришлось реверс делать. Если есть возможность - сделайте правку в самом коде. Заранее спасибо!
https://3v4l.org/BEGtc
[Ссылка]
BEGtc
https://3v4l.org/BEGtc
51.PNG20 Кб, 687x452
800 1472344
Возможно это реализовать на yii2 ? Если да, то как ?
Помогите тупому
801 1472420
>>72344
это надо сделать апишку ?
если да то можно но зачем ?

https://forum.yiiframework.com/t/creating-a-rest-api-for-yii2-basic-template/87613
61.PNG5 Кб, 619x75
802 1472424
>>72420

>но зачем ?


Дали такое задание.
803 1472468
>>47479
Как определил?
804 1472516
>>72468
Член встал, как же еще
805 1472528
>>72424
и обязательно на yii2 ? или можно любой другой фрейм ? для таких задач обычно микроферймы типа слим люмен етц юзают , но это весьма изи задание
806 1472604
>>72103
Бамп, что никто проекты чужие в портфолио не запихивал?
759 - 805 807 1472613
>>71920

JIT = just-in-time compilation. Это опция, которая позволяет взять регулярку и скомпилировать из нее программу в машинных кодах, которая проверяет строку на соответствие регулярке (вместо того, чтобы сопостовлять регулярку со строкой с помощью интерпретатора).

По умолчанию JIT не используется, а используется программа-интерпретатор. Она разбирает регулярку, преобразует ее в дерево, затем по нему генерирует набор инструкций, выполняет их, проверяя строку на соответсвие регулярке.

JIT - это значит, что мы берем регулярку вида "/^abc/" и преобразуем (компилируем) ее, например, в исполняемый PHP-код:

function is_match($string) {
return mb_substr($string, 0, 3) == 'abc';
}

И используем этот код для проверки строки на соответствие вместо того, чтобы использовать универсальный интерпретатор. Единственное отличие - JIT генерирует не PHP-код, а машинный код - команды, которые напрямую выполняет процессор и которые обеспечивают максимальную производительность.

Подробно она описана в документации к библиотеке PCRE: https://www.pcre.org/original/doc/html/pcrejit.html , учти что это сишная библиотека и там есть примеры кода на Си.

Если кратко:

- JIT позволяет ускорить сопоставление строки с выражением, убрав накладные расходы на работу программы-интерпретатора, так как в JIT она не используется, мы напрямую преобразуем регулярку в программу-проверяльщик.
- JIT поддерживается не для всех архитектур и не для всех конструкций в регулярке
- JIT - новая технология и может глючить
- при отключении JIT регулярки не перестанут работать, но будут работать медленнее, чем могли бы

>>72217

> И какого черта у меня ноль градусов находится в районе 6 часов, а не как у ОПа в районе 3 часов



А ты наверно синус с косинусом местами перепутал. При 0 градусов синус равен нулю, а косинус - единице. Если у тебя синус на оси X, то при нуле градусов у тебя будет либо 12 часов, либо 6 в зависимости от знака (+/-) перед косинусом. В компьютерной графике традиционно 0 градусов лежит на 3 часах и угол отсчитывается против часовой стрелки.

> $curDegree = round($degree);



Начальный угол, наверно, должен равняться $fromAngle.

В остальном, решение верное.
759 - 805 807 1472613
>>71920

JIT = just-in-time compilation. Это опция, которая позволяет взять регулярку и скомпилировать из нее программу в машинных кодах, которая проверяет строку на соответствие регулярке (вместо того, чтобы сопостовлять регулярку со строкой с помощью интерпретатора).

По умолчанию JIT не используется, а используется программа-интерпретатор. Она разбирает регулярку, преобразует ее в дерево, затем по нему генерирует набор инструкций, выполняет их, проверяя строку на соответсвие регулярке.

JIT - это значит, что мы берем регулярку вида "/^abc/" и преобразуем (компилируем) ее, например, в исполняемый PHP-код:

function is_match($string) {
return mb_substr($string, 0, 3) == 'abc';
}

И используем этот код для проверки строки на соответствие вместо того, чтобы использовать универсальный интерпретатор. Единственное отличие - JIT генерирует не PHP-код, а машинный код - команды, которые напрямую выполняет процессор и которые обеспечивают максимальную производительность.

Подробно она описана в документации к библиотеке PCRE: https://www.pcre.org/original/doc/html/pcrejit.html , учти что это сишная библиотека и там есть примеры кода на Си.

Если кратко:

- JIT позволяет ускорить сопоставление строки с выражением, убрав накладные расходы на работу программы-интерпретатора, так как в JIT она не используется, мы напрямую преобразуем регулярку в программу-проверяльщик.
- JIT поддерживается не для всех архитектур и не для всех конструкций в регулярке
- JIT - новая технология и может глючить
- при отключении JIT регулярки не перестанут работать, но будут работать медленнее, чем могли бы

>>72217

> И какого черта у меня ноль градусов находится в районе 6 часов, а не как у ОПа в районе 3 часов



А ты наверно синус с косинусом местами перепутал. При 0 градусов синус равен нулю, а косинус - единице. Если у тебя синус на оси X, то при нуле градусов у тебя будет либо 12 часов, либо 6 в зависимости от знака (+/-) перед косинусом. В компьютерной графике традиционно 0 градусов лежит на 3 часах и угол отсчитывается против часовой стрелки.

> $curDegree = round($degree);



Начальный угол, наверно, должен равняться $fromAngle.

В остальном, решение верное.
808 1472614
>>72217

> И какого черта у меня ноль градусов находится в районе 6 часов, а не как у ОПа в районе 3 часов



А ты наверно синус с косинусом местами перепутал. При 0 градусов синус равен нулю, а косинус - единице. Если у тебя синус на оси X, то при нуле градусов у тебя будет либо 12 часов, либо 6 в зависимости от знака (+/-) перед косинусом. В компьютерной графике традиционно 0 градусов лежит на 3 часах и угол отсчитывается против часовой стрелки.

> $curDegree = round($degree);



Начальный угол, наверно, должен равняться $fromAngle.

В остальном, решение верное.

>>71516
>>71969

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

- плюс в том, что можно сортировать файлы по размеру, считать суммарный объем загруженных файлов, в том числе по дням
- плюс в том, что при выводе списка файлов не надо обращаться к диску, чтобы узнать их размер. Если у нас распределенный проект, и веб-интерфейс работает на одном сервере, а файлы хранятся на других серверах, то обращаться с одного сервера к другому очень невыгодно, медленно, и данные нужно хранить именно в БД
- минус в том, что в таблице будет на одно небольшое поле больше

Насчет имени файла - я думаю, надо хранить:

- оригинальное имя, чтобы выводить его на странице и подставлять в диалог сохранения при скачивании файла
- имя, под которым файл хранится. Оно может отличаться от оригинала по таким причинам: чтобы убрать спецсимволы, чтобы при загрузке нескольких файлов с одинаковым именем они не затирали друг друга

> И ведь правильно, что выходит только 1 модель и контролер?



Наверно, да. У тебя же по сути один раздел на сайте с 3 действиями: закачка файла, просмотр информации о файле, скачивание файла. И одна сущность: файл.

Если будут комментарии, то для них будет своя модель.

>>72199

В виде JSON я советую хранить метаданные (для картинки - размер, для аудиофайла - длительность, число каналов, параметры кодеков), у которых нет какой-то определенной схемы, и которые из-за этого не получится или невыгодно хранить в отдельных колонках.
808 1472614
>>72217

> И какого черта у меня ноль градусов находится в районе 6 часов, а не как у ОПа в районе 3 часов



А ты наверно синус с косинусом местами перепутал. При 0 градусов синус равен нулю, а косинус - единице. Если у тебя синус на оси X, то при нуле градусов у тебя будет либо 12 часов, либо 6 в зависимости от знака (+/-) перед косинусом. В компьютерной графике традиционно 0 градусов лежит на 3 часах и угол отсчитывается против часовой стрелки.

> $curDegree = round($degree);



Начальный угол, наверно, должен равняться $fromAngle.

В остальном, решение верное.

>>71516
>>71969

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

- плюс в том, что можно сортировать файлы по размеру, считать суммарный объем загруженных файлов, в том числе по дням
- плюс в том, что при выводе списка файлов не надо обращаться к диску, чтобы узнать их размер. Если у нас распределенный проект, и веб-интерфейс работает на одном сервере, а файлы хранятся на других серверах, то обращаться с одного сервера к другому очень невыгодно, медленно, и данные нужно хранить именно в БД
- минус в том, что в таблице будет на одно небольшое поле больше

Насчет имени файла - я думаю, надо хранить:

- оригинальное имя, чтобы выводить его на странице и подставлять в диалог сохранения при скачивании файла
- имя, под которым файл хранится. Оно может отличаться от оригинала по таким причинам: чтобы убрать спецсимволы, чтобы при загрузке нескольких файлов с одинаковым именем они не затирали друг друга

> И ведь правильно, что выходит только 1 модель и контролер?



Наверно, да. У тебя же по сути один раздел на сайте с 3 действиями: закачка файла, просмотр информации о файле, скачивание файла. И одна сущность: файл.

Если будут комментарии, то для них будет своя модель.

>>72199

В виде JSON я советую хранить метаданные (для картинки - размер, для аудиофайла - длительность, число каналов, параметры кодеков), у которых нет какой-то определенной схемы, и которые из-за этого не получится или невыгодно хранить в отдельных колонках.
809 1472615
>>71103

Безопасность не зависит от того, используешь ты фреймворк или нет. В фреймворках есть средства для защиты от уязвимостей, но если о них не знать, то можно ее допустить. Советую почитать мои несколько базовых уроков о популярных уязвимостях: https://github.com/codedokode/pasta/tree/master/security

>>70925

Так тебе никто не запрещает удалять SQL-запросом. На практике удобно совмещать ORM и SQL. Ну например, если тебе надо посчитать сумму по какой-то колонке, выгоднее это делать через SQL, чем загружать в PHP 1000 объектов, суммировать их поля и выбрасывать эти объекты.

Причина, почему ORM так делает, там написана. Также, в Доктрине есть "ленивая" загрузка, которая позволяет не загружать данные при создании объекта.

И какую альтернативу ты предложишь? Отказаться от ORM и моделей-объектов и передавать массивы неизвестной структуры из функции в функцию? Потом в таком коде не разобраться. По моему опыту, удобнее использовать ORM для маленьких объемов данных и SQL для каких-то операций на большом числе записей.

А если у тебя очень высокая нагрузка ... может быть, тебе нужен не PHP.

>>70854

А еще у битрикса можно получать вознаграждение за покупку продукта по твоей рекомендации ;)

Битрикс и правда хреновый, там по моему требуется настройки в php.ini менять, чтобы он работал. Хорошо, что я с ним не работаю.
810 1472616
>>69875

Начни отсюда: https://github.com/codedokode/pasta/tree/master/security

Изучи каждую уязвимость, можешь даже сам сделать страницу с ней и сам взломать. Только не "проверяй" чужие сайты, это может быть незаконно.

Если хочешь учиться далее, смотри OWASP top 10 - 10 самых популярных уязвимостей: https://www.owasp.org/images/7/72/OWASP_Top_10-2017_(en).pdf.pdf

Увы, там пояснения не очень простые и не очень понятные. Так что ты можешь по каждой уязвимости гуглить информацию дополнительно. Вот например презентация про SQL инъекции: https://www.ptsecurity.com/upload/corporate/ru-ru/analytics/PT-devteev-Advanced-SQL-Injection.pdf

Далее, есть сайт с каталогом всех известных уязвимостей (не только на сайтах, а вообще в любых программах), для каждой уязвимости делается описание и присваивается номер. Вот обзор уязвимостей: https://www.cvedetails.com/vulnerabilities-by-types.php

Вот список уязвимостей по вордпрессу: https://www.cvedetails.com/product/4096/Wordpress-Wordpress.html?vendor_id=2337

Вот пример одной из них (SQL инъекция в плагине): https://www.cvedetails.com/cve/CVE-2011-5216/

Вот изменения, которые ее исправляют, и по ним можно попробовать понять, в чем она заключалась: https://plugins.trac.wordpress.org/changeset/435356/scormcloud

Можешь порыться, хотя там сложно будет разобраться.

По идее тебе надо искать курс по теме "безопасность веб-приложений"/"уязвимости веб-приложений". Попробуй набрать это в Гугле и изучить первые 10 страниц выдачи, вдруг что найдется.

> Видов атак, я так понял, существует немалое количество. Как от всех них защищаться и в каких случаях нужно применять те или иные функции?



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

- SQL инъекции
- инъекции в eval
- XSS
- CSRF (cross site requst forgery)
- session fixation
- такую уязвимость: https://habr.com/ru/post/124387/ и https://habr.com/ru/post/124898/
- уязвимости при загрузке файлов на сервер
- раскрытие информации (путей к файлам, параметров конфигурации итд)
- как безопасно хранить пароли
- как безопасно сделать авторизацию и проверку прав доступа
- same-origin policy в браузерах, CORS (cross-origin resource sharing)

Я не знаю, единственный способ наверно изучить существующие популярные уязвимости и не допускать их. Ну и писать код так, чтобы в нем были нужные проверки данных, для каждого вида данных определять допустимые значения и фильтровать/валидировать. При подстановке данных (в SQL-запрос, в HTML-код, в URL) экранировать нужной функцией. При использовании потенциально опасных функций (запуск внешней программы, прием файла от пользователя) проверять все особо тщательно.

> Мне уже приходилось использовать strip-tags() для того, чтобы очистить текст от html-тэгов, и вроде как она фильтрует также PHP, но мне не очень ясно, как именно это помогает в безопасности.



Читай мой урок по XSS, там объясняется.

> Верно ли я понимаю, что о безопасности впору думать всякий раз, когда на сайте есть какие-либо формы для ввода/работает GET или POST параметр?



Не только. От пользователя приходят еще и другие данные:

- файлы при загрузке файлов (что, если он загрузит к тебе php-файл с кодом?)
- HTTP-заголовки в $_SERVER
- куки в $_COOKIE

Также, уязвимость может возникнуть при взятии данных из БД, которые ранее туда положил пользователь, а ты не проверил тщательно.

> Нужно ли вообще прогонять информацию, получаемую через $_POST через несколько фильтров (для того, чтобы защититься от разных атак)?



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

Код у тебя плохой. Данные удобнее подставлять с помощью подготовленных запросов и плейсхолдеров.

Косые кавычки нужны, если имя поля или таблицы является зарезервированным словом (вроде SELECT или INT) в языке SQL. Официальный мануал, попробуй прочесть: https://dev.mysql.com/doc/refman/8.0/en/identifiers.html

Если есть еще вопросы, задавай, только сначала прочитай мои уроки по ссылке выше.
810 1472616
>>69875

Начни отсюда: https://github.com/codedokode/pasta/tree/master/security

Изучи каждую уязвимость, можешь даже сам сделать страницу с ней и сам взломать. Только не "проверяй" чужие сайты, это может быть незаконно.

Если хочешь учиться далее, смотри OWASP top 10 - 10 самых популярных уязвимостей: https://www.owasp.org/images/7/72/OWASP_Top_10-2017_(en).pdf.pdf

Увы, там пояснения не очень простые и не очень понятные. Так что ты можешь по каждой уязвимости гуглить информацию дополнительно. Вот например презентация про SQL инъекции: https://www.ptsecurity.com/upload/corporate/ru-ru/analytics/PT-devteev-Advanced-SQL-Injection.pdf

Далее, есть сайт с каталогом всех известных уязвимостей (не только на сайтах, а вообще в любых программах), для каждой уязвимости делается описание и присваивается номер. Вот обзор уязвимостей: https://www.cvedetails.com/vulnerabilities-by-types.php

Вот список уязвимостей по вордпрессу: https://www.cvedetails.com/product/4096/Wordpress-Wordpress.html?vendor_id=2337

Вот пример одной из них (SQL инъекция в плагине): https://www.cvedetails.com/cve/CVE-2011-5216/

Вот изменения, которые ее исправляют, и по ним можно попробовать понять, в чем она заключалась: https://plugins.trac.wordpress.org/changeset/435356/scormcloud

Можешь порыться, хотя там сложно будет разобраться.

По идее тебе надо искать курс по теме "безопасность веб-приложений"/"уязвимости веб-приложений". Попробуй набрать это в Гугле и изучить первые 10 страниц выдачи, вдруг что найдется.

> Видов атак, я так понял, существует немалое количество. Как от всех них защищаться и в каких случаях нужно применять те или иные функции?



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

- SQL инъекции
- инъекции в eval
- XSS
- CSRF (cross site requst forgery)
- session fixation
- такую уязвимость: https://habr.com/ru/post/124387/ и https://habr.com/ru/post/124898/
- уязвимости при загрузке файлов на сервер
- раскрытие информации (путей к файлам, параметров конфигурации итд)
- как безопасно хранить пароли
- как безопасно сделать авторизацию и проверку прав доступа
- same-origin policy в браузерах, CORS (cross-origin resource sharing)

Я не знаю, единственный способ наверно изучить существующие популярные уязвимости и не допускать их. Ну и писать код так, чтобы в нем были нужные проверки данных, для каждого вида данных определять допустимые значения и фильтровать/валидировать. При подстановке данных (в SQL-запрос, в HTML-код, в URL) экранировать нужной функцией. При использовании потенциально опасных функций (запуск внешней программы, прием файла от пользователя) проверять все особо тщательно.

> Мне уже приходилось использовать strip-tags() для того, чтобы очистить текст от html-тэгов, и вроде как она фильтрует также PHP, но мне не очень ясно, как именно это помогает в безопасности.



Читай мой урок по XSS, там объясняется.

> Верно ли я понимаю, что о безопасности впору думать всякий раз, когда на сайте есть какие-либо формы для ввода/работает GET или POST параметр?



Не только. От пользователя приходят еще и другие данные:

- файлы при загрузке файлов (что, если он загрузит к тебе php-файл с кодом?)
- HTTP-заголовки в $_SERVER
- куки в $_COOKIE

Также, уязвимость может возникнуть при взятии данных из БД, которые ранее туда положил пользователь, а ты не проверил тщательно.

> Нужно ли вообще прогонять информацию, получаемую через $_POST через несколько фильтров (для того, чтобы защититься от разных атак)?



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

Код у тебя плохой. Данные удобнее подставлять с помощью подготовленных запросов и плейсхолдеров.

Косые кавычки нужны, если имя поля или таблицы является зарезервированным словом (вроде SELECT или INT) в языке SQL. Официальный мануал, попробуй прочесть: https://dev.mysql.com/doc/refman/8.0/en/identifiers.html

Если есть еще вопросы, задавай, только сначала прочитай мои уроки по ссылке выше.
5к.PNG3 Кб, 728x56
811 1472632
>>72528
Только эти фреймворки можно использовать. Я вообще фреймворки не использовал, только-только начал изучать. А как эту задачу сделать я не представляю
812 1472735
>>72632
почитай про API , потом ищи примеры реализации АПИ на ларавеле (наверно есть на ларакасте) , начинай делать и решай попутно проблемы.
813 1472774
>>72344
Там фреймворк за тебя сам все сделает. Создаешь модельку, пишешь у ней rules с указанными требованиями, передаешь то что пришло в модель и дергаешь validate, оно тебе вернет bool, если там false, то getErrors кажется возвращает как раз массив вида поле=>ошибки
814 1472825
>>72632
Стоит понимать, что yii2 уже порядочно пованивает. Лучше взять laravel, symphony либо какой-то из микрофреймворков, указанных выше.
Совсем новичкам я бы посоветовал Laravel, как самый простой и имеющий сразу в коробке всё, что понадобится, без необходимости надстраивать микрофреймворк какими-то внешними пакетами.
А накодить можно что угодно на чём угодно, это не показатель.
815 1472915
>>72735
>>72774
>>72825
Спасибо за ответы
816 1472930
>>72825

>Стоит понимать, что yii2 уже порядочно пованивает


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

>Лучше взять laravel, symphony


с 4 симфой возможно , лажа для такой типовой задачи точно мимо когда есть спец люмен который не требует доп настроек

>Cовсем новичкам я бы посоветовал Laravel, как самый простой и имеющий сразу в коробке всё


всё в коробке есть у любого фрейма , но лара вместе с лара кастом делают кодера инвалида ибо джуны учат джунов что не круто , лару можно брать при сильном контроле синьёра (толкового) , симфа по выгоднее как с её философией так и стем кол вом ООП и ДДД пропагандой которую она несёт, порог выше да , но и профита больше по итогу.

после полу года работы на ларе так и не понял на что дроч на неё даже по сравнению с тем же yii.
817 1473073
>>72614

>В такой ситуации стоит выписать возможные варианты, их плюсы и минусы, и выбрать оптимальный в данной ситуации. Например, рассмотрим хранение размера в БД:



Спасибо что ответил, опчик.

Аноны, кому не впадлу. Я вывел видео/аудио тегом <video>. Но, как я понял, данный способ сейчас не используют. Может у кого есть в закладках хороший гайд по этой теме?
818 1473081
>>73073

>Но, как я понял, данный способ сейчас не используют.


с чего ты это взял анончик ?
819 1473090
>>73081
Вчера когда искал инфу - выдавало iframe и еще что то. Нашел только что в бутстрапе есть класс 'video-fluid', которого на деле не было (долго тупил, в итоге понял что он просто не прописан. прописал сам). В общем сложилось такое впечатление по вчерашнему опыту гугла.
Мне стыдно даже как то просить скинуть ссылку на что-то, ведь я и сам могу уделить время и поискать. Только встал сегодня - убунту не запускается моя,час назад переустановил полностью, сижу среду настраиваю. Вот и спросил, может у кого под рукой хороший гайд по этой теме.
Но судя по тому что ты спросил - мои догадки ошибочны.Только сейчас вспомнил, что читал вчера, мол эти плееры встроенные в браузеры можно джава скриптом как то менять/настраивать.
820 1473257
>>73073

>Я вывел видео/аудио тегом <video>. Но, как я понял, данный способ сейчас не используют.



А разве сейчас можно подключать мультимедиа как-то иначе?

>>73090

>выдавало iframe и еще что то


iframe в котором тот же audio/video тег
821 1473380
Аноны, какие есть альтернативы phpMyAdmin?
822 1473405
>>73380
для каких целей ?
есть https://www.adminer.org
в пхпшторме есть модель довольно удобный
я ещё использовал https://www.heidisql.com тоже довольно удобный
823 1473406
>>73405
*модуль
824 1473412
>>72615
>>72616
Чувак, спасибо. Самый годный ответ на мои вопросы. Ближайший месяц вынужден заниматься другими делами, но как только смогу вернуться к обучению кодингу, буду разбираться.
806 - 824 825 1473544
>>73090

> Нашел только что в бутстрапе есть класс video-fluid



А этот класс есть в документации? https://getbootstrap.com/docs/4.3/getting-started/introduction/ Если нет, то ты скорее всего что-то напутал.

>>73073

У тебя неверная информация, HTML5 audio/video сейчас как раз используют. Но там есть одна проблема: аудио и видио бывает разных форматов (есть разные форматы файлов-контейнеров, аудио/видеокодеков, разные профили этих кодеков) и разные браузеры поддерживают разные форматы. Более того, поддержка формата в одном и том же браузере может быть разной в разных ОС.

Вот информация: https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats

Если ты хочешь, чтобы видео/аудио работало в максимальном числе браузеров, то надо выбрать несколько наиболее поддерживаемых форматов и конвертировать медиафайл в них (например, с помощью ffmpeg).

> убунту не запускается



Если ты сидишь под рутом, то отвыкай и сиди под обычным пользователем, так как иначе очень легко что-то сломать.
826 1473568
Оп у меня следующая проблема:
Я хочу попасть в какое нибудь комюнити или заиметь своих сподвижников. Что я имею введу: Я хотел бы вести какой нибудь опенсорсный проект, не запарно и с другими людьми (пусть это будет пакет для Фреймворка или что то в этом роде). Какой профит я с этого поимею:
1. Будет проект которым можно баловать свое самолюбие
2. Смотря на код других я смогу подчерпнуть что то для себя
3. Даже когда мне будет лень что то делать или же не будет времени - проект будет развиваться так как есть другие люди и не будет демотивации по принципу: Сколько еще надо сделать и где на все это времени найти.

И так вопрос как мне в это влиться, у меня есть выложены а гите пакеты и некоторые пошарены в композер, есть плагины для редактора которыми я и сам пользуюсь но у них мало звезд и мало скачиваний. Я считаю просто потому что они никому не известны (ну да может конечно нахрен никому не сдались но надеюсь что нет).

Пс не хочу пулреквестить в сами фреймворки так как это капля в море и сосем не тешит мое тщеславие.
827 1473678
>>72930
у laravel более чистая архитектура, больше экосистема и аудитория и он не застрял в 2009.
Мне приходилось поддерживать проекты на yii, и это ад. Ни тебе нормального слоя конфигурации, ни тебе нормального контейнера, ничего. Всё какое-то самописное, на магии и сайд эффектах. Фу-фу-фу.
Сранивать с тем же laravel смысла нет вообще, настолько в yii всё убого.
изображение.png38 Кб, 1143x397
828 1473872
Привет двач, почему вместо букв у меня херня какая-то в массиве?
830 1473894
>>73878
Спасибо, переделал
831 1473912
>>73568

Давай разделим вопрос на две части: про известность и про коммьюнити. Чтобы повысить известность, надо о себе рассказывать и себя рекламировать. Это можно делать несколькими способами:

- искать всякие обзоры вроде "топ 100 плагинов для редактора X" и писать их авторам, что ты написал такой-то плагин и может быть, они добавят его в текущий или в следующий обзор. На Хабре выходят дайджесты вроде "события из мира PHP", можно написать их авторам.
- если это плагин к редактору, то у него наверно есть какой-то официальный или неофициальный каталог/рейтинг плагинов или что-то такое, надо посмотреть, как добавиться туда
- делать хорошие описания и ставить теги в описании пакета, чтобы он выдавался в поиске по ключевым словам. Посмотри, какие описания стоят у аналогичных пакетов.
- можно попробовать написать статью на Хабр о своем проекте. Но там по моему есть ограничения на пиар, потому вместо "посмотрите, какой я хороший написал плагин" можно сделать статью "как писать плагины к редактору на примере X"
- можно написать статью в своем блоге и запостить на Hacker News, но не факт, что она там надолго задержится
- можно искать вопросы на сайтах вроде SO, где люди спрашивают как что-то сделать, и рекомендовать свой плагин, но опять же, соблюдая их правила и раскрывая, что ты являешься его автором

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

Теперь о контрибуторах. С этим будет сложнее. В опен сурсе люди обычно делают что-то, только если это им самим очень нужно. Часто из 100 человек 99 только пользуются и 1, может быть, что-то вложит в проект. Потому тут опять же все завязывается на известность, чем больше будет пользователей, тем охотнее они будут контрибутить.

> Пс не хочу пулреквестить в сами фреймворки так как это капля в море и сосем не тешит мое тщеславие.



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

То есть нужно делать то, что тебе самому нужно, а не кому-то другому. Тогда про тщеславие вспоминать не придется.

>>73878

str_split не работает с русскими буквами, читай урок https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md
831 1473912
>>73568

Давай разделим вопрос на две части: про известность и про коммьюнити. Чтобы повысить известность, надо о себе рассказывать и себя рекламировать. Это можно делать несколькими способами:

- искать всякие обзоры вроде "топ 100 плагинов для редактора X" и писать их авторам, что ты написал такой-то плагин и может быть, они добавят его в текущий или в следующий обзор. На Хабре выходят дайджесты вроде "события из мира PHP", можно написать их авторам.
- если это плагин к редактору, то у него наверно есть какой-то официальный или неофициальный каталог/рейтинг плагинов или что-то такое, надо посмотреть, как добавиться туда
- делать хорошие описания и ставить теги в описании пакета, чтобы он выдавался в поиске по ключевым словам. Посмотри, какие описания стоят у аналогичных пакетов.
- можно попробовать написать статью на Хабр о своем проекте. Но там по моему есть ограничения на пиар, потому вместо "посмотрите, какой я хороший написал плагин" можно сделать статью "как писать плагины к редактору на примере X"
- можно написать статью в своем блоге и запостить на Hacker News, но не факт, что она там надолго задержится
- можно искать вопросы на сайтах вроде SO, где люди спрашивают как что-то сделать, и рекомендовать свой плагин, но опять же, соблюдая их правила и раскрывая, что ты являешься его автором

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

Теперь о контрибуторах. С этим будет сложнее. В опен сурсе люди обычно делают что-то, только если это им самим очень нужно. Часто из 100 человек 99 только пользуются и 1, может быть, что-то вложит в проект. Потому тут опять же все завязывается на известность, чем больше будет пользователей, тем охотнее они будут контрибутить.

> Пс не хочу пулреквестить в сами фреймворки так как это капля в море и сосем не тешит мое тщеславие.



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

То есть нужно делать то, что тебе самому нужно, а не кому-то другому. Тогда про тщеславие вспоминать не придется.

>>73878

str_split не работает с русскими буквами, читай урок https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md
832 1473917
>>73912
Значит все упирается в раскрутку.

>Ну вообще, в этом есть смысл


Я плохо объяснил мне. не проблема создать иссуе если я нашел баг, но меня так прельщают что мне дают на столько проработанный агрегат и я им пользуюсь что я не хочу соглашаться по чужим проблемам и пулреквестить на их основе. Это омрачит мое впечатление
833 1473930
>>73917
ПАСЫБА УЧИТЕЛ
D9BGGeaXoAI7XE1.jpg166 Кб, 672x960
834 1474069
Требуется амбициозный бэк-энд программист на постоянку, который сутками сидит за пекарней и хочет получить опыт работы на крупном проекте.
Обязательно: знание PHP на уровне, ответственность и максимум свободного времени. Больше навыков - только лучше.

Telegram для связи со мной: @no_snakes_alive
835 1474077
>>74069

>знание PHP на уровне


На уровне кого?
1.jpg64 Кб, 604x453
836 1474426
Знающий анон, подскажи. Прикручиваю комментарии в задании по файлообменнику на slim. Комментарии имеют древовидную структуру, у каждого есть id и parentId. Через рекурсию забираю данные из базы и получаю большой массив, у каждого элемента которого есть массив детей, а у детей есть свой массив детей и т.д. Сейчас встал вопрос о том, как это корректно вывести в шаблон twig. Если я пишу через

for comment in comments

то выводятся только элементы верхнего уровня. Можно ли через синтаксис шаблонизатора сказать "выводи, пожалуйста, еще и все что вложено, а еще и вложенное во вложенном"?
Или просто взять и убрать многомерность у исходного массива комментариев, сделать все элементы одноуровневыми, просто детей под родителем ставить, и так выводить? Как по умному делается?
837 1474457
программач, помоги , я не понимаю как правильно подключить форму регистрации к сайту
ситуация такая - вынес код регистрации в отдельный файл, прикрутил туда php с записью в БД, и этот файл надо через include вставить в основную страницу, но include возвращает сам файл и еще 1, как успешное подключение, так вот, как правильно его подключить чтобы include не вернул единицу?
838 1474464
>>74457
анон, я сам новичок, а если вместо инклуда рекьюре попробовать?
839 1474470
>>74426
Спасибо, аноны, всем кто откликнулся. Сделол через макросы
840 1474472
>>74464
у них разница лишь в том что require вернет фатальную ошибку , если не сможет найти нужный файл, а так при успешном выполнении тоже вернет единицу
по идее там должна быть функция которая будет что то возвращать, тогда единица пропадет, но я не знаю как мой код обернуть в функцию и что она должна возвращать, если я просто делаю запись в БД
841 1474475
>>74464
пытался найти готовый проект в инете чтобы посмотреть как там чего люди делают на практике, в итоге хуй, либо плати либо перди
842 1474489
>>74457
Я тоже нуб, посмотрел и что то не врубаюсь что ты сделать хочешь. Что должно выводиться то?
843 1474492
>>74475
Зачем что то искать, когда у тебя в шапке огромное кол-во гайдов и заданий с ответами на подводными и прочим.
844 1474532
>>74489
должна выводиться форма регистрации , но вместе с ней выводится цифра 1 - TRUE как результат спешного подключения файла, 3 скрин смотри
Screenshot10.png3 Кб, 247x79
845 1474548
Зачем единица в конце ставится? Просто в книжке не написано.
846 1474559
И ещё, правильно ли я понимаю, что чтобы использовать переменные вне функции в самой функции - мне надо указывать переменные в самой функции?
Делается же это через точку? Или как то иначе? Типа:
echo $hui . $zalupa . $nigger . functioname();
847 1474570
>>74548
единица говорит сколько символов взять, напиши там 2 и ответ будет
$number = 123456 67890;
echo $number."\n";
echo substr($number, -3, 2);
// Вернет 8381427840 84
$number = 123456
67890;
echo $number."\n";
echo substr($number, -3, 1);
// Вернет 8381427840 8
848 1474574
>>74570
Спасибо. Почему-то не подумал самостоятельно проверить.
849 1474584
>>74548
А вообще, в таких непонятных для тебя ситуаций, советую обращаться к php.net, а именно поиску на нем. Пишешь например "substr" и смотришь аргументы =)
850 1474948
>>74559

>что чтобы использовать переменные вне функции в самой функции


Хуй проссышь что вы хотите

>$hui . $zalupa . $nigger


Это переменные функции?
851 1475026
Как лучше всего готовиться к собесу? иду на джуна, есть гитхаб с 1 сайтом магазина на голом пхп и задачка про студента, но какие вопросы чаще всего будут спрашивать и на что особенно обратить внимание?
852 1475047
>>73917

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

>>74426

Есть 2 варианта:

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

Первый вариант скорее всего будет проще и удобнее, и верстка будет тоже проще.

Также, может быть тебе поможет информация про хранение древовидных данных в БД (может пригодиться, чтобы продемонстрирвоать знания на собеседовании): https://github.com/codedokode/pasta/blob/master/db/trees.md

>>74457

Для начала, надо исправить уязвимости в твоем коде - SQL-инъекцию при выполнении запроса INSERT, почитай урок https://github.com/codedokode/pasta/blob/master/security/sql-injection.md

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

> но include возвращает сам файл и еще 1, как успешное подключение



А зачем ты выводишь то, что вернет include? Не выводи результат.

Также, возможно тебе еще пригодится урок по работе с формами: https://github.com/codedokode/pasta/blob/master/forms.md
853 1475049
>>74475

Можно взять урок "делаем сайт на CMS/фреймворке" и повторить то, что там делается, и ты получишь готовый проект.

>>74548

Это описано в мануале по substr: https://www.php.net/manual/ru/function.substr.php

Также, substr не работает с кирилицей, вот урок по теме: https://github.com/codedokode/pasta/blob/master/php/strings-utf8.md

>>74559

По умолчанию в функции "не видны" созданные снаружи (глобальные) переменные. Надо передавать эти переменные в функцию через аргументы явно.

Как это делать, описано в мануале https://www.php.net/manual/ru/functions.arguments.php (хотя и не очень понятно описано).

>>75026

Есть куча статей про собеседования, с наборами вопросов и задач, погугли.
632 - 665, 670 - 758 854 1475079
>>70279

Там есть 2 файла: composer.json - в нем указываются примерные версии зависимостей, он создается руками, и composer.lock - в нем указаны точные версии установленных зависимостей, он создается композером автоматически, обновляется с помощью update.

composer install устанавливает точные версии зависимостей, которые прописаны в composer.lock (если его нет, install работает как update). То есть ты ставишь проверенные кем-то из коллег версии библиотек.

composer update обновляет зависимости, то есть берет composer.json, находит самые новые версии зависимостей, соответствующие условиям, ставит их и прописывает их в composer.lock. После этого необходимо тщательно все протестировать, так как в новых версиях могут быть какие-то баги или особенности.

>>69343

Это идея уровня битрикса. Посмотри пример кода:

class X
{
public function test()
{
$this->evm->on('event', function () {
$this->...
});
}
}

Здесь интуитивно ожидается, что $this указывает на объект X, а ты хочешь его поменять на что-то другое. Как тогда обращаться к полям и методам X? Не нужно проявлять тут оригинальность и придумывать нестандартные подходы. Не трогай $this и не подменяй его.

Лучше, как ниже посоветовали, передавать нужный объект через аргументы.
855 1475081
>>69492

Этот "обработчик" выполняет роль контроллера. Если там много кода, то ты можешь сделать отдельный класс-контроллер и указать его как обработчик.

>>69284

Надо делать, как ты описал. Также, можно для вариантов завести константы, например: USER_ANONYMOUS или USER_REGISTERED.

>>68575

Браузер отправляет на сервер абсолютные URL. Если ты пишешь в HTML-коде src="../1.jpg", то браузер сначала преобразует его в абсолютный URL http://exmaple.com/images/1.jpg, и его отправляет на сервер. Апач этих двоеточий (?) не видит.

У меня есть урок по относительным URL: https://github.com/codedokode/pasta/blob/master/network/urls.md

В RewriteRule ты указываешь путь как URL, относительно DocumentRoot. Если у тебя DocumentRoot это папка /var/www/public, то твой RewriteRule ... /public/$1 добавляет второе слово "public" к ней.

Чтобы понять, как работают RewriteRule, я бы советовал:

- почитать статью https://habr.com/ru/company/sprinthost/blog/129560/
- включить режим отладки mod_rewrite директивой LogLevel warn rewrite:trace4 (взял ее из статьи https://habr.com/ru/post/264395/ ) и в логи будет писаться каждое преобразование URL.

> Я не очень понимаю что есть корень сайта для браузера в моем случае?



Корень это то, что указано в DocumentRoot. То есть при обращении к http://example.com/index.php Апач будет искать index.php в корне сайта. Апач берет путь из URL, дописывает его к DocumentRoot и по получившемуся пути ищет файл (в случае наличия mod_rewrite он сначала применяет к этому пути описанные в конфиге правила).

> Корень для браузера это $_SERVER['DOCUMENT_ROOT']



Браузер ничего не знает о настройках сервера и папках на нем. Он просто отправляет на сервер URL, а как его интерпретировать, зависит от сервера.

Я бы тебе советовал поставить DocumentRoot, чтобы он указывал на public, это надежнее и удобнее, чем возиться с mod_rewrite.
855 1475081
>>69492

Этот "обработчик" выполняет роль контроллера. Если там много кода, то ты можешь сделать отдельный класс-контроллер и указать его как обработчик.

>>69284

Надо делать, как ты описал. Также, можно для вариантов завести константы, например: USER_ANONYMOUS или USER_REGISTERED.

>>68575

Браузер отправляет на сервер абсолютные URL. Если ты пишешь в HTML-коде src="../1.jpg", то браузер сначала преобразует его в абсолютный URL http://exmaple.com/images/1.jpg, и его отправляет на сервер. Апач этих двоеточий (?) не видит.

У меня есть урок по относительным URL: https://github.com/codedokode/pasta/blob/master/network/urls.md

В RewriteRule ты указываешь путь как URL, относительно DocumentRoot. Если у тебя DocumentRoot это папка /var/www/public, то твой RewriteRule ... /public/$1 добавляет второе слово "public" к ней.

Чтобы понять, как работают RewriteRule, я бы советовал:

- почитать статью https://habr.com/ru/company/sprinthost/blog/129560/
- включить режим отладки mod_rewrite директивой LogLevel warn rewrite:trace4 (взял ее из статьи https://habr.com/ru/post/264395/ ) и в логи будет писаться каждое преобразование URL.

> Я не очень понимаю что есть корень сайта для браузера в моем случае?



Корень это то, что указано в DocumentRoot. То есть при обращении к http://example.com/index.php Апач будет искать index.php в корне сайта. Апач берет путь из URL, дописывает его к DocumentRoot и по получившемуся пути ищет файл (в случае наличия mod_rewrite он сначала применяет к этому пути описанные в конфиге правила).

> Корень для браузера это $_SERVER['DOCUMENT_ROOT']



Браузер ничего не знает о настройках сервера и папках на нем. Он просто отправляет на сервер URL, а как его интерпретировать, зависит от сервера.

Я бы тебе советовал поставить DocumentRoot, чтобы он указывал на public, это надежнее и удобнее, чем возиться с mod_rewrite.
856 1475083
>>67919

При использовании композера достаточно подключить 'vendor/autoload.php'. И делать это надо не в коде библиотеки, а в своем скрипте, который будет ее вызывать. Также, я думаю, что саму библиотеку тоже надо было установить через композер, а не скачивать руками.

В общем, почитай какие-нибудь руководства по композеру.

>>66573

Мапы и сеты очень полезны. Ну например, если тебе нужно взять только уникальные слова из массива, убрать повторяющиеся - сет как раз и пригодится.

>>65547

> ну вот кстати дисскасс имеет ли сейчас смысл писать в описании тип если ты его уже указал в самой функции?



Не имеет смысла, если это не несет никакой новой информации.

Я еще использую плагин для переименования файлов (так как я могу придумать класс с одним названием, а через полчаса решить, что у него должно быть другое название). Плагин, по моему, называется Rename File или как-то так. Вызываю через панель команд (Ctrl + Shift + P, затем fr, Enter).

>>62411

В данном случае список отчетов имеет смысл захардкодить в коде (а где еще?). Под каждый отчет сделать функцию либо класс.
857 1475093
>>75047
>>75079
Спасибо
858 1475120
Этот тред уже почти окончательно утонул, переходите тонуть в новый >>1475112 (OP)

Если я кого-то пропустил, можно напомнить о себе в новом треде.

Я постараюсь позже проверить гитхабы с задачками про студентов и фалообменник.
859 1475122
>>75079

>Это идея уровня битрикса


Так-то и вордпресса, да и на фреймворках такое встречается. Не говоря о ноде.
Вполне себе норм идея - стоит поковырять.
sorry-note-rex.jpg17 Кб, 968x681
860 1475238
>>74948
ну, тип, есть переменные:
$pisechka
$huek
я хочу использовать писечку и хуёк в функции, это делается так?:
function functioname($pisechka, $huek) {}

?
Или я должен писечку и хуёк глобальными функциями для этого делать? Или я должен непосредственно в функции создавать писечку и хуёк? А если я хочу переменную, созданную вне функции, использовать в функции?
861 1475668
>>75238
Если тебе нужны только их значения - да. Если хочешь их менять (я нуб и с этим не сталкивался), то вроде как можно передать ссылку на переменную
862 1475672
>>75238
А вообще открой книжку какую нибудь, там все расписано. Или гайды ОПа, или гугл/ютюб
863 1475833
>>65547
Дополню свой список:
Для документации можно еще взять DoxDoxygen он не может в нуловые переменные но зато вытаскивает эксепщены. А DocBlockr не может в типы возвращаемые методами.
LSP аводополнение по методам классов, описания к параметрам методов. Но мне что то не очень понравилось.

>>75083
SidebarEnhancements тоже может в переименование

А в чем профит пхп шторма? Есть смысл перейти на него с саблайм?
Снимок4.PNG12 Кб, 649x309
864 1475917
Не совсем понял Query parameters.
На сайте должна быть строка по которой можно найти человека и если есть совпадения, то должны передаваться его id, first_name т.д. ?
865 1476139
>>74077
На уровне php
866 1476247
>>75917

>На сайте должна быть строка по которой можно найти человека и если есть совпадения, то должны передаваться его id, first_name т.д. ?


Похоже на то, а вообще перекат был

>>76139

>На уровне php


junior/middle/senior?
Не думай что я доебался или еще чего, просто с того что ты написал не особо ясно кого ты ищешь. То ли джуна, то ли мидла.
867 1478314
Поясните доходчиво и с пруфами, почему php не нужен.
868 1478943
>>78314
бамп
869 1480560
>>78314
Надо $ перед каждой переменной ставить
Под каждую задачу свой инструмент. Если тебе нужен сайт, или не овердохуя (а даже и если овердохуя) нагруженное веб-приложение, то PHP вполне подойдёт.
Банальнейшая связка nginx + phpfpm + php7 + *sql будет давать тебе достаточно производительности и возможностей для горизонтального масштабирования, пока у тебя натурально не появятся миллионы активных пользователей и десятки тысяч RPS.
Большинство хейта на пыху идёт со старых времён, когда он действительно был не очень. Сейчас же пыха очень быстрая (а скоро ещё и JIT подвезут), поддерживает строгую типизацию и в её экосистеме много очень качественныз решений. Субъективно, тот же питон она делает по всем фронтам.
Ну и, опять же субъективно, у PHP очень большой рынок, целая куча бизнес-решений было написано и пишутся на нём и приносят своим создателям нехилые деньги (мой босс недавно всех нас в Европу на корпоратив за свой счёт свозил, лол). Так что он вряд ли умрёт в ближайшие десятилетия.
870 1480717
>>78314
Из объективного - анальная огороженность вебом. Если заебет - для переката придется становиться ждуняшкой и учить новый стек почти с нуля. Почти все прочие популярные языки, используемые в вебе, такой проблемы не имеют.
871 1480726
>>80717
Второй объективный минус - вероятность найти хорошую контору со всеми соцплюшками и прочим стремится к нулю. Даже скайенг, который сидит на симфони, оформляет договор предоставления услуг.
872 1480769
>>80717
Бред язык должен быть под что то если язык подо все то он уже будет иметь просадки в сферах. Это так же как с приложениями и сайтами - да они могут быть адаптивными и что то мочь и там и там но на порядок удобнее им пользоваться когда они разработаны индивидуально.
873 1480787
>>80769
Ога, а потом получаем тонну сбегателей с пхп, бегущих куда глаза глядят (включая полный съеб из профессии), потому что развития нет, проекты однотипные, конторы - сплошные рога и копыта.
874 1480791
>>80787
поэтому в дополнение к пхп щас надо учить как минимум гошу, и фронт знать, чтобы быть фулл-стак
875 1481593
>>80560

>у PHP очень большой рынок


Работу на пхп ты найдешь без проблем, но вот вряд ли ты будешь ей доволен.
Тред утонул или удален.
Это копия, сохраненная 27 сентября 2019 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски