В моей локальной среде разработки у меня установлен Apache и PHP в Windows 7. Я звоню в 7-Zip из моей PHP-программы с помощью exec. Сначала я попытался
exec('7z a example.zip example.pdf');
но он не создал zip-файл. После проверки журнала ошибок Apache я обнаружил
«7z» не распознается как внутренняя или внешняя команда, операционная программа или командный файл.
После изменения exec
чтобы включить полный путь к 7-Zip.exe, он сработал.
exec('"C:\\Program Files\\7-Zip\\7z" a example.zip example.pdf');
Но C:\Program Files\7-Zip
включен в мою систему Windows PATH. Тот же PHP-код работает из командной строки без использования полного пути.
php -r "exec('7z a example.zip example.pdf');"
Почему это требует полного пути, когда я использую его с Apache?
Важным моментом, который я забыл включить, когда я изначально поставил этот вопрос, является то, что я уже могу использовать exec()
для вызова других программ, включенных в систему Windows PATH, не ссылаясь на них по их полным путям.
Еще один момент, о котором я не упоминал изначально, потому что я не осознавал, что его значимость заключалась в том, что 7-Zip был добавлен в PATH только недавно, и я снова перезапустил службу Apache после добавления.
У меня WAMP установлен на Windows 8, и после прочтения вашего вопроса я решил проверить пару вещей.
Запуск echo exec('whoami');
повторил:
nt authority\system
Это подтверждает то, что сказал @Barmar , Apache не работает под тем же пользователем, что и вы, поэтому PATH
отличается.
Я решил остановить Apache и запустить его вручную под учетной записью администратора. Затем я попробовал:
echo exec('whoami');
Что вышло:
computername\administrator
Я предположил, что теперь exec
будет работать с PATH
и попытался:
echo exec('adb');
// Инструмент adroid adb находится на моем PATH
Удивительно, но несмотря на то, что Apache работал с тем же пользователем, что и я, PATH
все еще не работал. Я не знаю, почему это происходит, и если у кого-то есть подсказка, прокомментируйте это ниже.
Мне удалось использовать PATH
(используя учетную запись администратора) со следующим кодом:
https://stackoverflow.com/users/171318/hek2mgl $ WshShell = новый COM («WScript.Shell»); $ oExec = $ WshShell-> Run ("cmd / C 7z a example.zip example.pdf", 0); // 0 невидимый / 1 видимый
Я не тестировал код ниже, но вы можете попробовать установить PATH
в учетной записи Apache Service ( nt authority\system
), а затем использовать команду, то есть:
echo exec('set PATH=%PATH%;C:/path/to/7z'); echo exec('7z a example.zip example.pdf');
Я считаю, что path
будет по-прежнему действителен между перезагрузками.
этот ответ может помочь вам установить PATH
для учетной записи nt authority\system
.
Личные переменные среды пользователя локальной системы указаны в « HKEY_USERS.DEFAULT \ Environment ». Общесистемные переменные среды указаны в разделе « HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment ». Первый из них не очень легко доступен из любого места, кроме реестра, но последний доступен из диалогового окна « Переменные среды » на вкладке « Дополнительно » в « Свойствах системы ».
Для будущих пользователей правильным способом установки Apache PATH является:
Вы можете использовать
setEnv
в.htaccess
илиputenv
вPHP
коде для установки$PATH
Кредит идет на hek2mgl
Я просто понял, что вызывает эту проблему. Это было фактически не связано с моим первоначальным предположением.
Я вспомнил, что видел информацию о PATH
в phpinfo()
, поэтому я посмотрел на это. В разделе «Apache Environment» он отображал всю PATH
кроме пути к 7-Zip, который я недавно добавил в систему PATH
. По-видимому, он, похоже, имеет доступ к этому пути, но не использовал текущую версию. Почему нет?
Обычно я думал, что только что забыл перезапустить Apache после обновления пути, но я повторно перезапустил его, пытаясь понять это. Но, по-видимому, перезапуск Apache не обновляет это значение. Я должен был остановить это, а затем начать его. Затем путь 7-Zip появился в PATH
в phpinfo, и я смог изменить свою программу на использование простой 7z
.