Посмотрим, чем они отличаются?
wget "https://www.example.com/script?paramA=1234¶mB=ABCD"
VS
$url = "https://www.example.com/script?paramA=1234¶mB=ABCD";
exec("/usr/bin/wget $url");
Давайте возьмем ваш код PHP:
Если вы напечатаете эхо $url
, вы получите:
https://www.example.com/script?paramA=1234¶mB=ABCD
Буквально.
Итак, что происходит в вашем вызове exec?
если вы повторите "/usr/bin/wget $url"
, вы получите:
/usr/bin/wget https://www.example.com/script?paramA=1234¶mB=ABCD
Буквально.
Теперь какая разница между
wget "https://www.example.com/script?paramA=1234¶mB=ABCD"
и
/usr/bin/wget https://www.example.com/script?paramA=1234¶mB=ABCD
Конечно, есть путь: /usr/bin
, но ... Если вы попробуете его, вы обнаружите, что это не ваша проблема ...
Что еще? Цитаты. URL в вашей команде оболочки заключен в кавычки, а не в тот, который сгенерирован вашим PHP-кодом.
Как упомянуто @ArtisticPhoenix в комментариях, вы можете использовать функцию php escapeshellarg()
в переменной $ url. Он добавит кавычки вокруг вашего URL (а также убедитесь, что ваша строка остается строкой, например, для предотвращения внедрения), и ваша команда должна работать нормально.
Если вы хотите знать, что здесь происходит, значит, что символ &
в вашем URL анализируется консолью, которая выполняет две команды вместо одной. Ваш url-вызов (при отсутствии paramB
и другой команде paramB=ABCD
, которая создает переменную в вашей оболочке. Вы можете увидеть это, набрав echo $paramB
, который выведет ABCD в вашей консоли. Вызываемый API, вероятно, опирается на paramB
чтобы присутствовать, следовательно, возвращая вам ошибку 400.
Надеюсь, это поможет. Удачи.