Как заставить Windows symlinks работать с mod_php?

Я пытаюсь использовать символические ссылки на Windows 7 из PHP. Я использую XAMPP с Apache 2.4.10 и PHP 5.5.15 от учетной записи обычного пользователя (не администратора). Как предложено в Симлинк не работает на моей локальной машине Я установил правильные разрешения для моего пользователя для создания символических ссылок. Это отлично работает, я могу создавать символические ссылки (mklink ...) из командной строки без повышения прав. РНР symlink() Функция не выдает никаких разрешений (код 1314) на ошибки.

При запуске PHP из командной строки или при загрузке через CGI все работает как положено:

  • symlink() умеет создавать символические ссылки (абсолютные и относительные
    целевые пути)
  • is_link() возвращает true для символических ссылок
  • filetype() возвращает ссылку для символических ссылок

Однако когда я запускаю PHP как модуль apache, я сталкиваюсь со всеми видами проблем:

  • symlink() может создавать символические ссылки только в том случае, если цель является действительной абсолютный путь (с использованием относительных путей будет выбрасывать: Warning: symlink(): Could not fetch file information(error 2))
  • is_link() возвращается ложный для символических ссылок
  • filetype() возвращается ‘file’ / ‘dir’ для символических ссылок

Похоже, это связано с PHP symlink () не работает в Windows 7, но эта ошибка была исправлена ​​в PHP 5.4, и я использую 5.5. Также PHP сообщает об ошибке код 2, а не 3.

В дополнение к моему основному вопросу (Как заставить это работать?«), Я ищу ответы на следующие вопросы:

  1. Это еще одна ошибка в PHP (или Apache?)?

  2. В чем разница между загрузкой PHP как модуля и через CGI и как это может быть связано с этим вопросом?

И после прочтения о безопасность потоков в PHP:

  1. Может ли безопасность потоков иметь какое-либо отношение к этому?

Я могу сказать, что mod_php загружен как потокобезопасная версия («phpt5Т.С..длл «) прямо сейчас.

Вот часть httpd.conf для загрузки в качестве модуля (настройки xampp по умолчанию):

LoadFile "G:/xampp/php/php5ts.dll"LoadFile "G:/xampp/php/libpq.dll"LoadModule php5_module "G:/xampp/php/php5apache2_4.dll"
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>

А вот настройки php-cgi:

<FilesMatch "\.php$">
SetHandler application/x-httpd-php-cgi
</FilesMatch>
<IfModule actions_module>
Action application/x-httpd-php-cgi "/php-cgi/php-cgi.exe"</IfModule>

4

Решение

symlink () может создавать символические ссылки только в том случае, если целью является допустимый абсолютный путь (при использовании относительных путей будет выброшено: Предупреждение: symlink (): Не удалось получить информацию о файле (ошибка 2))

Это связано с следующей ошибкой в ​​PHP:

is_link () возвращает false для символических ссылок

Я заметил то же самое, по крайней мере, при моей текущей настройке. Когда PHP запускается как модуль Apache, а не через CGI, is_link Функция всегда возвращает false для любой символической ссылки. Моя настройка:

  • Windows 7 x64
  • XAMPP 1.8.3
  • PHP 5.5.11

В чем разница между загрузкой PHP как модуля и через CGI и как это может быть связано с этим вопросом?

Преимущество запуска PHP через CGI состоит в том, что каждый процесс PHP может запускаться под другим пользователем, а не только под пользователем Apache. Это полезно для продуктивных серверных сред, так что каждый веб-сайт не должен иметь одинаковые права доступа. Однако запуск PHP через CGI также намного, намного медленнее. Запускать его как модуль всегда самый быстрый вариант.

Запуск PHP через FastCGI по большей части снижает производительность, но все же немного медленнее, чем запускать его как модуль.

Что касается того, почему эти проблемы с is_link (а также filetype) происходят при запуске PHP как модуль, я не знаю.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]