Проблема с символическими ссылками и загрузкой файлов - PullRequest
0 голосов
/ 19 декабря 2009

У меня случается эта странная вещь. Мое веб-приложение Zend Framework (PHP), которое я разрабатывал локально, прекрасно работает на моем компьютере, но после загрузки на сервер оно считает, что каталог для загрузки не существует.

В моем приложении есть каталог для загрузки, который является символической ссылкой на каталог вне приложения:

#local
/myapp.local
    /application
    /data
        /uploads (symlink, points to ./../../shared_uploads)
    /public/index.php
/shared_uploads

#remote
/shared_uploads
/current (symlink, points to ./releases/myapp-2009-12-18)
/releases
    /myapp-2009-12-18
        /application
        /data
            /uploads
        /public/index.php

Сервер указывает на /current/public/index.php для обслуживания приложения. Может ли быть так, что, поскольку он находится в каталоге релизов, он на один уровень глубже? Или это может быть ошибка прав доступа, поскольку я создал символическую ссылку для загрузки на локальном компьютере, а не на сервере?

Обновление: В моем /public/index.php файле я определяю свой каталог для загрузки следующим образом:

// Define path to uploads directory
defined('APPLICATION_UPLOADS_DIR')
    || define('APPLICATION_UPLOADS_DIR', realpath(dirname(__FILE__) . '/../data/uploads'));

Ответы [ 2 ]

1 голос
/ 19 декабря 2009

Разрешения не должны быть проблемой, если ваш UMASK равен 0022, но вопрос в том, как вы загружаете файл? FTP не будет уважать символическую ссылку (хотя я верю, что это делает sftp), тогда как scp или rsync будут.

Как бы то ни было, хотя это определенно ваша вложенная структура каталогов. символьная ссылка должна быть относительно истинного местоположения его родителя, поэтому в вашем случае это будет ln -s ../../../../shared_uploads. я думаю, что самое простое решение здесь было бы сделать символическую ссылку в пределах releases для ссылки на реальный shared_uploads.

0 голосов
/ 19 декабря 2009

Помогает ли это?

defined('APPLICATION_UPLOADS_DIR') || define('APPLICATION_UPLOADS_DIR', dirname(dirname(realpath(__FILE__))) . '/data/uploads');

Я удалил .., используя два dirname() s, и раньше запустил realpath(), чтобы удалить символическую ссылку из пути.

Хотя я подозреваю, что вам realpath() вообще не нужен.

Ciao!

...