Доступ к функциям начальной загрузки Zend-приложения _init после начальной загрузки - PullRequest
2 голосов
/ 13 июня 2011

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

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

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


UPDATE

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

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

Ответы [ 4 ]

3 голосов
/ 14 июня 2011

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

$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
$bootstrap->bootstrap('db')
1 голос
/ 22 июня 2011

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

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

0 голосов
/ 21 июня 2011

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

$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); 
}
0 голосов
/ 20 июня 2011

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

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

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

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

...