Вы хотите перенести mod_pagespeed на другой сервер или интегрировать его в другую систему? Большой! Мы разработали mod_pagespeed как модульный и почти полностью независимый от Apache. Единственный специфичный для Apache код находится в net/instaweb/apache .
Если вы посмотрите на наш исходный код , наш основной код находится в net/instaweb/ :
- util/ и http/ содержат многие из наших основных инструментов, включая абстрактные базовые классы, такие как
MessageHandler,TimerиUrlFetcher. Есть несколько примеров реализации, но многие из них вам придется реализовать самостоятельно. - htmlparse/ содержит основной парсер HTML. Вы вообще не должны с этим сталкиваться.
- rewriter/ имеет фильтры перезаписи и фреймворк. Центральной точкой интеграции здесь является частично абстрактный класс
RewriteDriverFactory. Ваши усилия по интеграции начнутся с его подкласса и реализации его чисто виртуальных методов.
Возможно, вам придется реализовать порт для следующих классов (см. примеры реализации в каталоге apache/ ):
- MessageHandler — обработка ошибок (см., например , FileMessageHandler и ApacheMessageHandler )
- FileSystem (см. пример StdioFileSystem и AprFileSystem )
- AbstractCondvar (см. пример PthreadCondvar и AprCondvar )
- AbstractMutex (см. пример PthreadMutex и AprMutex )
- Статистика — отслеживайте различные глобальные статистические данные (см. пример SimpleStats и AprStatistics ).
- Таймер (см. пример MockTimer и AprTimer )
- UrlFetcher — сборщик ресурсов по URL (см. пример WgetUrlFetcher и SyncFetcherAdapter )
- UrlAsyncFetcher — то же самое, но с интерфейсом обратного вызова (см. пример WgetUrlAsyncFetcher и SerfUrlAsyncFetcher ; последний поддерживает модель асинхронных событий, построенную поверх UrlPollableAsyncFetcher ).
- RewriteDriverFactory — управляет всеми параметрами и классами, характерными для реализации (см. пример ApacheRewriteDriverFactory ).
Затем, чтобы фактически вызвать код, вам нужно создать FooRewriteDriverFactory для создания всех ваших объектов, а затем StartParseWithType(url, content_type) , ParseText(text) между каждым сбросом сервера и FinishParse() для каждого запроса.
Пожалуйста, напишите в наш список рассылки разработчиков , если вы изучаете это или у вас есть какие-либо проблемы. Мы не гарантируем, что какие-либо внутренние интерфейсы останутся прежними, поэтому мы можем легко сломать ваш порт, если не будем знать, что вы их используете.