«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Клуб изучающих PHP #111 Аноним 2019/08/02 18:13:33  №1446969 1
Привет. Тут мы изучаем язык 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? — Да, однозначно. Посмотри любую вакансию.
Напоминание Аноним 2019/08/02 18:18:30  №1446971 2
grammar.png (56, 500x644)
644x500
1393868234423.jpg (202, 1024x768)
768x1024
Напоминание. Код нужно писать не как попало, а аккуратно и по правилам. Почему? Потому, что на неакуратно написанный код не хочется даже смотреть. Если каждый будет оформлять код как хочет, будет бардак.

Если тебе лень выравнивать код руками, закачай его на 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

Аноним 2019/08/02 18:19:49  №1446974 3
Я постараюсь глянуть непроверенные вопросы в предыдущем треде, но если вы о них тут напомните, хуже не будет.
Ответы: >>1447062 >>1447810
Аноним 2019/08/02 20:08:05  №1447062 4
>>1446974
Да хранят тебя и всех остальных аношек треда Небеса, вы заняты богоугодным делом
Аноним 2019/08/03 14:50:19  №1447478 5
Ответы: >>1447479 >>1450054
Аноним 2019/08/03 14:52:28  №1447479 6
Аноним 2019/08/04 06:10:44  №1447798 7
Как в Laravel при валидации сделать так, чтобы следующее поле проверялось ТОЛЬКО ЕСЛИ предыдущее было провалидировано успешно?

Как ни странно, такой элементарной хуйни там до сих пор не завезли.
Все поля валидируются одновременно всегда.
Ответы: >>1447814 >>1447820 >>1447821
Аноним 2019/08/04 07:31:13  №1447810 8
>>1446974
Эта кружка кофе была за твое здоровье, анон.
Аноним 2019/08/04 07:39:02  №1447814 9
>>1447798
Что за задачу ты решаешь? На первый взгляд подход не верный
Ответы: >>1447852
Аноним 2019/08/04 08:15:26  №1447820 10
>>1447798
Одновременно это как? Можно пример валидаторов?
Аноним 2019/08/04 08:16:39  №1447821 11
Ответы: >>1447854
Аноним 2019/08/04 09:33:58  №1447852 12
>>1447814
>нинужно
Ну вот пошли мантры
Ответы: >>1448178
Аноним 2019/08/04 09:35:26  №1447854 13
>>1447821
Хуеил. Это в рамках проверки ОДНОГО параметра запроса.
Если первое правило провалилось, остальные не проверяются.

А мне надо то же самое, только чтобы если валидация предыдущего ПАРАМЕТРА провалилась, то текущий проверяться вообще не будет.
Ответы: >>1447901 >>1447910
Аноним 2019/08/04 11:26:11  №1447901 14
>>1447854
>первое ПРАВИЛО
>остановить выполнение правил проверки ввода для атрибута после первой ОШИБКИ
Аноним 2019/08/04 11:36:20  №1447910 15
>>1447854
Анон ты тупой?
if (если валидация предыдущего ПАРАМЕТРА провалилась) {
текущий проверяться вообще не будет
};
Ответы: >>1447921
Аноним 2019/08/04 11:57:00  №1447921 16
>>1447910
Так и сделал, по сути несколько валидаторов. Но это васянщина пиздец.
Ответы: >>1447934 >>1447982
Аноним 2019/08/04 12:16:43  №1447934 17
>>1447921
А зачем тебе так нужно сделать вообще?
Ответы: >>1447970 >>1448071
Аноним 2019/08/04 13:23:16  №1447970 18
>>1447934
>А зачем тебе так нужно сделать вообще?
Ну как же, это ведь ЭКОНОМИЯ ПАМЯТИ ДЖУНИОР ПРИШЕЛ УСТРАИВАТЬСЯ НЕ СМОГ ПОМЕНЯТЬ ДВЕ ПЕРЕМЕННЫЕ БЕЗ ТРЕТЬЕЙ ПОВЕСИЛИ В ДВЕРНОМ ПРОХОДЕ ЭКОНОМИМ НА ПАМЯТИ УБИВАЕМ ЗА ЛИШНИЙ IF НА РАБОТЕ ОБЩАЕМСЯ ПОЛУ-СЛОВАМИ СРЕМ В ОДНО ВЕДРО В ЦЕНТРЕ КОМНАТЫ ЧТОБЫ ОПТИМИЗИРОВАТЬ ПОХОДЫ ПО ТУАЛЕТАМ ПРИВЯЗАЛ К ЛОКТЮ ШВАБРУ - ВПЕРЕД - ПЕЧАТАЮ КОД, НАЗАД - ВКЛЮЧАЮ КОФЕ-МАШИНУ ЗА СПИНОЙ ЭКОНОМИЯ МЫШЕЧНОЙ АКТИВНОСТИ 2% ВСЕ ОПТИМИЗИРУЕМ ЧТО МОЖНО ОТРЕЗАЕМ СОТРУДНИКОВ ПО ПОЯС ЧТОБЫ СЫКАНОМИТЬ НА ШТАНАХ РЯЯЯ МЫ СМАЯ АПТИМАЛЬНАЯ КОНТОРА В ВОРОНЕЖЕ
Ответы: >>1447981 >>1448341
Аноним 2019/08/04 13:52:30  №1447981 19
>>1447970
Истерика на ровном месте. Отлично.
Аноним 2019/08/04 13:53:17  №1447982 20
>>1447921
Твоя идея изначально это васянщина.
Ответы: >>1448072
someApprentice 2019/08/04 15:29:09  №1448031 21
image.png (267, 500x337)
337x500
Я опять нечаянно запостил в закрытый тред >>1447890 >>1447897


Аноним 2019/08/04 16:50:22  №1448064 22
Есть один проект который отлично работал на моем сервере Apache который я сам смастерил. Когда я сую свой проект в OpenServer, получаю 404. Хуйня в том, что я получаю ответ на /, но когда я хочу например перейти в /categories, он шлет меня. Что делать? Куда копать? Проект на laravel, и папку /public в доменах я прописал.
Ответы: >>1448203
Аноним 2019/08/04 17:26:15  №1448071 23
>>1447934
В поле1 указывается токен от соц-сети, но он может быть хуевым.
С помощью этого токена делается запрос в соц-сеть, чтобы проверить поле2.

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

Пиздец блять. Что в манямирок не вписывается - так нинужно или невозможно.
Ответы: >>1448180 >>1448342 >>1448453
Аноним 2019/08/04 17:51:30  №1448092 26
Screenshot13.png (5, 582x280)
280x582
Будьте осторожны с циклами, пилоты.
Аноним 2019/08/04 19:06:47  №1448142 27
>>1446969 (OP)
йо, товарищи, есть некий проект, в котором нужно реализовать комментирование контента без регистрации и использования сторонних систем комментирования ибо не везжает в концепцию и не хочется приплетать стороннюю верстку по тем же причинам . Так вот, делаю я такое впервые, и вопрос - как это дело контролить модерировать и банить сквернословных залетных, как это происходит, например, на имиджбордах? Алсо целевая аудитория не сильно широкая и плебейская, так что вряд ли будет много грязи, адмитить-модерировать будет от силы пара человек, но какие-то минимальные инструменты контроля нужны
Ответы: >>1448181
Аноним 2019/08/04 19:26:44  №1448163 28
>>1448071
у валидатора есть метод sometimes

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

так же у валидатора есть метод after, и то и другое можно вызывать в withValidator в FormRequest например, короче я к тому что способов сделать как тебе надо много, это будет канеш не так K P A C U B O но это похуй
Аноним 2019/08/04 19:54:41  №1448178 29
>>1447852
Ты расскажи нормально что за задача
Аноним 2019/08/04 19:55:20  №1448180 30
>>1448075
>Пиздец нахуй пятый год в погромировании
я тоже пять лет со скейтерами из двора тусовался и думал что я типа продвинутый и могу оли-оли крутить
Аноним 2019/08/04 19:57:13  №1448181 31
>>1448142
делай матерный словарик. Или вообще премодерацию забубень, пусть каждое сообщение отображается только когда твой модер галочку поставит. Они правда офигеют там все читать
Аноним 2019/08/04 20:28:28  №1448203 32
>>1448064
Проверь mod_rewrite, если apache на openсервере используешь
Аноним 2019/08/05 08:36:46  №1448341 33
>>1447970
Бизнесу насрать на экономию памяти - ему важнее скорость разработки и стоимость поддержки. А вот если васянить постоянно, то именно эти два фактора страдают.

Наблюдение такое.
Ответы: >>1448464
Аноним 2019/08/05 08:41:42  №1448342 34
>>1448075
>пятый год в погромировании
Лол. И что? Все 5 лет говнокодил и вдруг мастером стал?
Аноним 2019/08/05 12:48:23  №1448453 35
>>1448075
Ты как партизан не афишируешь, нахуй тебе это надо.
С лаварелем я не знаком, работаю на симфони.
Аргументирую. В чистом виде такой хуйни нет, так как в принципе нет порядка валидации. Хуй его знает, как и в каком порядке ты будешь передавать поля. А привязывать логику валидации к тому, в каком порядке педрила с фронта расставил поля в формочке - это пиздос.
Я мог бы понять, если бы тебе требовалась кастомная валидация одних полей в зависимости от значения других, но ты упорно пиздел именно про порядок.
Ответы: >>1448462
Аноним 2019/08/05 12:56:58  №1448462 36
>>1448453
А, нет, я ебусь в глаза. Ты ответил.
Но ты всё равно хуй, так как сформулировал вопрос ты максимально некорректно.
Аноним 2019/08/05 13:00:06  №1448464 37
>>1448341
вот тут ты сам себе противоречишь. Если бы ты не заморачивался надуманной проблемой из разряда "а чому у меня ифы в уже готовой конструкции не такие как я хочу! Надо бы переделоть!", то сыканомил бы уйму времени. По факту соглашусь, заказчику наплевать что там внутри, лишь бы работало. Это ты чистоплюй и перфекционист. Небось еще и моешься чаще чем раз в неделю, педота
Аноним 2019/08/05 16:02:58  №1448540 38
Ковыряюсь тут с шаблонами для БД.
У меня есть соединение на одной библиотеке NotORM и я на её основе хочу сделать Data Mapper. И у меня такой вопрос - мне этот маппер биндить в зависимости или просто вызывать в контроллере, передав ему соединение?
Ответы: >>1448559
Аноним 2019/08/05 16:51:23  №1448559 39
>>1448540
>мне этот маппер биндить в зависимости
Я бы сбиндил. Он же наверняка и в других контроллерах мелькнет?
Ответы: >>1448563
Аноним 2019/08/05 16:53:25  №1448563 40
>>1448559
Да наверняка мелькнёт. В той же админке должен ещё быть.
Аноним 2019/08/05 19:11:26  №1448614 41
Аноним 2019/08/06 08:32:43  №1448812 42
Аношки, тоже взялся за студентов, как анины выше, но пока читаю условие и обдумываю. Возник вопрос:
>Список абитуриентов — выводит имя, фамилию, номер группы, число баллов. Выводятся по 50 человек на страницу, сортировка по любому полю делается кликом на заголовок колонки таблицы
а как вообще это реализуется? Мне это делать джаваСкриптом/джиКверри, типа перестраивать ячейки таблицы по клику, или силами пшп-скрипта - по клику отправлять новую ссылку на эту же страницу с новыми параметрами сортировки и перезагружать результат?
Как обычно это делается? Я с аяксом пока не очень знаком
Ответы: >>1448823 >>1448828
Аноним 2019/08/06 08:32:45  №1448813 43
15642215109570.jpg (18, 437x431)
431x437
>>1446969 (OP)
Cап, анусы. Значит пытаюсь тут запилить себе учебно-портфольный проект и завис на таком моменте - по легенде мне надо сделать простой сайт на php + sql, с регистрацией, логином и сессией, что я уже сделал, но теперь самое важное - как дать возможность залогиненному болванчику загружать изображения на сервер и желательно, чтобы он еще видел только свои хотя уже не суть. Простой аплоад с галереей уж делал без привязки, но тут прям завис в ступоре уже третий час. Хочется уже дропнуть и просто воткнуть на залогиненную страницу форму с аплоадом и кидать картинки так.
инб4 приходи через год
Ответы: >>1448817 >>1449215
Аноним 2019/08/06 08:41:01  №1448817 44
>>1448813
Создай ещё одну таблицу с полями ид картинки и ид соответствующего пользователя. Потом выгружай оттуда все картинки конкретного пользователя.
Ответы: >>1449215
Аноним 2019/08/06 08:53:24  №1448823 45
>>1448812
На этом задании джаваскрипт вообще не нужен. Только вёрстка и бэкенд. Сортировка делается по ссылке.
Просто посмотри как у других сделано.
Ответы: >>1448826
Аноним 2019/08/06 09:08:20  №1448826 46
>>1448823
>Сортировка делается по ссылке
Понял, спасибо
Аноним 2019/08/06 09:11:54  №1448828 47
>>1448812

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

Еще можно поискать в архиве по словам "ссылка сортировка", может что-то полезное найдешь? https://phpclub.tech/search/?q=%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0+%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0

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

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

Но как потом ручками проверить когда пользователь снова зайдет на сайт? Он ведет "pass", но откуда к этому pass прицепить соль, если соль у меня получается из функции которая каждый раз рандомную строку возвращает?
Или соль берем из какой нибудь связки id+login+фамилия?

Ответы: >>1449022
Аноним 2019/08/06 14:51:14  №1449022 50
>>1448932
Соль в бд сохраняй и все
Аноним 2019/08/06 16:39:25  №1449075 51
zdohzvitvorite.jpg (77, 1200x1021)
1021x1200
Может у кого есть идеи для php проекта?
Аноним 2019/08/06 16:56:24  №1449085 52
>>1449075
Не уверен что ты верно понял то о чем я спрашиваю.
В базе у меня хэш + рандомная соль.
Когда пользователь авторизуется и вводит свой пароль - от этого пароля вычисляется хэш, но как вычислится рандомная соль которая у меня хранится в базе?
Тоесть по факту я должен сравнить хэш от пароля что передал пользователь, с хэшем который у меня в базе. Но в базе у меня хэш + соль из рандомной строки. Как происходит сравнение.

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

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

Как эту случайная соль появляется в пароле который вводит пользователь.
Если что сорр за мою тупость.

Ответы: >>1449089 >>1449101 >>1449172
Аноним 2019/08/06 17:01:56  №1449089 53
Ответы: >>1449090
Аноним 2019/08/06 17:04:34  №1449090 54
Аноним 2019/08/06 17:26:58  №1449101 55
>>1449085
из мануала:

password_hash()

Использованный алгоритм, стоимость и соль будут возвращены как часть хеша. Таким образом, информация, необходимая для проверки хеша будет в него включена. Это позволит функции password_verify() проверять хеш без необходимости отдельного хранения информации о соли и алгоритме.
Аноним 2019/08/06 18:20:58  №1449131 56
>>1449075
У меня есть парочка. Но я не скажу.
Аноним 2019/08/06 20:38:08  №1449172 57
>>1449085

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

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

Задавай уточняющиевопросы, если что.

Аноним 2019/08/07 01:21:41  №1449215 58
sql.JPG (26, 934x91)
91x934
Снимок.JPG (25, 479x157)
157x479
delete.JPG (50, 693x369)
369x693
index.JPG (32, 1052x307)
307x1052
>>1448813
>>1448817
В общем я вчера чудовищно наговнокодил, но сейчас хотя бы все загружается и выводится. Теперь надо разобраться с удалением - оно не работает и похоже я нихуя не понимаю чего делаю неправильно пишу запрос на удаление. да, мне стыдно, что я такой тупой
Ответы: >>1449252 >>1449263 >>1449318
Аноним 2019/08/07 05:11:38  №1449252 59
Ответы: >>1449258
Аноним 2019/08/07 05:34:33  №1449258 60
>>1449252
У меня был опыт общения, еще плоховато понимаю. А вообще уже все переписал и теперь все удаляется. Магия - стоит сюда написать, как все само собой решается.
Ответы: >>1449263
Аноним 2019/08/07 05:44:57  №1449263 61
Аноним 2019/08/07 08:33:21  №1449318 62
>>1449215
>Теперь надо разобраться с удалением - оно не работает
Анон, есть хороший способ проверять запрос на работоспособность - просто берешь и выполняешь его в phpмайадмине. Тупо копируешь запрос из кода и вставляешь в поле/вкладку "запрос" пшпмайадмина. Если ошибка в запросе, то майадмин сразу тебе это напишет. Так ты хотя бы будешь знать где проблема - в коде пшп или в коде sql
Ответы: >>1449339 >>1449381
Аноним 2019/08/07 09:29:26  №1449339 63
>>1449318
>Тупо копируешь запрос из кода
Лучше включить логирование запросов в mysql и брать из лога. Особенно если пользуешься каким-нибудь фреймворком который запрос сам формирует.
Аноним 2019/08/07 11:36:58  №1449381 64
>>1449318
Я поначалу вообще все запросы из пхпмайадмина тянул, только условия менял. Так и научился.
Аноним 2019/08/07 15:55:55  №1449478 65
Пытаюсь написать бота для вайбера на пхп.
Есть библиотка https://github.com/Bogdaan/viber-bot-php
Если просто использовать её по инструкции, то всё работает: клиент пишет в вайбер сообщение, оно парсится ботом и если есть совпадение, то выдаётся стандартный ответ. А мне нужно, чтобы этот процесс разился на две фазы: приём сообщения из вайбера и отправка сообщения в вайбер. И чтобы и то и то были простыми функциями. С приёмом проблем нет, просто разбираем, что там пришло в webhook. А вот отправку я не понимаю, как сделать. Я засунул это всё в метод, метод в класс, но ничего не работает. И не пишет никаких ошибок, просто умирает, как только достигает команды $botSender = new Sender .
Честно говоря, я запутался в этих методах, вызовах, пространствах имён и прочем ооп. Посмотрите пожалуйста на код, что именно я там организовал не так? И как ловить и отлаживать такие ошибки? Даже когда я оборачиваю всё (вообще всё) в try, никаких эксепшенов не ловится.

https://pastebin.com/bMxDPt0y
Ответы: >>1449503
Аноним 2019/08/07 16:31:02  №1449498 66
>>1449075
Можешь зарегатьться на ютубе и вести блок обучающий пхп
Аноним 2019/08/07 16:37:31  №1449503 67
>>1449478
Уточнение: я таки отловил ошибку Class 'Viber\Api\Sender' not found, но WTF? При подключении иде не ругается, значит видит этот класс. А если убрать use Viber\Api\Sender; или подключать левый класс Sender2, то сразу предупреждает, что такого нет. А на сервере не работает.
Ответы: >>1449527
Аноним 2019/08/07 16:57:03  №1449526 68
>>1449075
Создай бота который будет скачивать видео из webm тредов и переделывать их под void. А затем автоматически постить пока капча не заебет.
Аноним 2019/08/07 17:00:29  №1449527 69
>>1449503
На сервер библиотеку-то закинул?
Ответы: >>1449538
Аноним 2019/08/07 17:38:26  №1449538 70
>>1449527
Закинул. Если просто сделать, как в примере и расположить этот код в webhook, на который приходит сообщение из вайбера, то всё отлично работает.
Аноним 2019/08/07 19:24:11  №1449568 71
>>1449075
Есть уже живущий проект - архив PHP тредов по годам: https://phpclub.tech/
У него открытый код и есть issues, которые любой желающий может попытаться исправить: https://github.com/richBlueElephant/phpClub/issues

Отлично если работали с поисковым движком Sphinx, там 3 задачи только по нему одному.
Аноним 2019/08/07 23:19:56  №1449619 72
image.png (25, 477x188)
188x477
Боже, какую же хуйню приходится писать, чтобы типы работали как надо.
Ответы: >>1449991 >>1450440
Аноним 2019/08/08 00:28:34  №1449622 73
У меня встал вопрос. Пробую использовать slim 4 для апи. Отправляю response json, и зачем-то отправляется favicon. Может это зависит от метода get, post? Проблема в том, что Vue не читает ответ запроса, в то время как с других api успешно получает данные. Как запретить передачу favicon.ico?)
Ответы: >>1449855
Аноним 2019/08/08 00:53:55  №1449623 74
zxcccc
Аноним 2019/08/08 06:59:03  №1449683 75
Зачем нужны пространства имен?
Ответы: >>1450109
Аноним 2019/08/08 09:50:26  №1449760 76
cat1.png (310, 512x512)
512x512
>>1446969 (OP)
Сап котаны. Закончил шарагу, проходил практику в ВУЗе там изучил Symfony и сделал проект на нем. Не потому что хотел, а потому что это в программе практики у них было.

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

Город ДС2

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

Если интересен мой проект: http://relevantsearch.ru/
Ответы: >>1449765 >>1449824
Аноним 2019/08/08 09:56:55  №1449765 77
cat1.png (310, 512x512)
512x512
>>1449760
Алсо реквестирую специалиста Symfony знакомого с компонентом Messenger. Воркеры создаются, но асинхронность не работает.

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

Кароче доработка проекта встала только из-за этого. Пробовал еще с другими бандлами поддерживающими очередь работать, но вечно лажа происходила.
Ответы: >>1449773 >>1450431
Аноним 2019/08/08 10:29:57  №1449773 78
>>1449765
Так объяснишь зачем нужны пространства имен?
Аноним 2019/08/08 11:52:34  №1449821 79
>>1449773
за тем что бы при установки доп пакетов , библиотек и тд , классы с 1 и тем же именем не переопределяли друг друга.
Ответы: >>1449822
Аноним 2019/08/08 11:52:53  №1449822 80
Аноним 2019/08/08 11:56:23  №1449824 81
>>1449760
в рф как и в всём пост совке (СНГ) весма мало продуктовых контор , потому симфони не нужно , а для средне малых подделок хорошо заходят RAD фреймы типа лары , потому их и юзают , так что да в неё вкатываться есть смысл
Ответы: >>1449840
Аноним 2019/08/08 12:20:21  №1449840 82
>>1449824
Ща звонили с собеседования про битрикс и Yii2. Что расскажешь по поводу него? Какие подводные?
Ответы: >>1449874 >>1450016
Аноним 2019/08/08 12:35:45  №1449855 83
>>1449622
Решил проблему добавлением такого заголовка: header("Access-Control-Allow-Origin: *");
Ответы: >>1449876
Аноним 2019/08/08 13:36:47  №1449874 84
>>1449840
>про битрикс
даже если будешь с голоду умирать даже не думай , прям вот совсем , лучше уже сдохнуть.
>Yii2
не плох как RAD фрейм , но монолитен прям от слова совсем , хорошо генерит код ля админок всяких (так нормальной альтернативы для лары и не нашёл) , довольно популярен в СНГ (скорее всего и только тут) , можно стартануть на нём.
Аноним 2019/08/08 13:37:24  №1449876 85
>>1449855
осталось теперь почитать про CORS , и узнать чтож за заголовок такой магический
Ответы: >>1449881
Аноним 2019/08/08 13:44:43  №1449881 86
>>1449876
Поиск проблемы был максимально непонятным. Как написано на вики - "браузер поддерживающий технологию CORS, передаст ошибку вместо данных." Chrome - выдавал ошибку, просто ошибку на этот запрос. Firefox - дал ответ с кодом 200.
Ответы: >>1449910
Аноним 2019/08/08 13:45:46  №1449882 87
Что нужно знать для бэкэнд разработки?
Ответы: >>1449884
Аноним 2019/08/08 13:46:55  №1449884 88
>>1449882
извиняюсь и иду нахуй, если в шапке всё написано
Аноним 2019/08/08 14:23:28  №1449910 89
>>1449881
вполне реально ибо у них разные двежки очевидно правила CORS по умолчанию по разному ставят
Ответы: >>1449926
Аноним 2019/08/08 14:56:59  №1449926 90
>>1449910
Попробуй вместо звездочки перечислить методы, в одном проекте у меня так решилось проблема
Аноним 2019/08/08 16:47:25  №1449991 91
Ответы: >>1450005
Аноним 2019/08/08 17:00:52  №1450005 92
>>1449991
Это не я ебанутый, а тот инцел, который решил сделать передачу значения в функцию settype по ссылке.
Аноним 2019/08/08 17:02:50  №1450010 93
>>1449773
В передыдущем треде пережёвывали - посмотри архив.
Аноним 2019/08/08 17:04:59  №1450016 94
>>1449840
>битрикс
Легаси и костыли от 1С.
Аноним 2019/08/08 17:34:27  №1450048 95
Предыдущий тред все-таки утонул, а вопросы остались. Попробуем ответить:

>>1445583

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

>>1445953

> Вопрос про трейты.
> Есть приложение на фреймворке, зависимости подключаются через IoC.
> Есть набор классов, которые использовать надо в разных других классах.
> Я делаю трейт вида HuiDepenendencies, там подключаю зависимости и делаю геттеры.
> Далее в других разных классах включаю этот трейд

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

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

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

>>1446336

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

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

- описываем контроллер и его зависимости в контейнере
- не описываем контролллер в контейнере, но передаем ему контейнер в конструктор или метод. И уже там берем из контейнера нужные нам классы
Аноним 2019/08/08 17:37:02  №1450051 96
Ответы на вопросы из прошлого треда (тред есть в архиве и тут: 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-файлов. Есть несколько вариантов:

- ты неправильно назвал файл или поместил не в ту папку, и он не прочелся
- надо было использовать прямые слеши, а не обратные
Аноним 2019/08/08 17:37:51  №1450054 97
>>1446666
>>1447478

> \tpublic function __construct($rate, $litresOfCoffee, $pgsOfDocs, $rank, $boss = false){
Это мы не проходили, но стоит использовать тайп-хинты, они защищают от ошибок и делают код читабельнее: https://www.php.net/manual/ru/functions.arguments.php#functions.arguments.type-declaration

>\tprivate function setRateWithRank(){
>\t\tif ($this->rank == 2) {
>\t\t\t$this->rate = $this->rate * 1.25;
>\t\t}

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

> \tprivate function setBossPrivelege(){

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

> \t\tforeach ($this->employees as list($num, $position)) {

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

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

В общем, пока неплохо, делай тогда вторую часть про кризис, там недостатки кода, если они есть, вылезут наружу.
Аноним 2019/08/08 17:38:54  №1450056 98
>>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": "alice@example.com"}
...

То есть убрать из теста 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);

Как я должен понять, к какому контроллеру относится этот код? Наверно можно попробовать поискать по коду, где используется ограничение на уникальность, но это какой-то очень странный подход. Также, этот код ловит исключения отовсюду. Ты писал его для какого-то своего контроллера, но исключения ловятся и со всех других контроллеров, что может быть неожиданно для их авторов, которые этого не хотели.
Аноним 2019/08/08 17:39:50  №1450060 99
>>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 с каждым процессом связана "текущая" директория.

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

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

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

Если мы отправляем файл с локального диска на сервер, то нам незачем создавать на диске зашифрованную копию этого же файла. Так как он у нас есть в расшифрованном виде.
Аноним 2019/08/08 18:40:11  №1450109 100
>>1449683
Чтобы изолировать код, который в него входит, от другого кода.
Аноним 2019/08/08 19:25:18  №1450129 101
Аноны, смогу ли я перекатиться к вам в похапе за месяц, чтобы устроиться хотя бы стажером за 15к, учитывая что хорошо знаю питон и немного джангу? А то чет ахуел с действительности, что питонистом невозможно устроится в моем миллионике, 1 вакансия на джуна и несколько на сеньоров-помидоров.
Ответы: >>1450167 >>1450169
Аноним 2019/08/08 20:05:20  №1450167 102
>>1450129
Смотри на вакансии в своем миллионнике.
Ответы: >>1450176
Аноним 2019/08/08 20:10:49  №1450169 103
>>1450129
Как же хорошо, что я вовремя одумался и не покатился в пиздон наслушавшись советов с двача
Аноним 2019/08/08 20:43:46  №1450176 104
>>1450167
Да я уже посмотрел вакансии, требования уровня php/js/sql/html/css, знаю все кроме пхп, вот и спрашиваю за сколько можно дойти до уровня, что могу работать.и вакансий в 10 раз больше чем на питониста
Ответы: >>1450503
Аноним 2019/08/08 20:56:59  №1450180 105
Дошли руки с докером разобраться. Какаяже годнота скажу я вам
Ответы: >>1450247
Аноним 2019/08/09 06:19:44  №1450247 106
>>1450180
Скажи мне скажи мне
в чем годнота?
Ладно если у тебя контейнер - весь проект - Изи - но я так же могу и в xampp сунуть его и не пизди мне что у тебя клиент по сто раз на дню меняет окружение. Это редкость редкая когда тебе надо скакать между на столько рознящимися окружениями
Ответы: >>1450306 >>1450346
Аноним 2019/08/09 07:46:28  №1450306 107
>>1450247
Я не тот анон, но суть же не столько в вопросе смены окружения, сколько в лёгкости деплоя (используя Swarm или Kubernetes). Представь, что ты собрал какой-то проект у себя на сервере, и теперь тебе его нужно перенести на сервер заказчика. Без контейнеров тебе придётся поднимать сервер дважды - у себя и у него. А так - просто воткнул контейнер и всё сразу работает.
Ответы: >>1450377
Аноним 2019/08/09 08:33:34  №1450335 108
>>1446969 (OP)
1) ЕОБ (есть одна борда), в процессе написания. Пользователь может загружать файлы картинок. Обработчик формы присваивает имена файлам с помощью microtime() или time() (какую функцию выбрать кстати?). Эти значения будут уникальными? Что будет, если два или более пользователя одновременно запостят картинки? Не существует шанса распидорасить сервер?

2) Есть исходные коды блога и форума, и два sql-файла к ним. Как правильно объединить базы для одного сайта? Слить sql-файлы в один (и это будет одна база, имена таблиц у блога и форума не совпадают), или подключаться одновременно к двум разным базам (это нормально?)? Как делают опытные люди?
Ответы: >>1450343 >>1450444
Аноним 2019/08/09 08:42:11  №1450343 109
>>1450335
>1
У тебя же есть посты с айдишниками - вот и прикрепляй к ним эти картинки.

>2
Неебу. Может миграции помогут.
Ответы: >>1450348
Аноним 2019/08/09 08:48:54  №1450346 110
>>1450247
Я только разобрался и поэтому не юзал. Но по опыту было не раз например так: мне дается сервер, на котором стоит сайт писаный под пыху 7.0. Повышать ее версию мне нельзя, но в тоже время имеется мой бот, написанный на 7.3. Обычно перепиливал бота под 7.0, сейчас бы мог использовать докер.

Но мне больше нравится не это, а то, что я могу по щелчку пальцев менять составляющие, локально, при разработке. Например быстро сменить мускуль на мариюдб и т.д.
Аноним 2019/08/09 08:53:01  №1450348 111
>>1450343
Прикрепляю. Но мой вопрос про имена файлов. Вот как тут:
https://2ch.hk/pr/src/1446969/15647696144140.png
microtime() или time() генерируют уникальные значения при использовании в обработчике формы?
Ответы: >>1450357 >>1450359
Аноним 2019/08/09 08:59:36  №1450354 112
bear.png (1166, 944x708)
708x944
>>1446969 (OP)
есть скрипт который должен мне на почту через форму письмо отправлять
а он ничего не отправляет
даже в спам
https://ideone.com/RLlKiz
Ответы: >>1450360
Аноним 2019/08/09 09:04:42  №1450357 113
>>1450348
Как вариант делать хэш из микротайма и айдишника поста - коллизии будут минимальны.
Аноним 2019/08/09 09:08:15  №1450359 114
>>1450348
К тому же никто не мешает те же айдишники и к файлам делать, которые с автоинкрементом. И не городить огород.
Аноним 2019/08/09 09:12:21  №1450360 115
>>1450354
>// Email address verification, do not edit.
function isEmail($email) {
\treturn(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) для таких вещей.
Аноним 2019/08/09 09:28:27  №1450377 116
>>1450306
Я тоже так подумал и радовался что не придется ебаться. Но админ на тесте каждый из микросервисов собрал в отдельные контейнеры тоесть уже различие с локалью где каждый сервис в контейнере. А у заказчика на серверах Винда.
Аноним 2019/08/09 10:15:34  №1450431 117
>>1449765

Опиши проблему подробнее. Как ты устанавливал этот компонент, какой код добавил, что запускаешь, что ожидаешь, что получается. Какая ОС и веб-сервер.
Ответы: >>1450864
Аноним 2019/08/09 10:17:38  №1450435 118
Аноним 2019/08/09 10:18:34  №1450440 119
>>1449619

Не сталкивался с такой проблемой. Увы, кроме кода, никаких пояснений ты не дал.
Аноним 2019/08/09 10:21:44  №1450444 120
>>1450335

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

И, кстати, ты можешь сделать поддержку в коде для 2 баз, но использовать одну и ту же.
Аноним 2019/08/09 12:08:35  №1450503 121
>>1450176
Зависит от целого ряда факторов, в первую очередь от умения пиздеть с умным видом и быстро как понос учиться.
Голый ПХП на самом деле нужен либо совсем ньюфагам, которым важнее на данном этапе пощелкать, как работает веб, либо матерым олдфагам пишущим какую-нибудь экзотику.
Реально все работают на фреймфорках-CMS. И у каждого фреймворка есть своя логика, в рамках которой и следует ебашить. Поищи, знания каких фреймворков требуются у тебя. Это у питона по факту один Джанго, у пыха цветущих и пахнущих (в разных смыслах) штук 20. Один из вариантов - сделать за неделю задачу со студентами и устроиться стажером за еду, уча то, что используется в конторе.
Главный совет - избегай БИТРИКСА. Он сука популярен в рашке и его использует куча студий. Данная хуйня представляет из себя достаточно мощный, но извращенный как половая ориентация Слаанеш фреймворк/CMS, который не научит тебя ничему хорошему. Связывайся, только если альтернативы ну совсем нет а жрат хочется.
Ответы: >>1450511 >>1450602
Аноним 2019/08/09 12:20:07  №1450511 122
>>1450503
А вот смотри, такой пример.
Я знаю все основы языка, включая ООП, понимаю, как работать с базами данных, умею писать базовые запросы и составлять структуру БД. Но при этом у меня совершенно нет опыта в создании каких-то рабочих проектов на пыхе, потому что, как ты и говоришь, я всегда пилил все на CMS/CMF (преимущественно MODX). Но сейчас я хочу свои навыки поднять на рыночный уровень, чтобы найти нормальную работу, возможно даже завести трактор в перспективе. Нужно ли мне для этого пробовать реализовывать какие-то либо проекты на чистой пыхе, так сказать, для опыта и набивания скиллов? Или сразу сосредоточиться на каком-нибудь Ларавеле, попутно восполняя пробелы в знании самого языка?
Ответы: >>1450521
Аноним 2019/08/09 12:34:09  №1450521 123
>>1450511
Возможно, меня сейчас обоссут, но это
>Или сразу сосредоточиться на каком-нибудь Ларавеле, попутно восполняя пробелы в знании самого языка?
лучше.
Поясняю. Делая что-то на чистой пыхе, ты получаешь абстрактный некоммерческий опыт. В силу твоей неопытности - негативный, на своей жопе путем ошибок выясняя откуда растут ноги у современных паттернов проектирования. Я бы сделал задачу про студентов (она содержит необходимый минимум для ознакомления), посмотрел какой фреймворк используется в твоем города и устроился туда джуном, подтягивая недостающее.
Ответы: >>1450711
Аноним 2019/08/09 16:48:04  №1450602 124
>>1450503
Спасибо за ответ, сейчас проштудировал вакансии, в одних нужен ларавел, в других yii в третьих битрикс, в четвертых еще какие-то но самые популярные первые 2, битрикс я так понял сразу отпадает и что тогда учить лучше laravel или yii?
Ответы: >>1450628
Аноним 2019/08/09 17:40:31  №1450628 125
>>1450602
laravel. он сейчас самый популярный.
По нему советовали "Дмитрий Елисеев Сайт объявлений на Laravel". Сам не проверял, там 70 часов видео.
Ответы: >>1450682
Аноним 2019/08/09 19:59:55  №1450682 126
>>1450628
И от того же Елисеева есть интернет магазин на yii2, у него можешь еще и симфони посмотреть =)
Аноним 2019/08/09 20:55:36  №1450710 127
Что лучше использовать: наследование или декоратор с инъекцией?
Аноним 2019/08/09 20:57:55  №1450711 128
>>1450521
>В силу твоей неопытности - негативный
Зато увереннее себя чувствуешь с инструментом. когда пальцы им поотшибаешь
Слыхал про совсем тупых макак, которые задрочили один фреймворк и не могут ни налево, ни направо.
Аноним 2019/08/10 08:30:49  №1450808 129
>2019
>просить совета у двача

Какой посоветуете хостинг для домашнего проекта? Какой сами используете?
Ответы: >>1450829 >>1451449
Аноним 2019/08/10 09:15:07  №1450829 130
>>1450808
Они одинаковые все по-большому счёту. Можешь ещё на облачные платформы посмотреть.
Аноним 2019/08/10 10:44:46  №1450864 131
image.png (32, 586x409)
409x586
>>1450431
Разрабатывал используя OPEN SERVER докер не преподавали.
На хостинге используется юбунта 16.04 и LAMP.
Устанавливал composer require messenger
В качестве шины была Doctrine MESSENGER_TRANSPORT_DSN=doctrine://default
Все настройки выставил по дефолту как в документации.
При попытке запустить воркера командой php bin/console messenger:consume async -vv
Ответы: >>1450867
Аноним 2019/08/10 10:50:40  №1450867 132
>>1450864
Не дописал:
Нихуя не работает, то одна ошибка вылетает, то другая. Почему другая? Потому что умники на гитхабе посоветовали редактрировать сам компонент. В итоге одну ошибку исправил, сразу появлялась другая. В конечном итоге проблема с сериалайзером была. Он почему то не работал. И вот я оказался тут.

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

Хотя по сути это уже не воркер, а обычный сервис. Потому что он выполняется синхронно.
Аноним 2019/08/10 14:26:49  №1450950 133
blade runner 2.jpg (15, 428x424)
424x428
Тест на PHP-IQ
Хочу вам вкинуть задачку и посмотреть, как быстро аноны додумаются до того, до чего я додумался за 1 час.
Как только прозвучит решение, до которого я дошел, или же близкое к нему - я сообщу, как сделал я.
Чисто для интереса, может я гораздо более тупой, чем думаю я до этого додумаются все за 5 мин или вовсе предложат лучшее, чем у меня.
Если будете постить решения хуже, чем у меня - я скажу, в чем минусы каждого решения.

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

Как организовать запуск заданий, чтобы это жрало минимум ресурсов (оперативка, проц, время)?
Ответы: >>1450953 >>1450972
Аноним 2019/08/10 14:32:35  №1450953 134
>>1450950
Код никакой не нужен, просто описать словами, как бы вы что сделали
Аноним 2019/08/10 15:06:32  №1450972 135
>>1450950
Лень долго думать (к тому же ты не описал возможную структуру задач).
В БД хранятся: строчка, описывающая задание (это может быть хоть eval код хоть ссылка на php скрипт), галочка выполнено/нет и время следующего выполнения.
Отдельный процесс (самое простое - крон) обходит базу, выбирает процессы, которые необходимо выполнить, и отрабатывает их. Самое простое - обходить их в цикле, если проблемы со скоростью - заводить подпроцессы на отдельные задачи (или группировать по 10 штук в процессе).
Ответы: >>1450999
Аноним 2019/08/10 15:36:38  №1450999 136
>>1450972
>время следующего выполнения
Бинго, ты понял самое главное. Надо хранить время следующего запуска.

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

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

Ну и да, можно всегда прикрутить, чтобы они в мультитрединге запускались, если есть такая необходимость.
Например, в моем случае это будет даже минус, ибо хоть задания и будут выполнены "более одновременно", но это увеличит нагрузку на сторонние сервисы.
А когда они выполняются последовательно, хоть точность и меньше, но и нагрузка на сервисы меньше.
Аноним 2019/08/11 11:20:09  №1451347 137
Не понял.
Эта установка только для Linux? На Windows никак не поставить?
Ответы: >>1451371
Аноним 2019/08/11 11:59:14  №1451371 138
>>1451347

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

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

- php, composer под виндой работают
- cp - команда копирования, можно скопировать файл вручную через Проводник или командой copy, если ты предпочитаешь командную строку
- что касается make - эта команда выполняет команды, записанные в файле Makefile (почитать на русском про команду make можно тут: https://www.google.com/search?client=firefox-b-d&q=%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5+%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B+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

------

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

Ответы: >>1451448 >>1451449
Аноним 2019/08/11 14:01:47  №1451448 139
>>1451371
Я лучше сдохну в мучениях чему буду пытаться запустить Makefile на Windows. Спасибо за ответ.
Ответы: >>1451449
Аноним 2019/08/11 14:05:17  №1451449 140
>>1451371
Спасибо, поправил URL репозитория (хотя гитхаб умеет редиректить со старого URL на новый). Добавил в README больше словесных описаний, объясняющих что делают консольные команды. К сожалению, нет возможности проверить как проект работает под виндой.

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

>>1451448
Использование утилиты make не обязательно, в Makefile просто сокращения для консольных команд, которые можно выполнить и без make.

Аноним 2019/08/12 00:26:50  №1451759 141
15617059045170.jpg (25, 300x300)
300x300
>>1446969 (OP)
Подскажите ньюфагу, где можно почитать или посмотреть на проект, идеально было бы пхп-sql-js, где реализовано разделение юзеров на разные сессии и аккаунты, т.е каждый работает в своем аккаунте и сессии. Если там еще будет crud, то я помру от счастья.
Ответы: >>1451769 >>1451955
Аноним 2019/08/12 04:50:20  №1451769 142
Ответы: >>1451770
Аноним 2019/08/12 04:55:19  №1451770 143
>>1451769
Спасибо, но я еще во фреймворках понимаю чуть более, чем нихуя. Насколько по сравнению с ванильным пхп там сложнее восприятие кода?
Ответы: >>1451771
Аноним 2019/08/12 05:03:18  №1451771 144
>>1451770
Если тебе сделать нужно то намного проще, потому что все готово. Если если разобраться как сделано то все хуево, нужно разгребти кучи магии. С опытом там становится понятно как все работает внутри, но со старта разобраться это пиздец.
Ответы: >>1451774
Аноним 2019/08/12 05:21:46  №1451774 145
>>1451771
>если если разобраться как сделано то все хуево, нужно разгребти кучи магии
Зис, к сожалению. Гуглить\копипастить типовые решения я уже хорошо научился и так, но мой вкат сейчас застопорился именно на понимании работы в глубину процесса. Блядь, дошел до стадии, когда надо либо на практике учиться, либо искать наставника, но на работу не берут никуда, требований какой-то вагон, ну а наставники сами уже все заебались.
Ответы: >>1451777
Аноним 2019/08/12 05:44:09  №1451777 146
>>1451774
Ну если у тебя есть время, то самый простой способ: ставить себе задачу вроде той, что ты обрисовал, и садиться ее реализовывать. То, что непонятно - гуглишь, и потихоньку по кирпичикам собираешь решение своей задачи и получаешь знания.
Когда я начинал, я умел только верстать и натягивать верстку на MODX - там пэхэпэ вообще не нужен для базовых задач. А потом однажды получил заказ на кастомное решение, и сел писать, при том, что из PHP знал только echo(). В общем, когда я эту задачу решил, я уже знал все основы языка. После ещё нескольких таких задач я разобрался достаточно для того, чтобы сесть за документацию и изучить все нормально.
Аноним 2019/08/12 08:49:44  №1451841 147
Сап двощь, я немного не понял по теме бд миграций. Например стоит задача изменить что-то очень важное в архитектуре бд, это изменение ломает например немного кода, но чтобы не ломало надо обойти всю таблицу и что-то апдейтнуть в ней. Как происходит вот этот весь воркфлоу с гитом и миграциями? Я не думаю что будет правильно сразу в файле миграций писать скл код который обходит таблицы и что-то с ними делает, наверное стоит это сделать какой-то консольной командой?
Ответы: >>1451915
Аноним 2019/08/12 09:23:52  №1451878 148
Анинки, изучаю гит, но никак не возьму в толк: я могу клонировать проект с локального компьютера на удаленный сервер, например, сервер провайдера, если там НЕ установлен гит? Тут же просто как бы копирование идет, я же там не буду репозиторий делать. И если на сервере провайдера стоит пароль, мне гит это окошко выведет, или надо в команде прописывать как-нито? Понимаю вопрос детский, но для меня все это вновинку
Ответы: >>1451884
Аноним 2019/08/12 09:32:32  №1451884 149
>>1451878
Раз у тебя есть хостинг не проще ли туда задеплоить проект свой через админку или ssh? Гит это не про то, что тобой описано.
Ответы: >>1451891
Аноним 2019/08/12 09:41:56  №1451891 150
>>1451884
Я не совсем понимаю конечную процедуру. Вот я доделал проект на локальном комьютере. Раньше я думал, что теперь мне надо сделать клон через гит и отправить его на сервер. Выходит, тут гит мне не поможет, и все тупо копировать вручную? А гит - это просто аз изменениями следить?
Ответы: >>1451895
Аноним 2019/08/12 09:52:44  №1451895 151
Ответы: >>1451897
Аноним 2019/08/12 09:56:44  №1451897 152
>>1451895
Большое спасибо, анончик
Аноним 2019/08/12 10:28:51  №1451915 153
>>1451841
Тебе понадобилось новое поле в таблице, ты написал в коде вывод этого поля во вьюхе (например) и написал миграцию с добавлением этого поля. Закомитил и отправил в репозиторий. Скрипт делоя увидел новый коммит спулил его и запустил миграцию. Конец истории.
Ответы: >>1451940 >>1452237
Аноним 2019/08/12 11:35:35  №1451940 154
>>1451915
Я немного про другое, например я добавил новое поле, но по логике приложения это поле computed из каких-то других полей, и нужно старые записи обновить каким-то масс апдейтом. Я вот и спрашиваю где лучше писать код этого масс апдейта, прямо в файле с миграциями?
Ответы: >>1451949
Аноним 2019/08/12 12:11:49  №1451949 155
>>1451940
Логически - да в файле миграций.
Пример: Ты ведешь разработку с кем то в команде, у каждого своя локальная база соответственно. Ты решил привнести свое сложное изменение базы - для других локально надо будет так же только запустить миграцию.
Но есть нюанс если у тебя на бою Большие данные и обработка всей базы по твоим новым правилам не влезет в 10 минут (или сколько там живет cli) то естественно тут будет другое решение.
Аноним 2019/08/12 12:28:24  №1451955 156
>>1451759
бумп, вопрос еще акутален
Ответы: >>1452003
Аноним 2019/08/12 13:36:23  №1452003 157
Аноним 2019/08/12 13:43:47  №1452005 158
Можно ли как-то задать свойство класса с помощью метода? Ну или ещё как-то вынести значение из текста программы в иное место?

Вот код: https://pastebin.com/VYB6rxjP
Там токен = 666666666. Но мне нужно, чтобы этот токен брался вообще не из кода, а из конфига, который в базе (достаётся из неё через getToken() ). Но если написать вместо protected $token = "666666666"; что-то типа protected $token =$this->getToken();, то пхп на меня смотрит очень укоризненно.
Ответы: >>1452006 >>1452115
Аноним 2019/08/12 13:46:01  №1452006 159
>>1452005
В конструктор инициализацию полей вынеси, он затем и нужен
Ответы: >>1452056
Аноним 2019/08/12 14:49:33  №1452047 160
Пытался написать, но макак не пропускает, в общем вот мой высер https://pastebin.com/Mf6j8QnR
Суть в чем: тайпскрипт хорошая штука, но меня вымораживает, что любые внешние данные творят что хотят в моих строго типизированных для компиляции скриптах. Пришел null вместо числа? Ну все пизда тебе.
Как?! Как это всё правильно отрабатывать? Где проверять, преобразовывать, надо ли вообще. Как это делается в PHP? Опушка, помоги! SomeApprentice, ты нырнул глубоко в это дерьмо, может сможешь помочь?
Ответы: >>1452078
Аноним 2019/08/12 15:13:36  №1452056 161
>>1452006
Там в исходном классе уже есть конструктор (я просто его не показал). И когда вставляю в него $token =$this->getToken();, код не работает. Получается, это у меня где-то там косяк и так и надо было делать?
Ответы: >>1452070
Аноним 2019/08/12 15:46:28  №1452070 162
>>1452056
>$token =$this->getToken()
может всё такие $this->token?
или вообще сделай метод initToken() и вызывай его в конструкторе. Если ты наследуешь то не забывай про parent::__construct()
Ответы: >>1452130
Аноним 2019/08/12 16:05:52  №1452078 163
>>1452047
Тайпскрипт не занимается валидацией в рантайме и никогда не будет, так как это повлечёт изменение скомпилированного 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. Проблему решает, но код на декораторах получается перегруженным.
Аноним 2019/08/12 17:31:16  №1452115 164
>>1452005
Если доступ к полю происходит через метод-геттер (в твоем примере aa() ) то просто переопределяешь этот метод в наследуемом классе чтобы он возвращал то что нужно (это одна из причин почему желательно использовать геттеры а не напрямую поля дергать). Если поле используется напрямую $this->token тогда нужно добавлять магии __get https://ideone.com/TPS1f7
Ответы: >>1452133
Аноним 2019/08/12 18:07:32  №1452130 165
>>1452070
>может всё такие $this->token?
Да, точно. Вызываю в конструкторе вот так:
$this->token = $this->getToken();
И в тестовом примере оно работает. А вот в коде, который модифицирую - нет. Завтра буду много думать.
Аноним 2019/08/12 18:19:58  №1452133 166
>>1452115
Спасибо, завтра попробую.
Аноним 2019/08/12 18:25:04  №1452134 167
А как написать палиндром для кирилицы? Я понял что использовать функцию strrev() нельзя, но решаю через цикл, mb_substr() тоже хуйню возвращает, нихуя не понимаю, вот код: https://ideone.com/xSGVI4
Ответы: >>1452137
Аноним 2019/08/12 18:52:28  №1452137 168
>>1452134
Напиши в 20 строке echo "$symbol1 $symbol2\n"; и посмотри что получается
Ответы: >>1452160
Аноним 2019/08/12 19:43:13  №1452160 169
>>1452137
Понял что у меня $symbol1 выводит что нужно, а $symbol2 весь текст так как выборка подстроки от 0 до -1, ну получается надо переписывать это по другому совсем, хули тут это ебка с этими кодировками, в питоне в одну строчку простейшую решается этот палиндром, какой же сложный язык.
Ответы: >>1452174
Аноним 2019/08/12 20:23:07  №1452174 170
>>1452160
Вообщем я сделал, но выглядит страшно, мне кажется очень всратое решение, если есть лаконичней и проще, прошу скинуть, вот мой:
https://ideone.com/tmn3Fh
Ответы: >>1452185
Аноним 2019/08/12 21:39:50  №1452185 171
Ответы: >>1452199
Аноним 2019/08/12 23:23:45  №1452199 172
>>1452185
Так.. Решил я значит прочитать в учебнике анона про задачу. Написано что земля пухом, если через strrev решать. Поэтому держи другой вариант =) http://ideone.com/PUpD1t
Ответы: >>1453276
Аноним 2019/08/13 00:09:33  №1452201 173
Простите за тупой вопрос, но что означает символ ^ в версии пакета composer?
Ответы: >>1452273
Аноним 2019/08/13 07:22:15  №1452237 174
>>1451915
>Скрипт деплоя увидел новый коммит спулил его и запустил миграцию.

А можно об этом чуть подробнее? Что почитать, чтобы разобраться в этой теме?
Ответы: >>1452291
Аноним 2019/08/13 08:27:57  №1452273 175
Аноним 2019/08/13 08:45:30  №1452284 176
Знающий анон, подскажи позязя, я должен у каждой функции, класса и метода писать вот такую конструкцию:

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

Я понимаю, что это дает подсказки для эклипсов и нетбинов и позволяет проще писать документацию, но это общепринятый стандарт или что? И нужно ли соблюдать табуляцию, чтобы звездочка на второй строчке шла обязательно ниже второй звездочки с первой строки? Или просто две звезды, одна, одна и две?
Ответы: >>1452286 >>1452298
Аноним 2019/08/13 08:46:27  №1452286 177
>>1452284
Извините, облажался. Там звездочки и камменты к коду
Аноним 2019/08/13 08:52:15  №1452291 178
>>1452237
>А можно об этом чуть подробнее? Что почитать, чтобы разобраться в этой теме?

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

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

Или другой вариант через gitlab ci
https://m.habr.com/ru/company/softmart/blog/309380/
Аноним 2019/08/13 09:04:43  №1452298 179
>>1452284

Это 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.

Ответы: >>1452299
Аноним 2019/08/13 09:08:23  №1452299 180
Аноним 2019/08/13 13:16:04  №1452457 181
Привет аноны. Дайте подсказку, что там еще можно написать?
http://ideone.com/FFFpnc#stdin
Уже всё там прочесал, ошибок вроде нет, руководство тоже не помогает да, я тупенький в таких делах
Ответы: >>1452471
Аноним 2019/08/13 13:27:15  №1452471 182
Ответы: >>1452475
Аноним 2019/08/13 13:30:36  №1452475 183
>>1452471
Кажется, понял, спасибо. Я в коде указал "как бы очевидное"
Аноним 2019/08/13 17:58:56  №1452701 184
Привет, анон. Только вкатываюсь и пытаюсь разобраться.
https://ideone.com/r10PWb
Не могу понять как мне без 3-х инструкций echo сделать адекватный код. Всегда получается через 3 строки, даже если брать обычное умножение переменной на себя.
Ответы: >>1452718
Аноним 2019/08/13 18:26:48  №1452718 185
Ответы: >>1452726
Аноним 2019/08/13 18:39:33  №1452726 186
>>1452718
Ага, все дело в точках, которые я вижу впервые. Либо я читал как раздолбай, либо по гайдам еще рано для этого. Но в любом случае, спасибо
Ответы: >>1452791
Аноним 2019/08/13 20:10:04  №1452791 187
>>1452726
О, анон с моей проблемой. Думал минут 40 над этим, точек в гайде тоже не видел это который от ОПа. Решил отдохнуть, пока голова остынет
Аноним 2019/08/14 08:59:48  №1453019 188
Кто-нибудь из знатоков может своими словами кратенько разжевать новичку, что такое компосер? Я так понимаю, это какая-то линуксовская программа типа гита, которая сидит в папке с дистрибутивом твоего фреймворка, и , при установке, куда-то лезет, забирает последние версии каких-то файлов, обновляет, загружает и вообще доминирует
Ответы: >>1453059 >>1453190 >>1453551
Аноним 2019/08/14 09:21:30  №1453042 189
Как проверить ТИП файла в php?
Не разрешение, мне вообще похуй на его разрешение.
Тип.

Есть какой аналог линухового file?
Ответы: >>1453294
Аноним 2019/08/14 09:31:35  №1453059 190
>>1453019
Она есть под любую ось.
Устанавливает пакеты по конфигурации composer.json
Основная идея в указании зависимостей:
Например пакет а версии 1.1 работает только с пакетом б версии 2.3 это указано в конфигурации пакетов по сему композер скачает тебе только совместимые версии.
Ответы: >>1453241
Аноним 2019/08/14 11:27:39  №1453190 191
>>1453019

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

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

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

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

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

Композер работает в командной строке, потому, чтобы им пользоваться, надо сначала освоить её. У меня есть урок для начинающих: https://github.com/codedokode/pasta/blob/master/soft/cli.md
Ответы: >>1453241
Аноним 2019/08/14 12:56:16  №1453241 192
>>1453190
>>1453059
Как все умно сделано-то, спасибо, аноны
Ответы: >>1453267
Аноним 2019/08/14 13:34:04  №1453267 193
>>1453241
Не умно. Если в пакете A зависимость от пакета B с версией 1.0.0, тогда установив пакет A ты хуй установишь пакет B другой версии
Ответы: >>1453616
Аноним 2019/08/14 13:47:14  №1453276 194
>>1452199
О вот за это спасибо, очень красивое решение.
Аноним 2019/08/14 13:47:30  №1453277 195
Котаны, вопрос с .htaccess

Делаю тупейшую вещь, просто ридерекчу любой запрос на один конкретный php-файл. Сервер - openserver.
Такое правило
RewriteEngine On
RewriteRule ^.$ /public/test.php приводит к ошибке 500
а такое
RewriteRule ^[a-z0-9]
$ /public/test.php редиректит на test.php который и запускается.
Почему так?
Аноним 2019/08/14 13:48:35  №1453278 196
>>1453277
бля, звездочки сожрались
Аноним 2019/08/14 13:54:26  №1453285 197
Ответы: >>1453291
Аноним 2019/08/14 14:12:59  №1453291 198
>>1453285
>>1453277
а если точку в квадратные скобочки засунуть?
Ответы: >>1453318
Аноним 2019/08/14 14:18:44  №1453294 199
Аноним 2019/08/14 14:20:50  №1453296 200
>>1453277

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

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

Посмотри лог и поищи там ошибки, заодно нам расскажешь, в чем была проблема.
Ответы: >>1453318
Аноним 2019/08/14 14:44:02  №1453317 201
Пилю лайфхак, посаны.

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

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

Охуенная тема, примерно как с аннигиляцией скобочек с помощью return;
Ответы: >>1454601 >>1455476
Аноним 2019/08/14 14:44:59  №1453318 202
>>1453291
Если точку обернуть в квадратные скобки то перестает падать в ошибку 500.
Но
Из корня редиректит на нужный файл. Но стоит добавить хоть один символ и пишет ошибку "Объект не найден".

>>1453296
На этой же версии опенсервера у меня крутится по кускам содранный из разных мест фреймворк
https://ideone.com/LK3A5l
и там все работает
Я решил получше разобраться в .htaccess и сразу обосрался


Ответы: >>1453325 >>1453367
Аноним 2019/08/14 14:50:08  №1453325 203
>>1453318
пс
а если такое правило написать :
RewriteRule ^([a-zA-Z0-9/-]"тут звездочка")$ /public/test.php?id=$1 - то норм редиректит и $_GET заполняет
Аноним 2019/08/14 15:39:50  №1453367 204
15354457200090.png (698, 540x720)
720x540
Ответы: >>1453413
Аноним 2019/08/14 17:16:12  №1453413 205
>>1453367
Что то более чущественное сказать можешь?
на Апаче 70% вэбсерверов. Остальные 30 это ngnix.

Ответы: >>1455459
Аноним 2019/08/14 21:17:53  №1453528 206
15654764142170.jpg (7, 480x360)
360x480
Как правильно подключать библиотеки без поддержки пространства имён? И где именно - при инициализации приложения, или прямо в конструктор класса-оболочки его подключить?
И что за мода у некоторых разработчиков этих библиотек делать классы через статик?
Ответы: >>1455459 >>1455980
Аноним 2019/08/14 23:51:07  №1453551 207
>>1453019
Композер это годнота, базарю. Один раз попробуешь - больше не сможешь без него.
Аноним 2019/08/15 00:27:07  №1453558 208
Млп
Аноним 2019/08/15 06:04:33  №1453615 209
ПАМАГИТИ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
Ответы: >>1453867 >>1455476
Аноним 2019/08/15 06:05:17  №1453616 210
>>1453267
В этом весь смысл дурилка
Ответы: >>1453649
Аноним 2019/08/15 07:28:40  №1453649 211
>>1453616
Например мне надо поставить пакет A и B. Оба зависят от пакета С, но разных версий. Из-за этого я не смогу одновременно поставить A и B.

Это специально сделано?
Ответы: >>1454021 >>1455475
Аноним 2019/08/15 07:50:24  №1453656 212
Скажите, а как в апаче запретить доступ ко всем каталогам, кроме public?

Ответы: >>1453745 >>1455475 >>1455476
Аноним 2019/08/15 10:14:38  №1453745 213
>>1453656
Я просто посылаю все реквесты в \public\index.php
Ответы: >>1453859
Аноним 2019/08/15 12:45:17  №1453859 214
>>1453745
то есть в .htaccesse правилами не отсеиваешь файлы и папки.
А как тогда подгружаются стили и прочее барахло из public?
Аноним 2019/08/15 13:08:04  №1453867 215
Аноним 2019/08/15 16:21:02  №1454021 216
>>1453649
Ты вьелся в частный случай. Хочешь пакет каждый в свою среду окружения и тд и все это ради одного частного случая. Цель именно в строгости зависимости а ты хочешь все усложнить
Аноним 2019/08/15 18:39:17  №1454104 217
image.png (124, 416x226)
226x416
Этот опен сервер пойдет для создания локалки?
Ответы: >>1454117
Аноним 2019/08/15 19:22:50  №1454117 218
pepereee.jpg (137, 900x900)
900x900
>>1454104
ОН ДЛЯ ЭТОГО И СОЗДАННН!!!!
Ответы: >>1454129
Аноним 2019/08/15 19:44:03  №1454129 219
>>1454117
Мало-ли какой-то другой получше есть
Ответы: >>1454278
Аноним 2019/08/15 22:26:33  №1454210 220
Объясните мне как решить проблему при выводе символа строки через квадратные скобки, если строка написана кирилицей, кодировка слетает и выводит какую-то хуйню, вот пример: https://ideone.com/wMhDPb
Ответы: >>1454243 >>1455475
Аноним 2019/08/16 00:17:38  №1454243 221
>>1454210
Квадратные скобки выводят байт, а не символ. Из-за этого возникает проблема, потому что utf это многобайтовая кодировка. Используй mb_substr()
Ответы: >>1454251
Аноним 2019/08/16 01:32:15  №1454251 222
>>1454243
Спасибо, теперь разобрался.
Аноним 2019/08/16 05:00:13  №1454278 223
Ответы: >>1454313
Аноним 2019/08/16 07:33:04  №1454313 224
>>1454278
Много ли профита от разных опенсерверов?

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

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

Это нормальное решение в плане нагрузки на сервер? Меня очень смущает, что на каждую часть файла приходится sql запрос, можно как-то иначе решить этот вопрос? Как можно осуществить контроль к загрузчику без использования sql каждый раз? надеюсь понятно расписал
Ответы: >>1454365 >>1455475
Аноним 2019/08/16 08:55:42  №1454365 226
>>1454326
Возьми tus как готовое решение загрузки файлов по частям. Каждый блок там подписан хэшем. Так что кинешь проверку кук только на самый первый запрос загрузки дальше у тебя в очередь кусков уже никто не сможет влезть так что можно не проверять
Аноним 2019/08/16 09:05:12  №1454368 227
image.png (35, 873x395)
395x873
Привет, аноны.
На пикриле и задал значение Джонни синтаксу нейм.
Далее по условиям понятно, что если имя равно Пидар, то выводится хуидар и т.д. Почему вывелся хуидар, если имя не Пидор?
Ответы: >>1454370
Аноним 2019/08/16 09:06:03  №1454370 228
>>1454368
На пикриле я задал*
Быстрофикс
Ответы: >>1454371
Аноним 2019/08/16 09:10:24  №1454371 229
>>1454370
У тебя присвоение а не сравнение
Ответы: >>1454373
Аноним 2019/08/16 09:13:53  №1454373 230
>>1454371
Всё, понял, спасибо
до сих пор даже через раз точку запятую пропускаю
Ответы: >>1454376
Аноним 2019/08/16 09:19:45  №1454376 231
>>1454373
Поставь phpmd глобально и пакет для sublime соответствующий. Он будет тебе подсвечивать такие косяки
Ответы: >>1454383 >>1454419
Аноним 2019/08/16 09:29:26  №1454383 232
>>1454376
>Поставь phpmd глобально и пакет для sublime соответствующий
Что за зверь такой и где искать?
Ответы: >>1454387
Аноним 2019/08/16 09:33:07  №1454387 233
Ответы: >>1454390
Аноним 2019/08/16 09:40:05  №1454390 234
>>1454387
Спасибо!
А что насчет пакета для саблайм?
Ответы: >>1454483
Аноним 2019/08/16 10:10:18  №1454415 235
Ответы: >>1454424
Аноним 2019/08/16 10:14:14  №1454419 236
Аноним 2019/08/16 10:18:09  №1454424 237
>>1454415
Но ведь я не толстил
Ответы: >>1454429
Аноним 2019/08/16 10:25:09  №1454429 238
>>1454424
Когда более-менее разберёшься, то поймёшь, что этих ютубных хайпожоров лучше обходить стороной, а их уроки и подавно - это не программисты.
Ответы: >>1454432
Аноним 2019/08/16 10:27:27  №1454432 239
>>1454429
Понял. Ну, я не разобрался еще хорошо в этой теме, смотрю, т.к. более-менее рассасывает всё. Со мной ничего не случится плохого?
Ответы: >>1454437
Аноним 2019/08/16 10:36:53  №1454437 240
>>1454432
Да смотри что хочешь, только другим не рекомендуй ничего, тем более если мало опыта.

>Со мной ничего не случится плохого?
Ничего. Там же совсем ясли показывают.
Но я бы поискал что-то менее гнилое.
Ответы: >>1454438
Аноним 2019/08/16 10:37:47  №1454438 241
>>1454437
>Но я бы поискал что-то менее гнилое
Ты использовал какие-то видео-уроки сам?
Ответы: >>1454444
Аноним 2019/08/16 10:43:15  №1454444 242
>>1454438
Поначалу вполне норм, но потом слишком медленно уже - читать быстрее. Сейчас только статьи всякие читаю интересные да доки посматриваю.
Ответы: >>1454451
Аноним 2019/08/16 10:49:21  №1454451 243
Аноним 2019/08/16 11:21:47  №1454473 244
image.png (31, 511x480)
480x511
Анончики, как подключить эту хрень?
Ответы: >>1454482
Аноним 2019/08/16 11:35:51  №1454482 245
>>1454473
Я нагуглил. Если кто-то не знает пароль от этого, то просто в логине пишите root и можно логиниться
Аноним 2019/08/16 11:39:16  №1454483 246
Ответы: >>1454486
Аноним 2019/08/16 11:42:21  №1454486 247
Аноним 2019/08/16 16:02:40  №1454601 248
>>1453317
@unlink($mediafile) еще проще
Ответы: >>1454823
Аноним 2019/08/16 16:16:16  №1454616 249
Аноним 2019/08/16 16:39:25  №1454631 250
Анончики, объясните, пожалуйста, где в задаче про список абитуриентов нужно использовать класс Абитуриент?

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

Зачем нужен класс Абитуриент, если можно сразу использовать данные полученные в классе таблицы?
Ответы: >>1454671 >>1455475
Аноним 2019/08/16 17:49:54  №1454671 251
>>1454631
Ты можешь из бд сразу экземпляры класса получать, это очень удобно. Гугли pdo fetch class
Аноним 2019/08/16 18:00:00  №1454677 252
Пытаюсь загрузить файл на telegra.ph/upload через curl, ошибка то Failure when receiving data from the peer, то SSL connect error.
Попробовал на imgur грузить - без проблем, любые страницы (и сам файл) получаю тоже. А на телеграфе проблема. Что делать?
Ответы: >>1454814
Аноним 2019/08/16 19:41:13  №1454727 253
>>1454313
>Учим PHP за 1 час
@
Видео идёт полтора
Ответы: >>1454746
Аноним 2019/08/16 20:35:10  №1454746 254
>>1454727
Не, там почти 4 выходит
Аноним 2019/08/17 01:12:49  №1454814 255
>>1454677

Тебе надо разобраться, в чем может быть проблема. Цепочка тут довольно сложная: твоя программа использует расширение 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

Ответы: >>1454989
Аноним 2019/08/17 04:30:35  №1454823 256
>>1454601
Он не про это вовсе
Аноним 2019/08/17 11:00:14  №1454970 257
как сука убрать из формы старые запросы?чтобы при перезагр страницы их там не было
Ответы: >>1455005 >>1455027
Аноним 2019/08/17 11:25:18  №1454989 258
>>1454814
>библиотека 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, а там, оказывается, ограничение на кол-во загрузок.
Ответы: >>1455010 >>1455024
Аноним 2019/08/17 11:46:02  №1455005 259
>>1454970
Не нажимай кнопку назад. Можешь сделать редирект =)
Ответы: >>1455009
Аноним 2019/08/17 11:51:41  №1455009 260
>>1455005
а нет к-л скрипта чтобы чистил?
Ответы: >>1455013
Аноним 2019/08/17 11:52:16  №1455010 261
>>1454989

Нужно проверять утилитой 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 скрипт, который содержит только единственный запрос к серверу. И включи в нем опции для отладки, запусти его из консоли и посмотри, что получится.

Ответы: >>1455063
Аноним 2019/08/17 11:52:37  №1455011 262
Есть пхп господа из столиц? Подскажите, по работе для новичков все ок или уже не очень?
Аноним 2019/08/17 11:54:24  №1455013 263
Ответы: >>1455016
Аноним 2019/08/17 11:57:34  №1455016 264
>>1455013
а если так?
<input type="reset" value="Сбросить">
Ответы: >>1455017
Аноним 2019/08/17 11:59:39  №1455017 265
>>1455016
Я тебе дал всю инфу, остальное уже ты проверяй пока не получится =) И эта кнопка тебя не спасет от сохраненных данных при обновлении. На неё же еще нажать надо.
Аноним 2019/08/17 12:13:20  №1455024 266
>>1454989

Дополню еще. Если ты никак не можешь найти 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 прокси не использует.
Ответы: >>1455063
Аноним 2019/08/17 12:15:28  №1455027 267
>>1454970

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

Также, в любом случае тебе надо использовать паттерн Post/Redirect/Get. Про этот паттерн и другие вещи я написал в уроке про обработку данных форм: https://github.com/codedokode/pasta/blob/master/forms.md

Ответы: >>1455029
Аноним 2019/08/17 12:16:40  №1455029 268
Ответы: >>1455474
Аноним 2019/08/17 12:47:08  №1455061 269
Анон, хватит себя мучать. Иди плати денежку на Хекслет и ищи норм работу.
Я устроился на 35к, щас 55 (полгода опыта)
Ответы: >>1455070 >>1455078
Аноним 2019/08/17 13:00:23  №1455063 270
Screenshot9.jpg (117, 816x245)
245x816
Screenshot10.jpg (221, 525x654)
654x525
extension=php_openssl.dll в php.ini включено.
>>1455024
Вот вывод после как я понял авторизации проксей.
И вывод openssl s_client -connect telegra.ph:443 -msg

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

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
Ответы: >>1455073
Аноним 2019/08/17 13:31:21  №1455070 271
>>1455061
Иди-ка ты нахуй со своими курсами.
Ответы: >>1455079
Аноним 2019/08/17 13:35:26  №1455073 272
>>1455063

Скорее всего дело в РКН. Вот как у меня выглядит соединение без 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. Можешь глянуть, если интересно. Ты можешь так убедиться, что моя версия правильная и проблема не в твоем коде, а в сетевых проблемах.

Ответы: >>1455082
Аноним 2019/08/17 13:41:10  №1455078 273
Ответы: >>1455080 >>1455131
Аноним 2019/08/17 13:48:30  №1455079 274
>>1455070
Ну давай, осиливай свои регулярочки еще полгода. А потом на завод иди
Ответы: >>1455090 >>1455131 >>1455474
Аноним 2019/08/17 13:49:37  №1455080 275
>>1455078
Если появляются, зарегистрируйся, пройди бесплатные уроки. Я же не кидаю реф. ссылку, а делюсь годнотой.
Аноним 2019/08/17 13:58:50  №1455082 276
Screenshot9.jpg (126, 967x230)
230x967
>>1455073
>Скорее всего дело в РКН.
Но почему любые другие заблокированные сайты открываются без проблем? Через эти же прокси. Вот сейчас для теста рутрекер открыл.

>Wireshark
Понятнее не становится.
Попробовал установить curl_setopt($curl, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1_3'); - Wireshark всё еще показывает соединение по TLSv1. Открыл опять рутрекер - там уже TLSv1.2. Кажется, ничего не меняется от этой опции.
Ответы: >>1455094 >>1455114
Аноним 2019/08/17 14:05:20  №1455090 277
>>1455079
Зачем ты платишь за бесплатную информацию?
Аноним 2019/08/17 14:08:00  №1455094 278
>>1455082
Попробовал через бесплатные прокси коннектиться к заблокированным сайтам - все редиректит на сайт провайдера. Хм.
Ответы: >>1455095
Аноним 2019/08/17 14:14:58  №1455095 279
>>1455094
А вот через socks5 прокси получается. Какой вывод делать-то? Мой провайдер настроил DPI исключительно на telegra.ph?
Аноним 2019/08/17 14:25:31  №1455099 280
Перенастроил прокси на socks5, опять коннектится ко всему, кроме телеграфа. Может, дело реально в проксе?
Попробовал зайти через браузер, использую эту проксю. Не заходит. Блядь, а я еще и деньги за неё платил, чтобы получать вот это вот.

Спасибо, ОП! Без тебя бы не справился.
Ответы: >>1455121
Аноним 2019/08/17 14:38:39  №1455114 281
>>1455082

В 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.

Ответы: >>1455130
Аноним 2019/08/17 14:46:11  №1455121 282
>>1455099

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

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

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

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

Но в общем тебе нужен если и прокси, то не HTTP, а HTTPS, к которому ты подключаешься по SSL, с шифрованием. Иначе он ничего не скрывает.
Аноним 2019/08/17 15:01:12  №1455130 283
Screenshot10.jpg (69, 554x343)
343x554
>>1455114
Но прокси вроде https. Вон, зашифровано же, нет? Я в это разбираюсь еще меньше, чем во всем остальном.
Ответы: >>1455197
Аноним 2019/08/17 15:03:29  №1455131 284
>>1455078
Все курсы на торрентах есть.

>>1455079
Лучше вам заплатить, чтобы вы про эти регулярочки пропердели в микрофон, да? А потом - иди нахуй. Вся суть этих курсов.
Ответы: >>1455140
Аноним 2019/08/17 15:17:01  №1455140 285
>>1455131
Ну если ты такой умный и прошел все курсы мира на торрентах, то покажи свой охуенный код на гитхабе
Ответы: >>1455144
Аноним 2019/08/17 15:27:30  №1455144 286
>>1455140
>прошел все курсы мира
Нахрен мне все курсы мира проходить?
Но да - я учился по курсам с торрентов. Поначалу. Потом уже самому пора уметь.

>покажи свой охуенный код
Зачем?
Ответы: >>1455151
Аноним 2019/08/17 15:38:59  №1455151 287
>>1455144
Чтобы сэкономить время людей, которые хотят войтивайти самым безболезненным способом (через Хекслет).
Ведь если ты макакер уровня подписчиков Марлина, то тебе нельзя верить
Ответы: >>1455156 >>1455158
Аноним 2019/08/17 15:47:29  №1455156 288
>>1455151
>войтивайти самым безболезненным способом
Заплатив вам за ваши говнокурсы, делающие говокодеров.
Если нет технического бэкграунда и мозгов, то никакие курсы не помогут, а тем у кого это всё есть - никакие курсы не нужны.

>если ты макакер уровня
А ты что за хуй важный чтобы мой уровень оценивать?
Ответы: >>1455158
Аноним 2019/08/17 15:53:10  №1455158 289
>>1455156
>>1455151
Хватит ругаться, джуниоры, не позорьте себя перед префессионалами.
Мимо-5-пет-проектов-на-штмл
Аноним 2019/08/17 16:26:13  №1455197 290
>>1455130

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

Протокол 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.
Аноним 2019/08/17 17:51:21  №1455252 291
Привет, ОП, я когда-то делал твои задачи по вёрстке, на работе пишу бекенд, но внезапно понравилось верстать, возникли вопросы по которым очень интересно твоё мнение:
- Какой смысл в семантических тегах (section, article, menu) для закрытых SPA, которые не будут индексироваться? Почему иногда в статьях по-прежнему используют ul/li для меню, а потом перекрывают дефолтные padding/margin у этих тегов, вместо того, чтобы просто сверстать на div/span и flexbox? Вёрстка проще, поддержку IE просят очень редко.
- Для ретины рекомендуется использовать изображения с более высоким расширением. Я не очень понимаю как это работает на уровне железа. Что значит "повышенная плотность пикселей". Если на ретине с разрешением 1920x1200 и обычном дисплее 1920x1200 открыть одну и ту же картинку, то она будет отображена одинаково? Как-то можно эмулировать ретину на обычном дисплее, чтобы видеть вёрстку на маке, не имея мака?
- Что порекомендуешь для pixel perfect вёрстки, может есть расширения для браузера или удобные линейки под линукс?
Ответы: >>1455471
Аноним 2019/08/18 00:52:51  №1455459 292
>>1453413
>2020
>Apache
Апач это лютый депрекейт. Годится только для локалки - течёт по памяти пиздец.

>>1453528
Фу блядь, фу нахуй. Используй неймспейсы и не еби себе мозги.
Ответы: >>1455474 >>1455977
Аноним 2019/08/18 01:17:56  №1455466 293
доброй ночи
есть задача, исходные:
знаю базовые вещи вроде html, css, javascript, sql, ооп, очень поверхностно mvс, на php писал скрипты к всяким вордпрессам и джумлам и ковырялся в плагинах
собственно нужно сделать что-то вроде облачного хранилища фоток: юзеры грузят фотки на сервер, в личном кабинете могут просматривать их, создавать "альбомы" и раскидывать по ним фотки, делиться ссылкой с кем-попало или давать доступ к альбомам другим юзерам
стоит ли с такой задачей влезать в php фреймворки (если да, то какой?) или проще лепить код самому? быстрее ли будет разобраться с функционалом фреймворка или же писать и собирать phpные куски?
в приоритете время разработки, защищенность и правильная архитектура не интересует
Ответы: >>1455474
Аноним 2019/08/18 01:34:49  №1455471 294
>>1455252

> Какой смысл в семантических тегах (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 вёрстки, может есть расширения для браузера или удобные линейки под линукс?

Не знаю, есть какие-то расширения, которые позволяют поверх сайта наложить полупрозрачную картинку-образец.
Аноним 2019/08/18 02:09:51  №1455474 295
>>1455466

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

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

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

>>1455459

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

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

>>1455079

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

>>1455029

Показ выпадающего списка можно отключить HTML-атрибутом autocomplete. Это стоит делать для полей, содержащих приватные данные (вроде номера карты или паспорта), чтобы браузер их не сохранял.
Аноним 2019/08/18 02:10:55  №1455475 296
>>1454631

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

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

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

>>1454326

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

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

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

>>1454210

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

>>1453649

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

>>1453656

Сделать каталог public корневым (DocumentRoot). Это самый надежный способ.
Аноним 2019/08/18 02:12:03  №1455476 297
>>1453656

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

>>1453615

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

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

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

>>1453317

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

Аноним 2019/08/18 05:21:23  №1455492 298
как вы смотрите на текущее состояние php в реалиях 2019 года и его развитие?
Ответы: >>1455496
Аноним 2019/08/18 05:45:29  №1455496 299
Ответы: >>1455498
Аноним 2019/08/18 05:49:58  №1455498 300
Аноним 2019/08/18 13:02:27  №1455647 301
image.png (26, 1024x768)
768x1024
>>1446969 (OP)
Помогите решить тестовые задания (одно из тестовых на собеседовании кстать):
Нужно сверстать календарь используя списки

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

Если кому интересно покидаю другие
Ответы: >>1455649
Аноним 2019/08/18 13:03:37  №1455649 302
Аноним 2019/08/18 13:14:18  №1455656 303
Добрый день. Меня гложит следующая мысль: имеет ли основания джавист или например шарпист смотреть на пхп-программиста свысока и считать последнего "недопрограммистом", потому что "написание скриптиков" - это якобы что-то несерьёзное. А вот они, работающие на компилируемых языках, работающие в энтерпрайзе со всякими банками и прочими крупными заказчиками, это кто-то, кто стоит на уровнь выше и является "настоящим" программистом.
Это не троллинг, я серьёзно спрашиваю, и точно не хочу начинать срач. Я вроде бы понимаю, что язык - это просто инструмент, и сам по себе он не должен быть мерилом профессионализма. Мне хотелось бы услышать какие-то аргументы не для спора с кем-то, а для самого себя, чтобы избавиться от некоторых комплексов.
Ответы: >>1455657 >>1455681 >>1455831
Аноним 2019/08/18 13:21:53  №1455657 304
>>1455656
Полное право имеют. Потому что даже самый высоконагруженгый сайтик с гиганстким стеком технологий не сравнится с написанием приложения для, например, банковской сферы.
Ответы: >>1455687 >>1455803
Аноним 2019/08/18 14:37:46  №1455681 305
>>1455656
Всё зависит от того, какой у тебя уровень и какими технологиями ты владеешь.

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

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

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

Хотя многие реально клепают круд-говно, просто на других языках, шлёпают какие-нибудь формы к БД, которую даже и не они проектируют.
Ответы: >>1455687 >>1455699
Аноним 2019/08/18 14:55:44  №1455687 306
Ответы: >>1455692
Аноним 2019/08/18 15:04:43  №1455692 307
>>1455687
Хотя немного грустно стало от ваших ответов, честно говоря.
Ответы: >>1455693
Аноним 2019/08/18 15:07:16  №1455693 308
>>1455692
А какая нахуй разница, если бабки платят? Ну грустно и хуй с ним, зато сытно.
Ответы: >>1455697
Аноним 2019/08/18 15:18:53  №1455697 309
>>1455693
Хмм, а в этом есть логика, ведь если платят, то видимо не просто так платят.

И кстати, на Хабре в какой-то теме про ПХП я читал, что работа на Симфони в целом по сложности и приятности не многим отличается от работы на той же Джаве, это правда так?
Ответы: >>1455701
Аноним 2019/08/18 15:21:32  №1455699 310
>>1455681
> В ПХП тоже есть, где развернуться и что изучить. Но обычно это уже дополнительные сервисы и коммуникация с ними.

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

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

Коли уж заговорил про WP, то это адская говнина, которую 24/7 надо мониторить на предмет уязвимостей. Короче тезис таков, что у рнр были шансы, но ребята всё пребали. Сейчас с 0 писать какой-то высоконагруженный проект не имеет смысла.
Ответы: >>1455714 >>1455716 >>1455803
Аноним 2019/08/18 15:22:37  №1455701 311
>>1455697
На голой джаве так-то тоже не пишут. Spring и иже с ним. Понятное дело, что либа навороченная и в неё надо вникать.
Аноним 2019/08/18 15:42:59  №1455714 312
>>1455699
Много есть каких-то больших проектов на PHP, не только мелочь. Если годами пишешь на ПХП и хорошо владеешь всеми инструментами, то почему бы и для нового проекта не взять привычный инструмент? Точно ли альтернативы плюсы дадут?

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

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

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

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

Аноним 2019/08/18 15:44:19  №1455716 313
>>1455699

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

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

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

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

И насколько я знаю, фейсубк и вконтакте именно на PHP писать начинали. А на Яве написаны одноклассники.
Ответы: >>1455722 >>1455826
Аноним 2019/08/18 15:50:55  №1455722 314
>>1455716
>И насколько я знаю, фейсубк и вконтакте именно на PHP писать начинали.
Это было 15 лет назад, другая эпоха. Кто-нибудь сейчас стартует большие проекты на ПХП? На самом деле кажется, что всё-таки да, но сейчас явных преимуществ ПХП над другими языками нет, на ПХП уже не принято писать, как 15 лет назад.
Ответы: >>1455727
Аноним 2019/08/18 15:55:47  №1455727 315
>>1455722

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

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

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

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

Бекэнд у вашего резюме даже не рнр обрабатывает, я больше чем уверен.
Аноним 2019/08/18 18:38:04  №1455829 319
>>1455803
У тебя кругозор слишком узкий, видимо студент или крутишься в вебе. Джава как и змея используются для форма клепства сопру нет, но спектр задач гораздо шире. На рнр ты кое как бекэнд обработаешь да json оаспарсишь, а на джаве сервер напишешь, а на питоне вообще всё что угодно сделаешь, только пиздец как медленно.
Аноним 2019/08/18 18:45:00  №1455831 320
>>1455656
Подобными вопросами задавался и я год-два назад.

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

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

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

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

хз зачем я это высрал
похуй, всеравно анонимная борда
Ответы: >>1455837
Аноним 2019/08/18 18:50:10  №1455835 321
Аноны нужна помощь.
Вообщем столкнулся я с задачей по ООП, где нужно написать функцию padLeft и padRight используя функции mbstring, но вот беда, модуль этот по стандарту не включен, нагуглил что нужно раскомментировать строку отвечающий за этот модуль в файле php.ini, но в папке php у меня его нет, а phpinfo() пишет что ini файл находиться в c:\windows, но там его тоже нет. Что делать?
Ответы: >>1455842 >>1455861
Аноним 2019/08/18 18:51:19  №1455837 322
>>1455831
Наобот спасибо, что высрал написал.
Аноним 2019/08/18 18:58:16  №1455842 323
>>1455835

В phpinfo() надо смотреть не "место, где ищется php.ini", а строку, где написано "использованные ini-файлы" или как-то так. Скинь скриншот верхней части таблицы, если найти не можешь.
Ответы: >>1455860
Аноним 2019/08/18 19:04:27  №1455850 324
Всем привет

Прошу прощения за платиновый вопрос и то, что не читаю в гугле.
МОжет подскажете, как дела в европе с PHP? через пару месяцев меня ждет релокация в Чехию или, менее вероятно, но есть шанс, в Гермашку (скорее первое) по основной работе, которую после дропну нахуй. Понимаю, что там своим спецов дохуя , и я буду нубом, но с финаносовой подушкой есть полгода-год, чтобы поуизучать + по текущей работе есть реальные примеры, что могу поделать (допилить аддоны в облаке, могу просто попросится проверять и помогать коллегам)
Ответы: >>1456140
Аноним 2019/08/18 19:08:31  №1455860 325
image.png (158, 1366x768)
768x1366
>>1455842
Судя по Loaded Configuration File (none) ini файла у меня попросту не существует.
Ответы: >>1455876 >>1455905
Аноним 2019/08/18 19:10:14  №1455861 326
>>1455835
Раскомментировать подойдет если у тебя стоит пыха такая как ее делали разрабы пыхи, что на большинстве дистрибутивов врядли. Скорее всего надо просто поставить нужный модуль. Но поскольку ты на винде - хз как это сделать
Ответы: >>1455869
Аноним 2019/08/18 19:14:42  №1455869 327
>>1455861
Нужный модуль у меня находиться в папке php\ext, но для его включения нужен ini файл, вот я и ищу его.
Ответы: >>1455870
Аноним 2019/08/18 19:15:54  №1455870 328
>>1455869
У тебя опен сервер?
Ответы: >>1455873
Аноним 2019/08/18 19:22:35  №1455873 329
>>1455870
Нет, я использую встроенный php сервер.
Аноним 2019/08/18 19:24:33  №1455876 330
>>1455860
У тебя же написано что Configuration file (php.ini) path - находится в C:\Windows
Ответы: >>1455878
Аноним 2019/08/18 19:25:31  №1455878 331
>>1455876
Так в том то и дело, что его нет там.
Ответы: >>1455879
Аноним 2019/08/18 19:26:54  №1455879 332
>>1455878
Советую тебе поставить apache или nginx, чтобы ты все смог настраивать, там то они (конф. файлы) точно будут
Ответы: >>1455880
Аноним 2019/08/18 19:27:33  №1455880 333
>>1455879
Ладно, попробую, спасибо за помощь.
Аноним 2019/08/18 19:54:46  №1455905 334
>>1455860

У тебя все ясно написано: 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 )

Аноним 2019/08/18 20:26:37  №1455923 335
Доктрина или елокуент?
Ответы: >>1456004 >>1456136
Аноним 2019/08/19 00:06:39  №1455977 336
>>1455459
>Используй неймспейсы
Жопой читаем?
Аноним 2019/08/19 00:29:29  №1455980 337
>>1453528

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

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

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

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

Если подключение библиотеки требует много ресурсов, то делаешь функцию для подключения и вызываешь только когда это нужно.
Ответы: >>1456191
Аноним 2019/08/19 03:33:09  №1456004 338
>>1455923
елокуент и в пизду этот падающий от любого ика менеджера сущностей
Ответы: >>1457179
Аноним 2019/08/19 08:22:34  №1456059 339
Аноны, привет, на связи пидораха. Хочу стать человеком. А точнее программистом который хочет глубже познать суть.
Так что мне видимо требуется открыть для себя волшебный мир структур данных и алгоритмов, я прав?
Подскажите книгов пожалуйста.
Ответы: >>1456213 >>1457179
Аноним 2019/08/19 08:56:27  №1456087 340
В последнее время всё чаще думаю, что все попытки демонизировать php - это ошибка. Постоянно встречается говно с тем, что память течёт, системный io блокирующий, нормальных инструментов для ассинхронной работы нет, возникает необходимость в супервизоре, хелсчеках, таймаутах на операцию и т.п. Да и зачем, если php под это тупо не задизайнён?
Та же связка nginx-phpfpm (а теперь ещё и в php7.4 пред-загрузка появилась) дают огромную производительность, в которую ты уже не упрешься практически никогда (потому что узкое место - это обычно база данных, а приложения на php масштабировать очень просто), если написано нормально, а не через жопу.
Даже если задача такова, что нужно вычитывать из вебсокета или очереди, то есть куча инструментов (тот же nginx), которые умеют вычитывать данные и слать http-запросы, позволяя php работать as designed, а не как сова на глобусе.
Ответы: >>1456133 >>1456201 >>1456316
Аноним 2019/08/19 09:33:56  №1456133 341
>>1456087
так и есть , или ждать пхп8 когда сделают асинхронность из коробки на низком уровне ядра , всё остальное ReactPHP и тд шняги для бенчмарков + пет проекты уровня хелло ворлд
Аноним 2019/08/19 09:35:21  №1456136 342
>>1455923
2 разных подходи , вопрос сорт оф автомобиль или лодка
Аноним 2019/08/19 09:37:45  №1456140 343
>>1455850
подтягивай тогда лучше англ , джуны без нетива на уровне б1 не нужны , по работе она есть , не так много как например в укропском ДС но есть.

мимо варшава кун
Ответы: >>1456164
Аноним 2019/08/19 10:11:12  №1456164 344
>>1456140
Спасибо
С ним как раз проблем нет
Аноним 2019/08/19 10:56:04  №1456191 345
>>1455980
Спасибо.
Всегда пишу через неймспейсы + композер, не хочется напрямую инклюдить, в обход общей структуры приложения.
Аноним 2019/08/19 11:08:42  №1456201 346
>>1456087
Так возьми ту же ноду, чё как фуфел? Или ты из тех чуваков, что пхп - ван лав?
Ответы: >>1456579
Аноним 2019/08/19 11:20:28  №1456213 347
Аноним 2019/08/19 13:26:26  №1456283 348
Пачаны, где искать задачки на подобие ОПовых? Одна мука в инете, сосчитать 2 + 2 и прочее гавно из жопы.
Ответы: >>1456305 >>1456709 >>1457176
Аноним 2019/08/19 13:49:06  №1456305 349
Аноним 2019/08/19 14:08:45  №1456316 350
>>1456087
Расскажи что за задачи ты решаешь? Личный интерес
Ответы: >>1456579
Аноним 2019/08/19 15:47:17  №1456376 351
как сделать личный кабинет?
Ответы: >>1456452 >>1457176
Аноним 2019/08/19 16:35:18  №1456452 352
Ответы: >>1456472
Аноним 2019/08/19 16:39:29  №1456458 353
Подскажите как можно реализовать такую логику 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)
Но, видимо из-за того, что токены различаются, оно создает новую запись вместо обновления старой. Спасибо
Ответы: >>1456485 >>1457174
Аноним 2019/08/19 16:45:24  №1456472 354
>>1456452
не могу,потому что не понимаю
Ответы: >>1456953
Аноним 2019/08/19 16:51:23  №1456485 355
>>1456458
Появилась идея. При создании линковоной таблицы создаются пустые записы под слинковую колонку? Просто сам объект пользователя сохраняется в другой таблице. Если слинковать и создать шаблонные записи под каждого созданного пользователя и создавать новые при создании новой записи пользователя и использовать UPDATE
Аноним 2019/08/19 17:50:58  №1456579 356
>>1456201
Этот вопрос уже 100500 раз обсосан. Это тебе в твоём манямирке на 2 с половиной юзера и полтора формошлёпа всё заебись, можешь хоть каждый день всё на новый язык переписать. А когда у тебя 50 разработчиков и кодовая база в несколько десятков тысяч строк, то ты каждый раз будешь думать, тащить ли новую технологию или сделать на старой. Потому что любой новый стек, это разработчики, которые должны уметь на этом кодить, девопсы, которые должны уметь это поддерживать, ещё одна экосистема, от которой ты зависишь и так далее. Для тебя это может быть пустой звук - но для бизнеса - нет, и дописать лишнюю точку входа в существующий монолит (или не совсем монолит, не суть) оказывается проще, чем тащить что-то новое.
Поэтому пхп не ван лав, просто нужно оценивать риски и профит. Та же нода - норм, но это если у тебя есть минимум 2 девелопера и 2 девопса, чтобы это готовить. И задача подходящая.
Во всех прочих случаях отдельный гейтвей для сокетов и обычный бекенд за ним решает 99% проблем, не принося новых.
А на пет проектах я сам на чём только не пишу.

>>1456316
У текущей компании много продуктов, в большинстве бекенд написан на php. В основном, всякие сервисы по работе с хостингом, доменами и прочими сертификатами. Но я - выходец с аутсорса и работал в том числе над сайтами для компаний из fortune-500 (в-основном интранеты, интернет-магазины, прочие веб-приложени). Почти везде и почти всегда связка cron + php решала все проблемы и мне не приходилось изобретать велосипеды.
Ответы: >>1456630 >>1456711
Аноним 2019/08/19 18:54:36  №1456630 357
>>1456579
>Почти везде и почти всегда связка cron + php решала все проблемы
Я наверное не понял тебя сначала извини. Думал ты как раз расскажешь про те задачи что не решить этой связкой
Ответы: >>1456671
Аноним 2019/08/19 19:42:22  №1456671 358
>>1456630
А. Классическая задача - это запускать что-то раз в 10-15 секунд, кроном принципиально не решается.
Из реальных задач - у меня была задача максимально ускорить доставку писем клиентам (они содержали подтверждение платежей). Крон, который рассылал письма клиентам из очереди раз в минуту бизнес не устраивал. Решается такое как раз набором демонов, вычитывающих всё из очереди в тот же момент, когда оно туда попадает.
Ещё, у меня была задача подгружать много данных из разных источников, компоновать их, и возвращать в едином списке. Понятно, что кэшировалось, но изначально-то это была композиция ассинхронных запросов. Решал через по тем временам модный Gearman.
С сокетами тоже была задача, как раз нужно было слать пуши на девайс и обратно, причём быстро. Вообще на php есть Ratchet, который вроде как умеет в сокеты, но я тогда (уже не помню, по какой причине) написал простенький прокси на socket.io, который умел принимать http-запросы из php и пересылать их на девайс, принимать запросы с девайса и пинать php по http. Тут могла бы быть проблема в случае добавления новых нод (потому что пришлось бы как-то узнавать, к какому из инстансов ноды прицеплен конкретный пользователь), но там трафика было достаточно мало, чтобы этим пока что не заморачиваться. Если бы понадобилось, то, наверное, хранил бы в каком-нибудь хранилище (редисе, к примеру) связку пользователь-девайс-нода.
Ответы: >>1456760
Аноним 2019/08/19 21:00:28  №1456709 359
>>1456283
codewars. Там вроде уже есть клан двачеров, но лучше не вступай туда.
Аноним 2019/08/19 21:03:22  №1456711 360
>>1456579
>Этот вопрос уже 100500 раз обсосан
Только не рвись, дружок.
Аноним 2019/08/19 23:00:36  №1456733 361
У меня небольшой вопрос twig и slim. Делаю сайт, на каждой странице сайта нужно выводить список категорий из бд. Я поместил код получения из бд в middleware и там же добавляю массив категорий как сервис twig, чтобы каждый раз не писать это в контроллерах. Все правильно делаю? Мне кажется, что это сложное решение, и можно как-то проще сделать...
Ответы: >>1456747 >>1456917
Аноним 2019/08/20 01:42:22  №1456747 362
>>1456733
в контроллере собирай массив и передавай во вью
Ответы: >>1456785
Аноним 2019/08/20 04:08:13  №1456760 363
>>1456671
Интересно. Спасибо
Аноним 2019/08/20 06:22:01  №1456785 364
>>1456747
А если у меня 100 вью, то каждый раз в ручную передавать?
Ответы: >>1456918 >>1457051
Аноним 2019/08/20 08:50:23  №1456817 365
Анонче, помоги с апачем. Делаю автоматические поддомены.

Сейчас мой 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 править
Ответы: >>1456876 >>1456914
Аноним 2019/08/20 11:58:30  №1456876 366
>>1456817
Тысячу лет не имел дел с апачем, но вообще поддомен выглядит, как отдельный виртуальный хост. Может, там можно плейсхолдер херануть, чтобы у тебя, к примеру, было два виртуальных хоста, *.domain.com и domain.com
Аноним 2019/08/20 12:56:58  №1456914 367
>>1456817

А ты не хочешь просто смотреть оригинальный домен в $_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" есть на этой же странице выше.
Аноним 2019/08/20 13:10:51  №1456917 368
>>1456733

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

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

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

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

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

...

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

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

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



И да, названия у меня ужасные, придумай что-нибудь получше.
Ответы: >>1456997
Аноним 2019/08/20 13:13:06  №1456918 369
>>1456785

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

$viewData = addCommonViewData($app, $viewData);
Аноним 2019/08/20 14:46:32  №1456953 370
>>1456472
Декомпозируй задачу
Аноним 2019/08/20 15:36:27  №1456997 371
>>1456917
Спасибо большое! У меня теперь ещё один вопрос последний: ещё в middleware я ограничиваю доступ неавторизованных пользователей к некоторым разделам сайта. Это правильно, или фильтрацию надо в другом месте делать?
Ответы: >>1457174
Аноним 2019/08/20 16:41:13  №1457051 372
>>1456785
Ты создай контроллер а остальных наследуй от него
Аноним 2019/08/20 19:48:59  №1457174 373
>>1456997

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

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

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

>>1456458

А тебя не устраивает вариант с 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) отсюда и такое поведение.
Аноним 2019/08/20 19:50:07  №1457176 374
>>1456283

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

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

>>1456376

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

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

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

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

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

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

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

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

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

>>1456004

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