#php #linux #git #web-hosting
Вопрос:
У меня есть PHP-скрипт, который просто:
$output = shell_exec('git pull https://****@bitbucket.org/****/****.git 2>amp;1');
print_r($output)
Я могу подключиться по SSH к своему хосту и запустить это с помощью «PHP scriptname.php» и это прекрасно работает и говорит мне, что все обновлено в течение доли секунды.
Однако, когда я пытаюсь запустить этот же PHP-скрипт через веб-браузер, он зависает на неопределенный срок.
Комментарии:
1. Проверьте вывод файла .sh с помощью `/usr/bin/php -c «path/to/file.sh» чтобы посмотреть, не приведет ли это к ошибке.
Ответ №1:
Проблема в том, что ваш веб-сервер и оболочка ssh имеют разный набор переменных среды. В этом случае проблема git
в том, что в $PATH
переменной веб-сервера отсутствует.
Чтобы исправить это, вы можете добавить каталог с git
двоичным кодом в $PATH
переменную
set PATH=$PATH:/usr/local/cpanel/3rdparty/lib/path-bin
или просто назовите его полным путем
/usr/local/cpanel/3rdparty/lib/path-bin/git
Что касается учетных данных git — попробуйте найти ответственную переменную env.
Комментарии:
1. Если я удалю часть «Изменить каталог» и оставлю запрос git, веб-браузер по-прежнему зависает и ничего не делает. Если он находится не в правильном каталоге, он должен вернуть ошибку «фатально: не репозиторий git», но она просто зависает. Обратите внимание, это работает, когда я нахожусь в терминале и запускаю php-файл с помощью: php «script.php» но когда я запускаю скрипт из браузера, он просто зависает… Я отредактировал свой вопрос, чтобы удалить каталог изменений, поскольку, похоже, в этом нет необходимости
2. извините, что я не проверил вашу правку. Если у вас достаточно прав, попробуйте оформить
sudo -u www-data git pull <...>
их, чтобы проверить вывод. Возможно, у пользователя вашего веб-сервера нет доступа на запись в целевой каталог.3. Так и должно быть, но ваша оболочка и веб-сервер имеют разные наборы переменных среды. Попробуйте запустить это
php -r "system('git pull <...>');"
в своей оболочке ssh. Правильно ли это работает?4. Я немного обескуражен 🙂 Может быть, сравнение переменных среды даст вам подсказку? Попробуйте сравнить
env
результаты выполнения команд из командной оболочки и веб-сервера.5. Как вы видите, переменная PATH сильно отличается. Пожалуйста, проверьте двоичное расположение «git» по
which git
. В качестве грязного исправления попробуйте добавить эту строку в начало вашего сценария bash:set PATH=/usr/local/jdk/bin:/usr/local/cpanel/3rdparty/lib/path-bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/cpanel/composer/bin:/opt/puppetlabs/bin:/usr/local/bin:/usr/X11R6/bin:/home/REPLACEDUSERNAME/.local/bin:/home/REPLACEDUSERNAME/bin