• PHP Fatal error: Maximum execution time of 30 seconds exceeded in Unknown on line 0

    Aco
    @Aco
    Заклинатель кода
    Могу предположить, что у вас скрипт впадает в рекурсию, залипает, апач начинает феерически форкаться что бы удовлетворить запросы, новые процессы так же залипают, система эпохально теряет ресуры (память и процессорное время), многое забивается в своп, остальные процессы становятся не дееспособными такие как ssh, ftp из-за отсутвия ресурсов. апач так же встает так как fork перестаёт работать. После некоторого времени скрипт убивается апач-форком по max_execution_time, ресурсы возвращается, солнце становится ярче, небо голубее, ssh быстрее. Как-то так. Итого: очень тяжелый скрипт детектед.
    Ответ написан
    5 комментариев
  • Websockets: где работает?

    Aco
    @Aco
    Заклинатель кода
    Для кроссбраузерной работы WebSocket лучше использовать обвёртку WebSocket.js. там где нет ws используется флеш как прокси ws (правда добавляет гемор с flashpolicy, так как не у всех открыт порт 843, то флешка будет ломится и на 80). А вообще WS это общий принятый стандарт в RFC и в спецификации HTML5. Выпиливать его уже никто не будет, только дальше развивать.
    Ответ написан
    1 комментарий
  • Прошу конструктивной критики на мой код на PHP

    Aco
    @Aco
    Заклинатель кода
    Код кишит мёртвым кодом, на подобии
     throw new Exception('Template file '.$templateLink.' not found!');
    if( defined('DEBUG') && DEBUG )
      $this->html = 'Template file '.$templateLink.' not found!';
    else
      $this->html = '';
    return false;
    

    После исключения код никогда не выполнится
    Ответ написан
    Комментировать
  • PHP - Как вернуть управляемый контент при критической ошибке PHP (E_ERROR, E_PARSE)?

    Aco
    @Aco
    Заклинатель кода
    register_shutdown_function(function () {
       $error = error_get_last();
       if ($error && ($error['type'] == E_ERROR || $error['type'] == E_PARSE || $error['type'] == E_COMPILE_ERROR)) {
           if (strpos($error['message'], 'Allowed memory size') === 0) { // если кончилась память
               ini_set('memory_limit', (intval(ini_get('memory_limit'))+64)."M"); // выделяем немножко что бы доработать корректно
               Log::error("PHP Fatal: not enough memory in ".$error['file'].":".$error['line']);
    	} else {
               Log::error("PHP Fatal: ".$error['message']." in ".$error['file'].":".$error['line']);
            }
            // ... завершаемая корректно ....
        }
    })
    
    


    Ловит так же падения при отсутствии свободной памяти, ошибки парсинга, и прочего
    Ответ написан
    17 комментариев
  • PHP и AMQP, как?

    Aco
    @Aco
    Заклинатель кода
    Была схожая задача, решилась через redis и его операцию blpop + таймауты на коннекты
    Ответ написан
  • Автошаринг файлов

    Aco
    @Aco
    Заклинатель кода
    Если есть какая-то десинхронизация в фс то тут отлично поможет rsync
    Ответ написан
  • Автошаринг файлов

    Aco
    @Aco
    Заклинатель кода
    Шардинг в MongoDB шикарен. Однако скорость отдачи файлов не является лучшей стороной MongoDB GridFS. Есть модуль Nginx-а для раздачи файлов из GridFS, но коннекты у него блокирующие с вытекающими из этого последствиями. Как аналог, приходит в голову rsync + MongoDB capet collection + MongoDB tailable cursor. а если подумать то монгу предложенном варианте можно заменить на redis: в редисе заводится очередь на каждый сервера, на каждом сервер висит скрипт с blPop (очень интересная команда, в асинхронной модели будет работать отлично), когда есть изменения (добавили/удалил/изменили файл) другой скрипт, который принял данную комманду, делает rpop в очереди серверов у redis с соответвующий opcod-ом, ну а дальше rsync или что либо ещё. тем самым получаю синхронизацию фс. Скорость редиса ничуть не уступает скорости memcached, проверено. Это то, что сходу пришло в голову.
    Ответ написан
    Комментировать
  • Применение побитовых операторов в PHP и Javascript?

    Aco
    @Aco
    Заклинатель кода
    У меня в проекте есть объект имеющий 42 различных состояния, на подобии сброшен, завершился с ошибкой, процессе того, в процессе сего… и т.д. На каждое состояние выделен 1 бит, таким образом все возможные состояния вмещаются в одно свойство объекта. Так вот, есть много мест где мне надо решать что делать опираясь на эти флаги, для примера сравните 2 куска кода.
    if($this->_sock && !empty($this->_opts["keep-alive"]) && $this->_is_opened && $this->_step == "proceed") {
    }
    

    или
    if($this->_state & self::CAN_PROCEED) {
    }
    

    таким образом можно вместо кучи свойств и проверок ключей у массивов/объектов делать одну битовую операцию
    Ответ написан
    4 комментария
  • PHP - Out of memory - куда уходит память?

    Aco
    @Aco
    Заклинатель кода
    Рекомендую memtrack. Позволит построчно отображать кто что съел. Если это крон, то лучше ещё вызывать коллектор gc_collect_cycles. И проверьте что сборщик мусора вообще включен.
    Ответ написан
    Комментировать
  • Программирование без математики

    Aco
    @Aco
    Заклинатель кода
    Сама математика не столь важна в программирование как мат. логика. А от булева алгебра очень пригодится.
    Ответ написан
    1 комментарий