Задать вопрос
Ответы пользователя по тегу PHP
  • Защита сессии от воровства?

    copist
    @copist
    Empower people to give
    Обычно в куках хранится идентификатор сессии с ключом вида PHPSESSID
    Но можно сделать так, чтобы само имя куки было менее предсказуемым, например md5(идентификатор-сервиса)
    Ответ написан
    3 комментария
  • Как получить реальный опыт разработки без устройства в штат?

    copist
    @copist
    Empower people to give
    Соглашусь с Владислав Копылов
    Набить портфолио тестовыми заданиям - вариант хороший
    Во-первых - сделаешь сам. Может быть даже расскажут в чём косяки, если не понравится. Может быть даже дадут второй шанс на решение, если показать интерес и настоять.

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

    А вообще работодатель ожидает, что кандидат придёт с каким-нибудь набором практических навыков, а не с книжными знаниями. И, бывает, приходят и с отсутствием даже теории - "пусть меня научат". Работодателю нужно, чтобы ты выполнял работу, а не учился её выполнять. Есть компании, которые вкладываются в стажировку новичков и в обучение уже устроенных сотрудников, но при трудоустройстве смотрят именно на то, что уже умеешь делать и как интенсивно ты обучаешься самостоятельно.

    Пиши свой личный учебный проект, ищи союзников для написания мини-проекта в команде, участвуй в OpenSorce проектах
    Ответ написан
    Комментировать
  • Можно ли написать балансировщик на PHP?

    copist
    @copist
    Empower people to give
    Я правильно понимаю, что вы планируете использовать несколько серверов с приложениями на PHP для upload файлов?

    В этом случае балансировка для POST запросов аналогичная той же, как и для GET запросов, но каждый из серверов будет сохранять файлы в своей временной директории для загруженных файлов. Если пользователю вернуть URL на такой файл, то может случиться ошибка при отображении файла, когда при повторном прохождении через балансировщик будет выбран другой сервер.

    Три варианта решения:
    1. Возвращать пользователю ссылку на конкретный файловый сервер, чтобы раздавать обратно в обход балансировщика
    2. Использовать центральное сетевое файловое хранилище, чтобы раздавать файлы с него
    3. Использовать распределённое облачное хранилище, возможно с использованием CDN

    Немного шевелящихся картинок :) https://www.dropbox.com/s/eiwhngo66fzq6hi/shared_u...
    Ответ написан
    Комментировать
  • Как наработать портфолио php программисту и стартовать в профессии?

    copist
    @copist
    Empower people to give
    Про веб-портфолио, в том числе для новичков copist.ru/blog/2016/02/19/web-portfolio
    Про учебные проекты copist.ru/blog/2016/02/11/pet-project-ideas
    Ответ написан
    Комментировать
  • Редирект без передачи REFERER?

    copist
    @copist
    Empower people to give
    1. проксирование с помощью proxy_pass в nginx с подавлением заголовка HTTP_REFERRER
    2. запрос целевой страницы через с помощью curl/file_get_contents в PHP без указания HTTP_REFERRER
    Ответ написан
    Комментировать
  • Какие туториалы можно почитать о создании социального сервиса?

    copist
    @copist
    Empower people to give
    Можно взять и изучить социальные сервисы OpenSource на базе фреймворков, например https://www.humhub.org/en на базе Yii2 или https://elgg.org/ который сам по себе, на компонентной основе.

    Для себя надо найти ответ на вопрос: Чем простой сервис типа блога отличается от социального сервиса?

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

    Вот несколько отличий в формате утверждений "User Story":
    1. Как пользователь соц сервиса (далее ПСС для краткости, тут ограничение на длину ответа) я хочу публиковать свои записи и фотографии (далее КОНТЕНТ)
    2. Как ПСС я хочу изменять или удалять свой КОНТЕНТ
    3. Как ПСС я хочу, чтобы другие не могли менять свой КОНТЕНТ
    4. Как ПСС я хочу читать КОНТЕНТ других отдельных ПСС
    5. Как ПСС я хочу добавить в избранное (like, fork, pin, retwit, repost) КОНТЕНТ других отдельных ПСС с возможностью добавления своего описания или изменения оригинального, но с сохранением ссылки на оригинальную запись/фото
    6. Как ПСС я хочу добавить другого ПСС в избранное (friend, follow, watch)
    7. Как ПСС я хочу видеть список всех других ПСС, которых *я* куда то там навыбирал в п.6
    8. Как ПСС я хочу видеть список всех других ПСС, которые *меня* куда-то там навыбирали в п.6
    9. Как ПСС я хочу отправить сообщение другому ПСС
    10. Как ПСС я хочу видеть сообщения других ПСС, желательно instant, то есть в реальном времени
    11. Как ПСС я хочу комментировать свой и чужой КОНТЕНТ
    12. Как ПСС я хочу видеть напоминания о полученных сообщениях от других ПСС, которые я не получил в реальном времени (например, дайджест комментариев по электронной почте), а также о том, что кто-то меня зафрендил или лайкнул мой КОНТЕНТ, или прокомментировал мой КОНТЕНТ, или упомянул меня в комментариях где-либо
    13. Как ПСС я хочу запретить комментирование своего КОНТЕНТа другими ПСС
    14. Как ПСС я хочу создать сообщество по интересам (социальная группа, далее СГ) и стать её владельцем
    14. Как владелец СГ, я хочу пригласить других друзей (см п.6) и других пользователей (см. п.9) в СГ
    15. Как владелей СГ я хочу дать или забрать права модератора в СГ любому ПСС
    16. Как владелей СГ я хочу передать владение СГ любому другому ПСС
    17. Как ПСС я хочу видеть списки СГ и вступить (join, follow) в них, искать группы по заданным правилам, например, по ключевым интересам или хотя бы по названию
    18. Как владелей СГ я хочу сам исключить СГ из общих списков групп (скрытые группы)
    19. Как владелей СГ я хочу иметь возможность одобрять включение ПСС в СГ (приватные группы с ограничением на вступление)
    20. Как участник СГ я хочу публиковать свои записи и фотографии (далее КОНТЕНТ) в СГ
    21. Как модератор СГ я хочу менять/удалять записи участников СГ, опубликованные в СГ
    22. Как ПСС я хочу пожаловаться на другого ПСС или отдельный КОНТЕНТ
    23. Как глобальный модератор сервиса я хочу видеть жалобы от ПСС
    24. Как глобальный модератор сервиса я хочу забанить/разбанить любого ПСС
    25. Как глобальный модератор сервиса я хочу видеть КОНТЕНТ любого ПСС без ограничений
    26. Как глобальный модератор сервиса я хочу видеть все СГ без ограничений
    27. Как глобальный модератор сервиса я хочу отправить сообщение любому ПСС без ограничений

    Дейтинг, как во вКонтакте, и карму, как в Хабре, я не стал упоминать.

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

    За кадром остаётся финансовый вопрос: как обеспечить стабильный доход для поддержания работы соц сервиса.

    Надеюсь, ответ поможет составить картину мира социальных сетей :)
    Ответ написан
    3 комментария
  • Как переслать полученные СМС автоматически на указанные номера в сообщения?

    copist
    @copist
    Empower people to give
    Через SMS гейты (в гугле "HTTP SMS gate")

    Например, smsglobal.com/http-api/#Sending_a_SMS
    curl "http://www.smsglobal.com/http-api.php?action=sendsms&user=<логин>&password=<пароль>&from=<номер_от_кого>&to=<номер_кому>&text=<текст SMS сообщения>"

    curl "http://www.smsglobal.com/http-api.php?action=sendsms&user=testuser&password=secret&&from=Test&to=61447100250&text=Hello%20world"


    Update: Я дал ответ, но он неправильный. Я думал речь про отправку SMS в ответ на сообщение с сайта. Типа обратный звонок. Если нужно автоматически обработать SMS, то нужно использовать программу, которая будет работать непосредственно с телефоном, подключенным через порт USB.

    Читать из телефона приходящие SMS, анализировать текст и выполнять отправку через тот же телефон или через сторонние сервисы.

    Старая статья про утилиту gnokii для работы с телефоном:
    www.nixp.ru/articles/80.html
    https://www.opennet.ru/tips/2510_gnokii_sms_gatewa...

    Дальше я бессилен. Этот уровень сна мне неподвластен.
    Ответ написан
    2 комментария
  • Как узнать какой именно php скрипт приводит к ошибке или работает медленно?

    copist
    @copist
    Empower people to give
    Если есть возможность, замените Apache на PHP FPM SAPI, прилагающийся к PHP. При этом можно включить PHP slow log. В специальном логе будут появляться стек-трейсы процессов, которые работали больше заданного количества секунд именно в этот самый момент, то есть например, в 30ую секунду от запуска процесса.

    В случае проблем рекомендуется делать slow log на все запросы, которые работают больше 1-2 секунд. Возможно дьявол кроется не в длинных процессах, а в огромном количестве мелких.

    Также к PHP FPM прилагается встроенная система мониторинга. Можно посмотреть, сколько сейчас порождено процессов. Иногда их чрезвычайно много.

    Если заменить Apache на PHP FPM невозможно, то путь исследования более длинный: нужно в настройках Apache настроить CustomLog с замером времени на выполнение. см. ответ на serverfault. Затем исследовать логи (там будут только URL запросов, без стрек-трейсов) и самостоятельно определять, что именно могло вызвать тормоза.

    Можно подключить профилировщики XDebug + Webgrind или XHprof. Замеры можно делать на выборочных запросах, например только для пользователя с определённого IP или при наличии определённой куки. Отчёты будут очень детальные и будут включать замеры по всем внутренним вызовам от начала до завершения процесса, а не только в 30ую секунду, как делает php slow log.
    Ответ написан
    Комментировать
  • Как правильно передать заголовки в curl?

    copist
    @copist
    Empower people to give
    $headers = array("Authorization: Bearer <ACCESS_TOKEN>",
                     "Content-Type: application/json");
    
    $ch = curl_init('https://api.dropboxapi.com/2/users/get_space_usage');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "null");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    
    curl_close($ch);
    echo $response;


    Скопировал из stackoverflow и проверил. Вернуло:
    {"used": 5195012629, "allocation": {".tag": "individual", "allocated": 5771362304}}


    Если указать неверный токен, то будет такая ошибка:
    Error in call to API function "users/get_space_usage": The given OAuth 2 access token is malformed.
    Ответ написан
  • Чем связать php и java?

    copist
    @copist
    Empower people to give
    Ответ написан
    Комментировать
  • Как узнать количество строк в массиве?

    copist
    @copist
    Empower people to give
    Ответ написан
    Комментировать
  • Где можно почитать теорию по cерверной разработке для "чайников"?

    copist
    @copist
    Empower people to give
    Всё сказанное ниже является личным мнением. Все глаголы в повелительном наклонении ("дайте, объясните") предлагаю считать сослагательным наклонением ("возможно, было бы правильным дать, объяснить").

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

    Критериями для приёмки на стажировку должны быть знание синтаксиса и семантики языка, стыка технологий (PHP + JS например), эрудиция, способность понять задание, обосновать решение, сформулировать какую-то личную неразрешимую проблему для поиска помощи, попытаться самостоятельно найти, понять и применить чужое решение. Ещё один фактор для оценки - знания в предметной области, то есть в той области деятельности человека, которая, в контексте информационных технологий, подлежит автоматизации. Бывает человек лучше "въезжает" в предметную область, чем в язык. Что тоже неплохо.

    Если у кандидатов значительный пробел в знаниях - откажите в стажировке с указанием причины. Может быть, он подучит и придёт ещё раз. Если пробелы незначительные - зафиксируйте их.
    Через некоторое время зафиксируйте динамику - насколько хорошо каждый из них закрыл свои пробелы в знаниях, чему научился. Если динамика недостаточная - примите решение о прекращении стажировки или работы.

    Отсеивайте тех, кто не хочет знать, а не тех, кто не смог. Те, кто хотят - узнают не завтра, так через неделю.
    Ответ написан
    3 комментария
  • Какую книгу/ресурс по изучению PHP посоветуете?

    copist
    @copist
    Empower people to give
    Книги бывают разные, но перед тем как их читать, надо бы уже чуть-чуть написать чего-нибудь своего, страшненького, костыльного. Запрограммируй любую идею с любым качеством кода, в любом стиле программирования.

    Начни с


    Постепенно кода станет больше, будешь думать - как его организовать. Вот тут то и книжки пригодятся.
    Ответ написан
    Комментировать
  • Как верно пользоваться preg_match_all?

    copist
    @copist
    Empower people to give
    Не стоит пользоваться регулярками для разборка семантических данных. HTML надо разбирать как подвид XML. Есть несколько библиотек, штатных и дополнительных, которые исправляют невалидный HTML и делать удобные запросы по данным

    Несколько ссылок по этой теме
    Ответ написан
  • Почему не прогружается полностью страница nginx+php-fpm?

    copist
    @copist
    Empower people to give
    nginx работает под одним пользователем, а php-fpm под другим.
    Настройте так, чтобы они работали из-под одинакового пользователя, либо включите одного из них в группу другого.

    Проверьте права на папки кэша и прокси данных
    ls -la /var/lib/nginx/cache /var/lib/nginx/proxy
    Дайте права на чтение/запись в эти папки для php-fpm и nginx
    Ответ написан
    Комментировать
  • Отправка формы посредством AJAX и PHP?

    copist
    @copist
    Empower people to give
    1. зачем <button> ? если не требуется сложное оформление (button разрешает использовать html для надписи, например <button><h1>Send me</h1></button>) то можно простой <input type="submit">
    2. привязать функцию-обработчик на submit формы, а не на click кнопки
    3. сериализовать форму, а не кнопку
    4. при отправке письма лучше указывать ReplyTo, чтобы можно было ответить сразу пользователю

    Исправленный gist с указаниями всех замечаний https://gist.github.com/pvolyntsev/b1ce3d17c5fad20bffe3
    Ответ написан
    1 комментарий
  • Как создать div ,который при его напсании в разметку вставлял определенный код?

    copist
    @copist
    Empower people to give
    Нужно прицепить к странице таблицу стилей и javascript, который создаст на странице скрытую форму диалога и покажет этот диалог по клику на элементы с определённым классом, то есть на ссылку, кнопку или даже картинку.

    Пример реализации без jQuery codepen.io/copist/full/vLNEqP
    Вёрстка ногой
    Стилизация топором по камню
    Отправка формы не работает

    Зато Javascript примитивный, очень простой
    Ответ написан
    Комментировать
  • Поможете наставить на верный путь начинающего программиста?

    copist
    @copist
    Empower people to give
    • прежде чем писать, надо читать
    • прежде чем читать «Чистый код», надо научиться писать грязный неуклюжий код
    • прежде чем правильно проектировать большие программные системы, надо неправильно спроектировать свою маленькую программу
    Read more
    Ответ написан
    Комментировать
  • Какие есть неписаные правила организации верстки?

    copist
    @copist
    Empower people to give
    Базовые принципы вёрстки
    copist.ru/blog/2015/08/29/web-layout-basics
    Ответ написан
    Комментировать
  • Код внутри. Как засунуть include в переменную?

    copist
    @copist
    Empower people to give
    Вариант 1.
    <? $siteMenu = include($_SERVER['DOCUMENT_ROOT'].'/core/modules/menu.php'); ?>

    содержимое файла menu.php должно быть таким
    <?php
    return array(
        "пункт меню 1",
        "пункт меню 2",
        "пункт меню 3",
    );


    Вариант 2.
    <?php
    function getMenu()
    {
      ob_start();
      include $_SERVER['DOCUMENT_ROOT'].'/core/modules/menu.php';
      return ob_get_clean();
    }
    
    $siteMenu = getMenu();

    содержимое файла menu.php должно быть таким
    <ul><li>пункт меню 1</li><li>пункт меню 2</li><li>пункт меню 3</li></ul>
    Ответ написан
    4 комментария