带有命令的PHP shell_exec的行为方式与通过终端执行时不同



当我在macOS 10.13终端上执行以下命令时:

curl 'https://api.perlego.com/metadata/v2/metadata/books/toc/682348' 
> -XGET 
> -H 'Origin: https://www.perlego.com' 
> -H 'Host: api.perlego.com' 
> -H 'Accept: application/json' 
> -H 'Connection: keep-alive' 
> -H 'Accept-Language: en-sg' 
> -H 'Accept-Encoding: br, gzip, deflate' 
> -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15' 
> -H 'Referer: https://www.perlego.com/book/682348/10-human-how-your-bodys-microbes-hold-the-key-to-health-and-happiness-pdf' --compressed | brotli -d > temp.txt

这是输出:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100   535    0   535    0     0   1433      0 --:--:-- --:--:-- --:--:--  1430

我看到一个保存到目录中的文件temp.txt,其中包含我需要的数据(一个json(。

但当我通过PHP:执行此操作时

$comd = <<<EOT
cd "/Users/user/Documents/RU_general"; curl 'https://api.perlego.com/metadata/v2/metadata/books/toc/682348' 
-XGET 
-H 'Origin: https://www.perlego.com' 
-H 'Host: api.perlego.com' 
-H 'Accept: application/json' 
-H 'Connection: keep-alive' 
-H 'Accept-Language: en-sg' 
-H 'Accept-Encoding: br, gzip, deflate' 
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15' 
-H 'Referer: https://www.perlego.com/book/682348/10-human-how-your-bodys-microbes-hold-the-key-to-health-and-happiness-pdf' --compressed | brotli -d > temp.txt
EOT;
d($comd);
$res = shell_exec($comd); 
//***** exec() also results in the same problem

该文件仍在创建中,但temp.txt文件为空。

发生了什么,我如何获得所需的输出?

从我运行的几个测试来看,这与gzip压缩有关。在CURL请求中,您要求服务器提供压缩版本,然后使用brotli进行解压缩。运行原始的curl代码会在压缩时出现错误,如curl: (61) Unrecognized content encoding type. libcurl understands deflate, gzip content encodings.

我的建议是删除所有压缩信息,删除brotli,只使用简单的json。见下文:

$comd = <<<EOT
cd "/Users/user/Documents/RU_general"; curl 'https://api.perlego.com/metadata/v2/metadata/books/toc/682348' 
-XGET 
-H 'Origin: https://www.perlego.com' 
-H 'Host: api.perlego.com' 
-H 'Accept: application/json' 
-H 'Connection: keep-alive' 
-H 'Accept-Language: en-sg' 
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15' 
-H 'Referer: https://www.perlego.com/book/682348/10-human-how-your-bodys-microbes-hold-the-key-to-health-and-happiness-pdf' > temp1.txt
EOT;

接下来,我建议您使用PHP Curl实现,而不是使用shell_exec。并非所有主机都允许shell_exec,如果主机系统不提供curl,或者在您的情况下甚至不提供Linux服务器中的标准brotli,您也会被阻止。使用PHP Curl可以让您留在PHP中,并确保您的代码是可移植的。

最新更新