Доступ к функциям начальной загрузки Zend-приложения _init после начальной загрузки

Я написал службу cron на основе Zend Framework для параллельных задач и столкнулся с проблемами с дочерними потоками, совместно использующими ресурсы с родителем. Я решил проблему с подключением к базе данных, но теперь я вижу периодические проблемы с Zend_Db_Table_Abstract не удалось сохранить метаданные таблицы в кэш метаданных.

Не удалось сохранить метаданные в metadataCache

Я инициализирую кеш метаданных во время начальной загрузки. Вместо того, чтобы копировать мой код из начальной загрузки и выполнять после разветвления, я подумал, что было бы лучше вызвать Bootstrap->_init[...] функции с помощью $application->bootstrap('[...]'),


ОБНОВИТЬ

Так как Zend_Controller_Front::getInstance() это Singleton, использующий его для получения экземпляра начальной загрузки и вызова функций, который возвращает меня к той же проблеме с общими ресурсами, которую я уже решил.

Я хочу как-то сохранить эту СУХУЮ, избегая проблем с общими ресурсами после разветвления.

4 ответа

Решение

Zend_Controller_Front является одноэлементным, но его конструктор защищен, так что вы можете расширить его, просто создав класс App_Controller_Front.

в этом создайте метод для getNewInstance(), который может вызывать конструктор без проверки существования. Таким образом, вы можете переопределить поведение синглтона.

Zend_Controller_Front Синглтон держит экземпляр вашей начальной загрузки

$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
$bootstrap->bootstrap('db')

Почему каждый дочерний поток читает конфигурацию, кэширует метаданные БД и т. Д.? Используйте основную / рабочую иерархию. Общая идея:

$pid = pcntl_fork();

if ($pid == -1) {        
    // Fork failed            
    exit(1); 
} elseif ($pid) { 
    // We are the parent 
    // prepare common data, cache it, etc.
} else { 
    // We are the child 
    // create new db connection, use cached data
    // if there is no data in cache yet - sleep
    exit(0); 
}

Вы "разветвляете" эти параллельные процессы не с помощью pcntl_fork, а просто запускаете их несколько раз через своего крохобота, правильно? Это подразумевает, что они выполняются как отдельные процессы друг от друга, и единственными общими ресурсами (и последующими конфликтами) являются системные ресурсы (особенно файлы).

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

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

Возможно, вы могли бы подробнее рассказать о том, как вы настроили кэш метаданных и как работает распараллеливание сценариев. Кроме того, какую версию Zend Framework вы используете?

Другие вопросы по тегам