- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想使用 Zend_Http_Client 访问新的 Twitter Stream API。问题是,对该网页 ( http://stream.twitter.com/1/statuses/sample.json ) 的 HTTP 请求从未完成但一直在加载。
所以即使我将 Zend_Http_Client 设置为 setStream(),我也无法获取它发出的信息。
这是我目前的逻辑:
$httpClient = new Zend_Http_Client("http://stream.twitter.com/1/statuses/sample.json");
$httpClient->setAuth("username", "password");
$httpClient->setStream("/tmp/twitter_stream");
flush();
ob_flush();
$response = $httpClient->request("GET");
// Never get here... :(
Zend_Debug::dump($response);
flush();
ob_flush();
while(true)
{
echo fgets($response->getStream());
flush();
ob_flush();
}
现在,一旦我开始请求,我就永远不会进入 while 循环。 Zend Framework 所做的是,它写入一个文件。
我之所以要使用 Zend_Http_Client 是因为我以后必须使用 OAuth 访问该 Stream API,而 Zend_Oauth 依赖于 Zend_Http_Client。
如有任何帮助,我们将不胜感激。
最佳答案
据我所知,目前唯一可能的方法是扩展 Zend_Http_Client_Adapter_Socket,从旧的 Zend_Client_Http_Adapter_Socket 复制 write 方法并将您的自定义逻辑插入 do...while 循环(参见//CUSTOM LOGIC此处在方法的末尾评论):
<?php
class App_Http_Client_Adapter_Socket extends Zend_Http_Client_Adapter_Socket
{
/**
* Read response from server
*
* @return string
*/
public function read()
{
// First, read headers only
$response = '';
$gotStatus = false;
$stream = !empty($this->config['stream']);
while (($line = @fgets($this->socket)) !== false)
{
$gotStatus = $gotStatus || (strpos($line, 'HTTP') !== false);
if ($gotStatus)
{
$response .= $line;
if (rtrim($line) === '')
break;
}
}
$this->_checkSocketReadTimeout();
$statusCode = Zend_Http_Response::extractCode($response);
// Handle 100 and 101 responses internally by restarting the read again
if ($statusCode == 100 || $statusCode == 101)
return $this->read();
// Check headers to see what kind of connection / transfer encoding we have
$headers = Zend_Http_Response::extractHeaders($response);
/**
* Responses to HEAD requests and 204 or 304 responses are not expected
* to have a body - stop reading here
*/
if ($statusCode == 304 || $statusCode == 204 ||
$this->method == Zend_Http_Client::HEAD)
{
// Close the connection if requested to do so by the server
if (isset($headers['connection']) && $headers['connection'] == 'close')
{
$this->close();
}
return $response;
}
// If we got a 'transfer-encoding: chunked' header
if (isset($headers['transfer-encoding']))
{
if (strtolower($headers['transfer-encoding']) == 'chunked')
{
do
{
$line = @fgets($this->socket);
$this->_checkSocketReadTimeout();
$chunk = $line;
// Figure out the next chunk size
$chunksize = trim($line);
if (!ctype_xdigit($chunksize))
{
$this->close();
require_once 'Zend/Http/Client/Adapter/Exception.php';
throw new Zend_Http_Client_Adapter_Exception('Invalid chunk size "' .
$chunksize . '" unable to read chunked body');
}
// Convert the hexadecimal value to plain integer
$chunksize = hexdec($chunksize);
// Read next chunk
$read_to = ftell($this->socket) + $chunksize;
do
{
$current_pos = ftell($this->socket);
if ($current_pos >= $read_to)
break;
if ($this->out_stream)
{
if (stream_copy_to_stream($this->socket, $this->out_stream, $read_to - $current_pos) == 0)
{
$this->_checkSocketReadTimeout();
break;
}
}
else
{
$line = @fread($this->socket, $read_to - $current_pos);
if ($line === false || strlen($line) === 0)
{
$this->_checkSocketReadTimeout();
break;
}
$chunk .= $line;
}
}
while (!feof($this->socket));
$chunk .= @ fgets($this->socket);
$this->_checkSocketReadTimeout();
if (!$this->out_stream)
{
$response .= $chunk;
}
}
while ($chunksize > 0);
}
else
{
$this->close();
require_once 'Zend/Http/Client/Adapter/Exception.php';
throw new Zend_Http_Client_Adapter_Exception('Cannot handle "' .
$headers['transfer-encoding'] . '" transfer encoding');
}
// We automatically decode chunked-messages when writing to a stream
// this means we have to disallow the Zend_Http_Response to do it again
if ($this->out_stream)
{
$response = str_ireplace("Transfer-Encoding: chunked\r\n", '', $response);
}
// Else, if we got the content-length header, read this number of bytes
}
elseif (isset($headers['content-length']))
{
// If we got more than one Content-Length header (see ZF-9404) use
// the last value sent
if (is_array($headers['content-length']))
{
$contentLength = $headers['content-length'][count($headers['content-length']) - 1];
}
else
{
$contentLength = $headers['content-length'];
}
$current_pos = ftell($this->socket);
$chunk = '';
for ($read_to = $current_pos + $contentLength; $read_to > $current_pos; $current_pos = ftell($this->socket))
{
if ($this->out_stream)
{
if (@stream_copy_to_stream($this->socket, $this->out_stream, $read_to - $current_pos) == 0)
{
$this->_checkSocketReadTimeout();
break;
}
}
else
{
$chunk = @fread($this->socket, $read_to - $current_pos);
if ($chunk === false || strlen($chunk) === 0)
{
$this->_checkSocketReadTimeout();
break;
}
$response .= $chunk;
}
// Break if the connection ended prematurely
if (feof($this->socket))
break;
}
// Fallback: just read the response until EOF
} else
{
do
{
if ($this->out_stream)
{
if (@stream_copy_to_stream($this->socket, $this->out_stream) == 0)
{
$this->_checkSocketReadTimeout();
break;
}
}
else
{
$buff = @fread($this->socket, 8192);
if ($buff === false || strlen($buff) === 0)
{
$this->_checkSocketReadTimeout();
break;
}
else
{
$response .= $buff;
}
// CUSTOM LOGIC HERE!!
echo $response;
flush();
ob_flush();
}
}
while (feof($this->socket) === false);
$this->close();
}
// Close the connection if requested to do so by the server
if (isset($headers['connection']) && $headers['connection'] == 'close')
{
$this->close();
}
return $response;
}
}
仍然非常欢迎任何其他建议,因为我觉得这更像是一种 hack 而不是有效的解决方案。
关于php - Zend_Http_Client - 从 Stream 读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3457015/
嘿,我正在使用 Zend_Http_Client 调用服务器中的 php 服务,但我遇到了与超时相关的异常: 2012-05-30T13:47:26+02:00 INFO(6): LeomobileM
我一直在整个 stackoverflow 和 Google 上搜索我的问题的解决方案。 我已经使用 Zend Framework 创建了两个项目 - Project1 和 Project2 - 我想在
我正在尝试通过PUT方法更新我的记录 $client = new Zend_Http_Client(); $client->setMethod(Zend_Http_Client::PUT); $cli
我有 Zend Framework 1.12 项目,还有 PHP 5.5.3 和 nginx 1.2.7 + php-fpm 安装在 Ubuntu 10.04 服务器上。 我收到以下异常 消息:无法连
我正在使用以下代码访问受用户名/密码登录保护的页面。 //Fetch homepage $client = new Zend_Http_Client(); $client->setCook
我正在尝试使用 Zend_Http_Client 和 POST 将数据发送到 Google Analytic 的收集器。我有一个数组 $postParams,其中包括我的跟踪 ID、cid 和命中类型
我需要创建授权脚本。必须保存 Cookie 以供日后在未经授权的情况下访问页面。谁能给我工作示例? 最佳答案 首先,您必须执行初始请求以从服务器获取 cookie。在响应中,您将服务器发送的 cook
我正在尝试使用 Zend_Http_Client 在需要身份验证的站点上发出简单的发布请求。一切似乎都是正确的,但我仍然收到 You are not authorized to view this p
我使用以下代码成功调用了 REST API $client = new Zend_Http_Client(); $client->setMethod(Zend_Http_Client::POST);
我想使用 Zend_Http_Client 访问新的 Twitter Stream API。问题是,对该网页 ( http://stream.twitter.com/1/statuses/sample
我正在使用 Zend_Http_Client 请求 URL,HTTP 客户端的超时设置为 10。 $config = array( 'adapter' => 'Zend_Http_Clie
嗨,我正在将 curl 调用重构为 Zend_Http_Client 调用。这将向带有给定文件的 CouchDB 数据库发送 PUT 请求,并为 _attachement 设置正确的 Content-
我需要调试我的 Zend_Http_Client 代码,以便我确信我将所有正确的 POST 字段和 header 发送到我的服务器。如何输出将发送的 POST 字段列表,甚至整个 HTTP 命令是什么
我一直在尝试使用客户端证书在我的客户端应用程序和服务器应用程序之间建立安全通信。我已经在我的 Apache Web 服务器和我的浏览器中设置了配置,只是为了确保它能正常工作。 我使用的是 zend f
在 PHP curl 中有两个函数用于忽略所有 SSL 错误(无效证书、自签名、过期等): curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_
我想发送一个带有 url 重定向到请求页面的 post 请求。 Jest 认为请求页面当前用于处理提交表单。 我在请求页面尝试了以下代码。 setParameterPost(array('user'
我正在尝试使用以下命令将 json 对象作为 POST 命令发送: $uri = "http://amore-luce.com/product_create"; $product =
我正在使用 Zend_HTTP_Client 向服务器发送 HTTP 请求并获得响应。我向其发送请求的服务器是 HTTPS Web 服务器。目前,一个往返请求大约需要 10-12 秒。我知道开销可能是
我正在使用 Zend_Http_Client 将一组数据发布到我运行 PHP 的服务器。但是,服务器需要 myField[] 形式的数据,即我有一组复选框,用户可以选中多个。我当前的代码是: f
我想解析各种 ssl/https 站点。 例如我想要 https://microsoft.de 的内容,但它不起作用。出现以下错误: Fatal error: Uncaught excepti
我是一名优秀的程序员,十分优秀!