Ответы пользователя по тегу PHP
  • Почему если источник при парсинге не работает, то сайт тоже не работает?

    @neol
    Потому что default_socket_timeout в PHP равен 60 (секундам), а максимальное время выполнения file_get_contents зависит от этого параметра. Соответственно если сайт, с которого вы дёргаете информацию, лежит, то запросы к вашему сайту возвращают ответ только после истечения этого таймаута.

    Любой PHP код, взаимодействующий с сетью, желательно выносить в задачи, выполняемые через cli по cron (хотя не всегда это возможно, например при авторизации через сторонний сервис), а на сайт выводить кешированые результаты. При этом стоит делать проверки, что этот код не запустится 100500 раз.

    Плюс к этому у вас нет проверок, что file_get_contents и simplexml_load_string возвращают корректный результат.
    Ответ написан
    Комментировать
  • Как организовать работу нескольких серверов?

    @neol
    Видимо вам нужен KVM переключатель
    Ответ написан
    Комментировать
  • Как регулировать глубину рекурсии?

    @neol
    Глубина рекурсии ограничена размером стека. Слегка (до 16384) поднять можно через ulimit -s, Если нужно больше - прописав в /etc/security/limits.conf (путь верен для Debian и производных, в других дистрибутивов может отличаться) что-то типа:

    * - stack 65535
    Ответ написан
    Комментировать
  • Как ускорить php скрипт?

    @neol
    $handle = fopen($dir . $minus, 'r');
    while (($res = fgets($handle)) != FALSE) {
        if ($res != 0) {
            $array_minus[trim($res)] = true; // <- this
        } else {
            break;
        }
    }
    fclose($handle);
    // сравнение
    foreach ($array_source as $value) {
        if (!isset($array_minus[$value])) { // <- this
            $array_result[] = $value;
        }
    }
    
    file_put_contents("result.txt", implode(PHP_EOL, $array_result));

    Две важные строки помечены комментариями.
    На двух файлах по 150к строк у меня отработало за 0.333s

    PS array_diff, предложенный Денис Акимкин, значительно лучше по читабельности при сравнимой производительности, так что лучше использовать его.
    Ответ написан
    3 комментария
  • Как провести анализ дубликатов кода?

    @neol
    Ответ написан
    Комментировать
  • Зачем prepared statements? Почему не экранирование?

    @neol
    Потому что экранирование можно забыть (а если что-то возможно, то это рано или поздно произойдёт).
    С prepared statements такой проблемы нет.

    PS Забудьте про mysql_real_escape_string, его больше нет. И вообще всех функций mysql_* больше нет.
    Ответ написан
    4 комментария
  • Что не так с кодировкой?

    @neol
    По умолчанию сервер mysql использует кодировку latin1.
    Если я ничего не путаю, то пришедший от вас запрос в utf8 конвертируется в latin1, а затем получившаяся абракадабра (нормально utf8 в latin1 не конвертируется) конвертируется опять в utf8. На выходе получается фигня.

    Добавление в my.cnf
    collation-server = utf8_general_ci
    character-set-server = utf8

    с последующим перезапуском mysql по идее должно решить проблему.

    Ну или можно добавить в тот же my.cnf
    init-connect = "SET NAMES 'utf8' COLLATE 'utf8_general_ci'"


    Но вообще стоит оставить приведённую вами строчку. Нагрузкой с такого запроса можно смело пренебречь, а переносимость кода будет чуть выше.
    Ответ написан
  • Можно ли взломать черз POST?

    @neol
    Конкретно в этом примере вполне вероятно получить отказ в обслуживании на первом школьнике, решившем просканировать сайт с помощью nessus. Но даже если до этого не дойдет ( в смысле до отказа в обслуживании, школьники-то не заставят себя долго ждать), то получится пустая трата ресурсов на обработку соединений и со стороны данного приложения, и со стороны blabla.com. Вряд ли это можно назвать страшной уязвимостью, но код явно попахивает чем-то неприятным.
    Ответ написан
    Комментировать
  • Какая настройка может открыть доступ к редактированию на сервере?

    @neol
    Вангую, что у вас используется apache с mpm-prefork, который работает от пользователя www-data/httpd/nobody, а файлики залиты по фтп под другим пользователем с правами 644 (755 для директорий), соответственно php, запущенный из-под apache не может в них писать.

    Если сайт на vps будет только один, то можно поменять в конфиге apache параметры User и Group на вашего пользователя, но при этом может отвалиться какой-нибудь phpmyadmin, установленный через пакетный менеджер вашего дистрибутива.

    Ну или поменять права, как насоветовали выше.
    Ответ написан
  • Как не уронить сайт запуская громадный скрипт в кроне?

    @neol
    LA 3.5 при 8 ядрах не выглядит поводом для недоступности сайта.
    Может проблема в блокировке таблицы на время обновления БД?
    Ответ написан
  • Загрузка и настройка видео средствами PHP?

    @neol
    Заливайте на youtube или vimeo, они там сами разберутся. Либо меняйте хостинг. Без установки дополнительного софта ваша затея не выгорит.
    Ответ написан
    Комментировать
  • Стоит ли исправлять предупреждения интерпретатора PHP?

    @neol
    Конкретный случай из недавней практики: страница периодически генерировалась на 4 секунды дольше, чем могла бы, потому что кто-то когда-то забил на предупреждение. Естественно за этим предупреждением стояла ошибка в логике. ИЧСХ, за предупреждением почти всегда стоит ошибка в логике или кучка неиспользуемого кода.

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

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

    Больше приходится писать код, меньше сил остаётся на разработку.

    Время, которое вы потратите на устранение предупреждений, с лихвой окупится при поиске и устранении ошибок.
    Ответ написан
    4 комментария
  • Сложение чисел PHP?

    @neol
    Если нужно получить число в виде строки длиной 6 символов, то как-то так
    $result = sprintf("%'.06d", 000000+000001);
    Ответ написан
    2 комментария
  • Как установить php-curl для php 5.5.19?

    Комментировать
  • Проблемы с mail(), что делать?

    @neol
    Если это тестовый сервер или почты отсылаться будет очень мало, попробуйте ssmtp в качестве MTA.
    Он пересылает почту через внешний почтовый сервис. Весь конфиг занимает строчек 5.
    Ответ написан
  • Вирус на Debian сервере?

    @neol
    Да постоянно такое на сайтах с необновляемыми движками. Скорее всего у вас там просто знатная дырень в коде. Ну или сперли пароли FTP, но это менее вероятно.
    Вырубайте сайт (или ограничьте доступ к нему по IP), меняйте все пароли (включая админку и базу данных), удаляйте левый код (хотя лучше все-же переустановить заново по возможности), ставьте все обновления, потом включайте обратно.

    По поводу DDoS: ищите странные процессы, запущенные от имени www-data или пользователей сайта (смотря как у вас все настроено).
    Такие штуки любят прописываться в крон и прицеплять левые библиотеки через LD_PRELOAD к каким-нибудь безобидным утилиткам (мне попадались на /usr/bin/host).
    В принципе атака может прямо из скрипта идти, тогда в статусе апача будет виден долгоживущий процесс.
    Ответ написан
    1 комментарий
  • Почему браузер удаляет куку привязанную к сессии раньше времени?

    @neol
    Это не браузер, это PHP.
    Поправьте значение session.gc_maxlifetime
    Ответ написан
  • Почему функция mail (php) может нормально отправить сообщение на один адрес, и не отправляет на другой?

    @neol
    Скорее всего почтовый сервер хостинга считает, что почта предназначена ему. Возможно в панели управления можно отключить обработку почты. Так же стоит посмотреть что там с DNS (если используется не DNS'ки хостера) и либо указать, что зона обслуживается другим сервером, либо прописать верные MX записи.

    В поддержку обратиться будет проще (=
    Ответ написан
  • DigitalOcean как замена хостингу. Как всё грамотно настроить?

    @neol
    Во-первых, безопасность - это процесс, а не состояние.
    Чтобы система была более-менее безопасной, нужно:
    - быть в курсе существующих уязвимостей в используемом софте (как минимум следить за ubuntu security notices )
    - ставить апдейты
    - использовать достаточно стойкие пароли и периодически их менять
    - отключать неиспользуемые сервисы
    - если возможно, максимально ограничивать доступ по сети (например, не выставлять mysql на всеобщее обозрение)
    - отключать неиспользуемые модули, плагины, расширения, фичи etc.
    - делать бекапы
    - всегда строго соблюдать принцип минимальных привилегий
    - не подключаться к серверу с ненадежных систем (подключение с домашнего десктопа, на котором детишки гоняют пиратские игры, а вы смотрите "порно онлайн бесплатно без смс" - не очень хорошая идея).

    Эти довольно простые советы в стиле КО на самом деле дают практически 100% защиту от "автоматических" взломов (имеются в виду боты, которые сканируют все подряд в поисках уязвимых систем и троянчики, вытаскивающие сохраненные пароли). Все остальное больше зависит от вашего кода, чем от каких-то настроек.
    Ответ написан
    Комментировать
  • Почему Apache2 странно выполняет exec()?

    @neol
    Если apache работает от www-data, то скорее всего ему не хватает прав для доступа к устройствам/сокетам или чему-то подобному. Попробуйте запустить от своего пользователя. Для этого в /etc/apache2/envvars надо поменять значения
    export APACHE_RUN_USER=www-data
    export APACHE_RUN_GROUP=www-data

    и перезапустить apache
    Ответ написан