Почему команда оболочки wget backticks работает в PHP CLI, а не в PHP-скрипте?

просто для удовольствия я пытаюсь сделать загрузку wget из php cli (/usr/bin/php -a), и это работает:

php > `wget -q -nd -O /Users/user/path/to/file.html http:\/\/host.com/some_file.html`;
php > // a HTML file is downloaded and its content is placed into /Users/user/path/to/file.html

Однако, когда я пытаюсь сделать то же самое из скрипта PHP, это не работает:

<?php 
 `wget -q -nd -O /Users/user/path/to/file.html http:\/\/host.com/some_file.html`;
 // After requesting the script from the browser and after the script is executed, the file doesn't exist on the specified path

Я хотел бы сказать, что пользователь, который выполняет apache и, следовательно, скрипты на стороне сервера PHP, совпадает с пользователем, который выполняет команду php из командной строки (поэтому я думаю, что это не должно быть проблемой разрешений).

Почему, если я использую скрипт .php и вызываю wget внутри скрипта, файл не сохраняется?

Спасибо за внимание!

PS: пожалуйста, не говорите мне, что я могу использовать curl для такой задачи, я знаю, что могу, мне просто интересно узнать, как я могу сделать что-то подобное, не используя инструменты PHP, вот и все


person tonix    schedule 27.12.2014    source источник
comment
Есть ли ошибки в журнале PHP?   -  person Barmar    schedule 27.12.2014
comment
Может быть, wget нет в $PATH пользователя apache?   -  person Barmar    schedule 27.12.2014
comment
@Barmar Нет, в журнале ошибок php нет ошибок, я проверил, что wget должен быть в пути, потому что пользователь apache — это тот же пользователь, который я использую для запуска команды php CLI.   -  person tonix    schedule 27.12.2014
comment
Демон, вероятно, не запускает сценарии запуска оболочки .profile и .bashrc, в которых обычно устанавливаются переменные среды. Таким образом, даже если это один и тот же идентификатор пользователя, среда не будет прежней.   -  person Barmar    schedule 27.12.2014
comment
Может быть, у вас включен safe_mode? Это отключает обратные кавычки. shell_exec работает?   -  person Barmar    schedule 27.12.2014
comment
Нет, safe_mode включен, потому что, если я делаю whoami или pwd, я могу повторить вывод, я думаю, это проблема: у меня установлен wget с HomeBrew (я использую OS X) внутри /opt/local/bin/wget. /opt/local/bin/ добавляется к переменной env $PATH внутри моего файла .bash_profile, который загружается всякий раз, когда я открываю Terminal.app. Поскольку я выполняю команду оболочки из PHP, .bash_profile не выполняется, поэтому я заканчиваю очень скудной переменной среды $PATH (/usr/bin:/bin:/usr/sbin:/sbin, если я вывожу переменную $PATH из скрипта PHP), и оболочка не находит команда wget.   -  person tonix    schedule 27.12.2014
comment
Это сработало для меня: <?php `cd ~ && pwd && . .bash_profile && wget -q -nd -O /Users/user/path/to/file.html http:\/\/host.com/some_file.html`;   -  person tonix    schedule 27.12.2014


Ответы (2)


используйте полный путь к wget, так как демон не запускает .bash_profile.

`/opt/local/bin/wget -q -nd -O /Users/user/path/to/file.html http://host.com/some_file.html`;

Кстати, нет необходимости экранировать / в командах оболочки.

person Barmar    schedule 27.12.2014
comment
Спасибо за предложение! - person tonix; 27.12.2014

Оператор обратной галочки запускает команду оболочки и возвращает вывод этой команды.

В этой ситуации простая регистрация (или, если необходимо, повторение) результата, вероятно, выявит ошибку. Например:

$result = `wget -q -nd -O /Users/user/path/to/file.html http:\/\/host.com/some_file.html`;

trigger_error($result, E_USER_NOTICE);
person Stephen    schedule 27.12.2014
comment
Не помогло, $result - пустая строка. Я нашел ошибку, пожалуйста, проверьте мой комментарий :) - person tonix; 27.12.2014
comment
Если это проблема пути, $result должна быть строкой, содержащей sh: wget: команда не найдена - person Stephen; 27.12.2014
comment
Да, это должно быть, но я не знаю, почему я не видел никакой ошибки. Может быть, потому что sh: wget: command not found записывается в stderr? - person tonix; 27.12.2014