当我在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中,并确保您的代码是可移植的。