Я пытаюсь использовать символические ссылки на 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.
В дополнение к моему основному вопросу (Как заставить это работать?«), Я ищу ответы на следующие вопросы:
Это еще одна ошибка в PHP (или Apache?)?
В чем разница между загрузкой PHP как модуля и через CGI и как это может быть связано с этим вопросом?
И после прочтения о безопасность потоков в PHP:
Я могу сказать, что 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>
symlink () может создавать символические ссылки только в том случае, если целью является допустимый абсолютный путь (при использовании относительных путей будет выброшено: Предупреждение: symlink (): Не удалось получить информацию о файле (ошибка 2))
Это связано с следующей ошибкой в PHP:
is_link () возвращает false для символических ссылок
Я заметил то же самое, по крайней мере, при моей текущей настройке. Когда PHP запускается как модуль Apache, а не через CGI, is_link
Функция всегда возвращает false для любой символической ссылки. Моя настройка:
В чем разница между загрузкой PHP как модуля и через CGI и как это может быть связано с этим вопросом?
Преимущество запуска PHP через CGI состоит в том, что каждый процесс PHP может запускаться под другим пользователем, а не только под пользователем Apache. Это полезно для продуктивных серверных сред, так что каждый веб-сайт не должен иметь одинаковые права доступа. Однако запуск PHP через CGI также намного, намного медленнее. Запускать его как модуль всегда самый быстрый вариант.
Запуск PHP через FastCGI по большей части снижает производительность, но все же немного медленнее, чем запускать его как модуль.
Что касается того, почему эти проблемы с is_link
(а также filetype
) происходят при запуске PHP как модуль, я не знаю.
Других решений пока нет …