`
baiyuxiong
  • 浏览: 177978 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

续:fsockopen,读返回数据不易采用feof函数

    博客分类:
  • php
阅读更多
换另一种方式来读数据:
<?php 
function httpPost($host,$url,$data,$p)
{
	$conn = fsockopen($host,80,$errno, $errstr, 30);
	if (!$conn) 
	{
		echo "$errstr ($errno)<br />\n";
		return;
	}
	
	$header = "POST ".$url." HTTP/1.1\r\n";
	$header.= "Host : {$host}\r\n";
	$header.= "Content-type: application/x-www-form-urlencoded\r\n";
	$header.= "Content-Length:".strlen($data)."\r\n";
	$header.= "Connection: Keep-Alive\r\n\r\n";	
	$header.= "{$data}\r\n\r\n";
	
	fwrite($conn,$header);
	
	
	//读内容
	$resp='';
	$start = microtime(true);
	
	
	/*
	 * echo "开始读<br>";
	while (!feof($conn)) {
		echo "读之前:".(microtime(true)-$start)."<br>";
		$resp .= fread($conn,64);
		echo "读之后:".(microtime(true)-$start)."<br>";
	}
	*/
	$len=-1;   
	
	//开始读头,读到空行时,表明头已读完
	echo "开始读head<br>";
    while( ($line=trim(fgets($conn))) != "" )   
        {
        echo "head读之前:".(microtime(true)-$start)."<br>";
            $header.=$line;   
            if(strstr($line,"Content-Length:"))   
            {   
                list($cl,$len)=explode(" ",$line);   
            }   
             echo "head读之后:".(microtime(true)-$start)."<br>";
        } 
     
    echo "开始读body:".(microtime(true)-$start)."<br>";
    $body=fread($conn,$len);   	
	echo "内容:".$body."<br>";
	echo "读完关闭前:".(microtime(true)-$start)."<br>";
	fclose($conn);
	echo "关闭:".(microtime(true)-$start)."<br>";
	return $resp;
}

httpPost("127.0.0.1","/aa.php","test",true);
?>

结果:
开始读head
head读之前:0.00082898139953613
head读之后:0.00084185600280762
head读之前:0.00084590911865234
head读之后:0.00084781646728516
head读之前:0.00085091590881348
head读之后:0.00085282325744629
head读之前:0.00085592269897461
head读之后:0.00085783004760742
head读之前:0.00085997581481934
head读之后:0.00086688995361328
head读之前:0.0008699893951416
head读之后:0.00087189674377441
head读之前:0.00087499618530273
head读之后:0.00087690353393555
head读之前:0.00088000297546387
head读之后:0.00088191032409668
开始读body:0.00088381767272949
内容:hello
读完关闭前:0.00088787078857422
关闭:0.0009307861328125

整个过程速度很快。

纵观两个函数及耗时,我觉得是feof判断结束有bug。所以推荐读SOCK的做法是,先取到协议头里的Content-Length,然后再根据Content-Length指定的长度读内容。

欢迎讨论。
分享到:
评论

相关推荐

    php_fsockopen:fsockopen是套接字包功能,除了基本的常用TCP外

    fsockopen 是套接字包功能,除了基本的常用TCP://通讯功能外,它还具有其他强大的通讯功能,UDP:// unix:// udg://等各种协议。 您可以使用获取当前服务器注册的套接字传输协议列表,以确定是否支持需要使用该...

    浅析虚拟主机服务器php fsockopen函数被禁用的解决办法

    二、如何解决fsockopen函数被禁用1、如果服务器没有同时禁用pfsockopen,那么直接将fsockopen函数替换为pfsockopen。具体操作:搜索程序中的字符串 fsockopen( 替换为 pfsockopen( 。示例如下修改前:$fp = ...

    fsockopen用法.txt

    `fsockopen`函数返回一个资源标识符(resource identifier),可以用于后续的读写操作,如`fputs`, `fgets`, `fgetss`, `fclose`等。如果没有成功建立连接,则返回`FALSE`。 #### 使用示例 下面是一个使用`...

    PHP使用feof()函数读文件的方法

    如果到达文件末尾,feof()函数会返回TRUE,否则返回FALSE。PHP4和PHP5版本中都应用了feof()函数。 正确使用feof()函数可以有效避免程序的无限循环,以及确保文件在操作完成后能够正确关闭,从而避免潜在的资源泄露...

    不支持fsockopen函数 的通用解决办法

    下载此文件,解压并上传到网站源码根目录。然后访问这个文件【例如您网站的源码是直接放在abc.com的根目录,则访问http://abc.com/pfsockopen.php】,直接点【开始执行替换操作】,即可。

    利用PHP fsockopen 模拟POST/GET传送数据的方法

    利用PHP的fsockopen函数可以模拟向其他网页或站点发送HTTP请求,具体来说,可以通过模拟POST和GET方法来传送数据。下面详细说明如何使用fsockopen函数来完成这一任务。 首先,要理解fsockopen函数是PHP中用于打开...

    fsockopen get/post 表单及上传文件例子

    首先,`fsockopen`函数的基本语法如下: ```php fsockopen($hostname, $port, $errno, $errstr, $timeout); ``` - `$hostname`:要连接的服务器的域名或IP地址。 - `$port`:服务器上服务运行的端口号。 - `$errno...

    php使用fsockopen函数发送post,get请求获取网页内容的方法

    PHP的fsockopen函数是PHP中一个用来打开网络套接字连接的函数,它不仅可以用于访问网页、获取数据,还能够进行更底层的网络通信。通过fsockopen函数,PHP开发者能够使用HTTP协议以GET或POST方式向服务器发送请求,并...

    一个PHP Whois域名检查函数代码_.docx

    fsockopen 函数用于打开一个网络 socket 连接,用于与远程服务器通信。 知识点6:错误处理 该资源提供了一个错误处理机制,如果查询服务器不存在或无法连接,将返回错误信息。 知识点7:安全性 该资源的安全性是...

    PHP上百个常用功能函数.zip

    4. **文件操作函数**:`file_get_contents()`读取整个文件到字符串,`file_put_contents()`则将数据写入文件,`fopen()`和`fclose()`用于文件的打开和关闭,`feof()`检查是否到达文件末尾。 5. **文件上传处理**:`...

    php源码 fsockopen获取网页内容实例详解

    通过fsockopen函数,我们可以向服务器发送请求,并接收服务器返回的数据。 ### PHP fsockopen 函数说明 fsockopen函数用于创建一个网络连接或Unix域套接字。函数原型如下: ```php fsockopen(string hostname, int...

    php函数手册.rar

    3. **返回值**:描述函数执行后返回的数据类型和含义,如`strlen()`返回的是整型数值,表示字符串的长度。 4. **函数描述**:详细解释函数的功能和用途,包括可能的使用场景。 5. **示例代码**:提供实际的代码示例...

    PHP 文件操作函数

    遍历目录,`scandir()`函数会返回目录中的所有文件和子目录。`chdir()`改变当前工作目录,而`getcwd()`则用于获取当前工作目录。 4. **文件属性与权限** `file_exists()`检查文件或目录是否存在,`is_file()`和`is...

    PHP函数库查询辞典

    3. **文件I/O**:`file_get_contents()`读取文件内容,`file_put_contents()`写入文件,`fopen()`和`fclose()`打开和关闭文件,`feof()`检查是否到达文件结尾,`fgets()`读取文件行,`rename()`重命名文件。...

    php自动提交表单的方法(基于fsockopen与curl)_.docx

    fsockopen是PHP内置的一个网络连接函数,它可以打开到指定服务器的TCP/IP套接字连接。以下是如何使用fsockopen来实现表单自动提交的步骤: 首先,解析目标URL以获取主机名、端口和路径等信息。然后,创建一个到该...

    PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法

    也许fsockopen、pfsockopen函数的确存在着安全的隐患,但是我们却已经无从考证,这都是IDC商说的,不管是什么原因吧,反正他们是把这两个函数禁用了,那么如何解决呢,下面是小编整理的方法,希望对用到的同学有一定...

    杰奇1.7解密.zip_adclick.php_奇杰_杰奇_杰奇1.7解密_杰奇解密

    通过解密,我们可以了解系统如何初始化、如何调用不同模块以及如何处理跨页面的数据共享。 "setavatar.php" 可能是用来处理用户头像设置的脚本,它涉及用户界面的交互以及图片上传和处理的逻辑。"newmessage.php" ...

Global site tag (gtag.js) - Google Analytics