我有一个symfony2应用程序,其中我正在使用Guzzle http客户端向服务器发送GET请求,以便检索json文件的内容。Guzzle响应被转换为针对浏览器的Symfony2响应。
Guzzle响应返回以下标头:
内容编码:gzip内容长度:2255内容类型:application / json
将数据输出到UI /浏览器时,我注意到由于Content-Length不正确,该数据被切断了。文件的大小接近4905字节,而不是2255。2255是直到截止点为止的数据的确切长度。我怀疑2255是压缩数据的大小,并且在不更新内容长度的情况下在某些时候未压缩它。现在,我确实确认我已取回所有数据,但是荣幸地使用了内容长度标头,这就是为什么在将数据转发到浏览器时,数据会被切断的原因。有趣的是,即使内容长度为2255,点击json文件的url也会直接产生全部内容,这意味着Chrome直接点击文件时会忽略它。如果我使用POSTman REST客户端发出GET请求,则完全相同-显示全部内容。
默认情况下,Guzzle具有请求选项解码器内容= true,用于处理响应。我在提交请求时将其设置为false,但这似乎无法解决问题。
在将Guzzle响应转换为Symfony响应之前,我删除了content-length标头,这似乎可以解决问题,但是我不确定这是最好的方法,因为RFC协议规定除非传输编码,否则应该存在content-length标头标头存在,但不存在。https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html
另一个选择是,由于这是流式响应,因此要获取流的大小并校正内容长度,但是Guzzle实现为此使用strlen(),这对读取整个流具有不良影响。
如果选择省略content-length标头,可能会遇到什么问题?或者,是否有一种方法可以在不读取整个流的情况下获取内容的TRUE长度,而仅以正确的数量更新content-length报头?
我使用以下命令成功安装了ApiGen:
pear channel-discover pear.apigen.org
pear channel-discover pear.nette.org
pear channel-discover pear.texy.info
pear channel-discover pear.kukulich.cz
pear channel-discover pear.andrewsville.cz
pear install apigen/ApiGen
Run Code Online (Sandbox Code Playgroud)
然后我跑了:
apigen -s /home/first.last/path/to/source/directory -d /home/first.last/path/to/destination/directory/
Run Code Online (Sandbox Code Playgroud)
只是为了得到以下错误:
PHP Warning: require(Texy.php): failed to open stream: No such file or directory in /usr/bin/apigen on line 48
PHP Stack trace:
PHP 1. {main}() /usr/bin/apigen:0
PHP 2. class_exists('Texy') /usr/bin/apigen:64
PHP 3. spl_autoload_call('Texy') /usr/bin/apigen:64
PHP 4. ApiGen\{closure}($class = 'Texy') /usr/bin/apigen:0
PHP Fatal error: require(): Failed opening required 'Texy.php' (include_path='.:/usr/share/pear:/usr/share/php') in /usr/bin/apigen on line 48
PHP Stack …Run Code Online (Sandbox Code Playgroud)