Zend Framework: не удалось определить временный каталог, пожалуйста, укажите cache_dir вручную

3

Я просто изучаю Zend Framework. Я создал простой Zend_Form, и когда я отправил форму, я получил следующую ошибку:

An error occurred
Application error
Exception information:

Message: Could not determine temp directory, please specify a cache_dir manually
Stack trace:

 - 0 H:\Documents\IIS_Server_Root\zendframework\Zend\Cache\Backend.php(197): Zend_Cache::throwException('Could not deter...')
 - 1 H:\Documents\IIS_Server_Root\zendframework\Zend\Cache\Backend\File.php(123): Zend_Cache_Backend->getTmpDir()
 - 2 H:\Documents\IIS_Server_Root\zendframework\Zend\Cache.php(153): Zend_Cache_Backend_File->__construct(Array)
 - 3 H:\Documents\IIS_Server_Root\zendframework\Zend\Cache.php(94): Zend_Cache::_makeBackend('File', Array, false, false)
 - 4 H:\Documents\IIS_Server_Root\zendframework\Zend\Locale\Data.php(314): Zend_Cache::factory('Core', 'File', Array, Array)
 - 5 H:\Documents\IIS_Server_Root\zendframework\Zend\Locale\Format.php(808): Zend_Locale_Data::getList('en_US', 'day')
 - 6 H:\Documents\IIS_Server_Root\zendframework\Zend\Locale\Format.php(1118): Zend_Locale_Format::_parseDate('12/12/2010', Array)
 - 7 H:\Documents\IIS_Server_Root\zendframework\Zend\Date.php(4765): Zend_Locale_Format::getDate('12/12/2010', Array)
 - 8 H:\Documents\IIS_Server_Root\zendframework\Zend\Validate\Date.php(175): Zend_Date::isDate('12/12/2010', 'MM-DD-YYYY', NULL)
 - 9 H:\Documents\IIS_Server_Root\zendframework\Zend\Form\Element.php(1395): Zend_Validate_Date->isValid('12/12/2010', Array)
 - 10 H:\Documents\IIS_Server_Root\zendframework\Zend\Form.php(2252): Zend_Form_Element->isValid('12/12/2010', Array)
 - 11 H:\Documents\IIS_Server_Root\localhost\zfprojects\zf_cms\application\controllers\BugController.php(30): Zend_Form->isValid(Array)
 - 12 H:\Documents\IIS_Server_Root\zendframework\Zend\Controller\Action.php(513): BugController->submitAction()
 - 13 H:\Documents\IIS_Server_Root\zendframework\Zend\Controller\Dispatcher\Standard.php(295): Zend_Controller_Action->dispatch('submitAction')
 - 14 H:\Documents\IIS_Server_Root\zendframework\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
 - 15 H:\Documents\IIS_Server_Root\zendframework\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch()
 - 16 H:\Documents\IIS_Server_Root\zendframework\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
 - 17 H:\Documents\IIS_Server_Root\localhost\zfprojects\zf_cms\public\index.php(26): Zend_Application->run()
 - 18 {main}  

Параметры запроса:

array (
  'controller' => 'bug',
  'action' => 'submit',
  'module' => 'default',
  'author' => '7676',
  'email' => '[email protected]',
  'date' => '12/12/2010',
  'url' => 'http://blogs.antarjaal.in/takneek/?p=1354',
  'description' => 'tytytyty t',
  'priority' => 'low',
  'status' => 'new',
  'submit' => 'Submit',
)  

Конфигурация системы:

  • Windows 7
  • IIS 7.5
  • PHP 5.3
  • Zend Framework 1.11.4
  • 0
    Если какой-либо из ответов, приведенных ниже, решил вашу проблему, примите его, отметив галочкой значок под кнопками голосования. Благодарю.
Теги:
caching
frameworks
zend-framework

8 ответов

3

Ну, он говорит

"Please specify a cache_dir manually"

Так и сделайте.

Пример из справочного руководства:

$frontendOptions = array(
   'lifetime' => 7200, // cache lifetime of 2 hours
   'automatic_serialization' => true
);

$backendOptions = array(
    'cache_dir' => '/path/to/cache' // Directory where to put the cache files
);

// getting a Zend_Cache_Core object
$cache = Zend_Cache::factory('Core',
                             'File',
                             $frontendOptions,
                             $backendOptions);

Эквивалент при использовании плагина ресурсов кэша:

resources.cachemanager.database.frontend.name = Core
resources.cachemanager.database.frontend.customFrontendNaming = false
resources.cachemanager.database.frontend.options.lifetime = 7200
resources.cachemanager.database.frontend.options.automatic_serialization = true

resources.cachemanager.database.backend.name = File
resources.cachemanager.database.backend.customBackendNaming = false
resources.cachemanager.database.backend.options.cache_dir = "/path/to/cache"
resources.cachemanager.database.frontendBackendAutoload = false

Ссылка:

  • 0
    Где я должен написать этот код? Можно ли написать этот код в application.ini
  • 1
    Похоже, что PHP не может читать / писать в каталоге C: \ Windows \ Temp. Какое разрешение я должен установить для C: \ Windows \ Temp
Показать ещё 2 комментария
2

Я использовал "memcached" вместо "File", поэтому моя проблема была немного иной. Я решил это, используя:

        $registry = Zend_Registry::getInstance ();
        $frontendOptions =
        array (
            'lifetime' => APPLICATION_ENV == 'development' ? '10' : '3600', 
            'automatic_serialization' => true
        );


    $backendOptions = array(
                        'servers' => array( array(
                            'host' => APPLICATION_ENV == 'development' ? '***' : '***', 
                            'port' => '***'
                        ) ),
                        'compression' => true
    );

    $cache = Zend_Cache::factory ( 'Core', 'Memcached', $frontendOptions, $backendOptions );

// Below is the fix for the problem! It appears that some validators / translates are caching
Zend_Locale::setCache($cache);
Zend_Translate::setCache($cache);
2

Что-то вроде этого должно быть полезно:

$_SERVER['TEMP'] =  realpath(dirname(__FILE__) . '/tmp');
2

При просмотре кода Zend/Cache/Backend.php есть несколько альтернатив, позволяющих корректно угадывать cache_dir:

  • Установка переменных окружения, таких как TMPDIR, TEMP или TMP
  • установить "upload_tmp_dir" в php.ini
  • разрешить доступ к "/tmp" или "\ temp"

По крайней мере, как я прочитал код:

/**
 * Determine system TMP directory and detect if we have read access
 *
 * inspired from Zend_File_Transfer_Adapter_Abstract
 *
 * @return string
 * @throws Zend_Cache_Exception if unable to determine directory
 */
public function getTmpDir()
{
    $tmpdir = array();
    foreach (array($_ENV, $_SERVER) as $tab) {
        foreach (array('TMPDIR', 'TEMP', 'TMP', 'windir', 'SystemRoot') as $key) {
            if (isset($tab[$key])) {
                if (($key == 'windir') or ($key == 'SystemRoot')) {
                    $dir = realpath($tab[$key] . '\\temp');
                } else {
                    $dir = realpath($tab[$key]);
                }
                if ($this->_isGoodTmpDir($dir)) {
                    return $dir;
                }
            }
        }
    }
    $upload = ini_get('upload_tmp_dir');
    if ($upload) {
        $dir = realpath($upload);
        if ($this->_isGoodTmpDir($dir)) {
            return $dir;
        }
    }
    if (function_exists('sys_get_temp_dir')) {
        $dir = sys_get_temp_dir();
        if ($this->_isGoodTmpDir($dir)) {
            return $dir;
        }
    }
    // Attemp to detect by creating a temporary file
    $tempFile = tempnam(md5(uniqid(rand(), TRUE)), '');
    if ($tempFile) {
        $dir = realpath(dirname($tempFile));
        unlink($tempFile);
        if ($this->_isGoodTmpDir($dir)) {
            return $dir;
        }
    }
    if ($this->_isGoodTmpDir('/tmp')) {
        return '/tmp';
    }
    if ($this->_isGoodTmpDir('\\temp')) {
        return '\\temp';
    }
    Zend_Cache::throwException('Could not determine temp directory, please specify a cache_dir manually');
}
1

Я создал папку "tmp" в основном каталоге, который он работал у меня

0

Я думаю, что это решит проблему, она решила это для меня

Zend_Date::setOptions(array('cache' => $cache)); // Active aussi pour Zend_Locale
Zend_Translate::setCache($cache);

добавить его после настройки кеша в bootstrap.php

  • 0
    А $cache var $cache откуда?
0

вы можете ввести .htaccess

SetEnv TEMP /tmp
0

Отключить/отключить кеш:) Почему вы используете его для простого приложения при обучении? Есть более важные вещи, чтобы учиться;)

  • 1
    Я не использовал кеш. Но я создал модель с расширением из Zend_Db_Table_Abstract. Я думаю, что использует кэш. потому что, когда я отправляю форму, она вызывает модель, и отображается ошибка.
  • 0
    Кэш никогда не создается, если вы не сделаете это явно. Вы, возможно, поместили это в application.ini.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню