Ответы пользователя по тегу PHP
  • Добавляем CSS в echo?

    Mendel
    @Mendel
    PHP-developer
    Не делайте так.
    Почитайте лучше про https://ru.wikipedia.org/wiki/MVC
    Ну а в целом альтернативный синтаксис как у Alexander Pushkarev в шаблоне будет правильнее.
    Но все равно начните с того что осознайте что оно вам в принципе не нужно.
    Ответ написан
    Комментировать
  • Расположение iframe, появляется случайным образом?

    Mendel
    @Mendel
    PHP-developer
    Посмотрите на даты изменения файлов. Далеко не все вирусы за собой это подчищают.
    Ответ написан
    1 комментарий
  • Двухсторонний шаблонизатор?

    Mendel
    @Mendel
    PHP-developer
    Сейчас плотно курим такой подход:
    Вьювы с помощью простых классов генерируют простой хтмл через ДОМ.
    Этот код не содержит оформления, а только контент, более менее семантично оформленный.
    Для оформления используется CSS и JS
    Я знаю что все так делают, но я имею ввиду ВСЁ оформление выносить туда.
    Примерно вот так:
    jsfiddle.net/x8mmC/

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

    Всё вышеописаное в принципе у нас работает, хоть и не до конца отлажено.
    Но вот что еще хочется сделать — по аяксу отдавать не новую страницу, а ее разницу в сравнении с текущей.
    т.е. некий DOMdiff или в виде jquery (как стиль в примере) или в более сжатом виде — не важно.
    НО пока до этого не доходят руки. Надо для начала формализовать первую часть, переписать все классы на чистовик и т.п.
    Ответ написан
  • Как у вас реализовано чпу?

    Mendel
    @Mendel
    PHP-developer
    А зачем вообще ЧПУ?
    ЧПУ это наследие стареньких движков.
    Решение должно быть изначально в архитектуре.
    т.е. ЧПУ как правило подразумевает, что у нас есть некая карта, а потом мы делаем ее более красивой…
    Мы все равно будем делать те или иные запросы в базу, так почему бы и не искать эту информацию по ключу в виде полноценного пути?
    Должная оптимизация с лихвой покроет издержки от того, что мы ищем по более длинному чем числовой индексу.
    Теоретически и тут можно оптимизировать но на практике лично я до этого не дошел.
    Была мысль использовать не сам путь а md5 от него, а если и это будет недостаточно быстро, то урезать его до bigint или даже до int ведь md5 это всего 16 байт, а при конфликте хэша мы просто получим две страницы вместо одной, и выберем перед выводом нужную…
    Хотя при разумном количестве страниц конфликты маловероятны даже для обычного int.

    Но на практике наши задержки или слишком малы, или таких запросов просто непомерно много, а если их много, то они у нас и так будут закрыты кэшем, так стоит ли о них беспокоиться?
    Ответ написан
  • set_time_limit не работает, скрипт отрабатывает бесконечно долго

    Mendel
    @Mendel
    PHP-developer
    Отделите мух от котлет.
    Сделайте тест, в котором будет только сет_тайм_лимит и бесконечный цикл, т.е. в две строки.
    Так вы локализуете проблему — это с вашим окружением или с кодом.
    Ответ написан
    Комментировать
  • Вызов хранимой процедуры php PDO, firebird?

    Mendel
    @Mendel
    PHP-developer
    Всё указывает на то, что ошибка здесь:
    $sql="CALL P_NAME_ID (?,?,?,?)";
    

    Я не знаю firebird, так что не подскажу дальше. Но глаз режет отсутствие точки с запятой. По идее она не обязательная но…

    PS: на вскидку гугл мне не выдал ничего про
    зато выдал про
    CALL P_NAME_ID
    

    EXECUTE PROCEDURE
    

    Уверенны в синтаксисе?
    Прямое выполнение инструкции в консоли ошибку не выдает?
    Ответ написан
    3 комментария
  • Кто может объяснить, зачем мне GIT?

    Mendel
    @Mendel
    PHP-developer
    Управление историей. Нетбинс любит терять историю, реально рассчитывать на нее нет смысла. А тут это основа.
    Ветвление и слияние. Когда нужно делать большое изменение, а система уже в продакшене, и ты вынужден ее поддерживать, то сделать ветку, и править на ней, а потом объединить ветки, да так чтобы не затереть изменения в обеих — почти невозможно когда нет системы управления версиями.
    Совместная работа. Пропадает всякий бред типа в аське писать мол не трогай такой-то файл, я его правлю…
    Сотни мелких коммитов с описаниями. Т.е. делаешь изменения, и сразу описываешь, и сразу видно в каких файлах это было и когда… Помогает в расследованиях, в документировании.
    Возможность контролировать «что изменилось». Анекдотичный случай — я как-то в четыре часа ночи решил переименовать в одном классе модели поле desc на _text. Оно фигурировала в нескольких сотнях классов, поэтому я использовал поиск и замену. Полуручную.

    Через месяц у меня выплыл глюк с сортировкой данных. Оказывается при поиске я случайно заменил desc в запросах в ORM. Был бы тогда GIT да получше покрытие тестами — не пришлось бы два часа искать причину. Я бы увидел, что у меня есть изменение в таком-то файле, а оно там неуместно…

    Причин много может быть. Но возможно просто ваши объемы сложности еще не требуют от вас таких решений.
    Ответ написан
    2 комментария
  • PHP Cluster и файлы сессий на общем файловом хранилище. Возникают бесконечные блокировки?

    Mendel
    @Mendel
    PHP-developer
    Не хочется говорить банальные вещи, но ИМХО необходимость блокировки сессий и при этом отказ от привязки ip пользователя к конкретному серверу это признак ошибки в архитектуре.

    Подумайте, возможно стоит часть данных из сессии вынести в базу? Ту самую часть, которая так критична к блокировкам.

    Вообще странно, что при такой нагрузке у вас возникают проблемы. Каково количество сессий в момент блокировки?

    Как вы работаете с сессиями? Стандартный обработчик, или таки что-то свое в session_set_save_handler, но тоже работающее с файлами?

    Есть стойкое ощущение, что сессия по каким-то причинам не освобождается. Может быть поможет register_shutdown_function('session_write_close'); Хотя я так и не понял из документации какой в этом смысл, но зачем-то session_register_shutdown было придумано…

    Еще я бы на вашем месте покурил www.php.net/manual/ru/function.session-write-close.php, а точнее комментарии к ней. ИМХО там описано пару кейсов которые могут оказаться вашими.

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

    Попробуйте в session_set_save_handler сделать логирование открытий/закрытий, уничтожений вызовов мусорщика и т.п. Может быть это даст вам ключ к пониманию проблемы.

    В любом случае я бы вам советовал уходить в базу. Это более масштабируемо, управляемо и т.п. Я конечно понимаю, что транзакции в сессиях это перебор, но мы пока так и не увидели ваш кейс, может быть когда будут детали удастся что-то лучше придумать.
    Ответ написан
    2 комментария
  • Как получить содержательную часть страницы?

    Mendel
    @Mendel
    PHP-developer
    Вот здесь я использовал для этих целей два алгоритма — добавить всё это уже описанныйе варианты отбора чистого текста. Отфильтровать тут было чуть умнее — все i, strong, h1 и т.п. заменял на b.
    Все p, span, div и т.п. заменял на разделитель какой-то (не помню уже). Все незначащие теги типа head img и т.п. удалял.

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

    Если кому будет интересен мой говнокод шестилетней давности (а он 99% что дикий был), то могу дать в личку. Но лучше воспроизведите алгоритм сами. Будет адекватнее :)
    Ответ написан
    Комментировать
  • stream_socket_server — не работают http_headers

    Mendel
    @Mendel Автор вопроса
    PHP-developer
    Подсказали на другом форуме:
    fwrite($client,  "200 OK HTTP/1.1\r\n" 
    

    Замени на
    fwrite($client,  "HTTP/1.1 200 OK\r\n"  
    

    Забавно оказалось.
    Ответ написан
    Комментировать
  • Почему не работает изменение upload_max_filesize?

    Mendel
    @Mendel
    PHP-developer
    Я варвар, я в таких случаях сервак перегружаю. Или как минимум httpd
    Ответ написан
    Комментировать
  • Неожиданно правильное поведение программ

    Mendel
    @Mendel Автор вопроса
    PHP-developer
    Ну и да, раз уж ушли от темы «неожиданно ПРАВИЛЬНОЕ», в сторону просто ошибок, то вот еще пример:
    в 2006 году, когда под пхп5 уже начинал писать, но еще так, чтобы пхп4 работал…
    Писал библиотеку авторизации.
    И мучали меня сомнения… но так и не придумал почему мне все-таки не использовать $_REQUEST вместо $_GET + $_COOKIE.
    Не придумал. Написал.
    Сейчас библиотека сдохла. Почему? Оказывается в 5.3 появилась request_order.
    ====
    Вот здесь как раз я признаю нарушение самого главного правила разработки: «Слушай свою жопу. Если она говорит не делай — не делай». А все остальное — общие слова. :)
    Ответ написан
    Комментировать
  • Описание переменных используемых в шаблоне

    Mendel
    @Mendel
    PHP-developer
    Скажу по собственному опыту — когда берешь собственный код который ты несколько лет не видел, то иногда при плохой комментируемости проще переписать заново :)
    Конечно с ростом профессионализма код становится все более читабельным, но мое скромное мнение — описание должно быть всегда. Тем более что часто из одного названия переменной не всегда можно понять что она означает. Умолчания у всех людей разные.
    Ответ написан