换另一种方式来读数据:
<?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指定的长度读内容。
欢迎讨论。
分享到:
相关推荐
fsockopen 是套接字包功能,除了基本的常用TCP://通讯功能外,它还具有其他强大的通讯功能,UDP:// unix:// udg://等各种协议。 您可以使用获取当前服务器注册的套接字传输协议列表,以确定是否支持需要使用该...
二、如何解决fsockopen函数被禁用1、如果服务器没有同时禁用pfsockopen,那么直接将fsockopen函数替换为pfsockopen。具体操作:搜索程序中的字符串 fsockopen( 替换为 pfsockopen( 。示例如下修改前:$fp = ...
`fsockopen`函数返回一个资源标识符(resource identifier),可以用于后续的读写操作,如`fputs`, `fgets`, `fgetss`, `fclose`等。如果没有成功建立连接,则返回`FALSE`。 #### 使用示例 下面是一个使用`...
如果到达文件末尾,feof()函数会返回TRUE,否则返回FALSE。PHP4和PHP5版本中都应用了feof()函数。 正确使用feof()函数可以有效避免程序的无限循环,以及确保文件在操作完成后能够正确关闭,从而避免潜在的资源泄露...
下载此文件,解压并上传到网站源码根目录。然后访问这个文件【例如您网站的源码是直接放在abc.com的根目录,则访问http://abc.com/pfsockopen.php】,直接点【开始执行替换操作】,即可。
利用PHP的fsockopen函数可以模拟向其他网页或站点发送HTTP请求,具体来说,可以通过模拟POST和GET方法来传送数据。下面详细说明如何使用fsockopen函数来完成这一任务。 首先,要理解fsockopen函数是PHP中用于打开...
首先,`fsockopen`函数的基本语法如下: ```php fsockopen($hostname, $port, $errno, $errstr, $timeout); ``` - `$hostname`:要连接的服务器的域名或IP地址。 - `$port`:服务器上服务运行的端口号。 - `$errno...
PHP的fsockopen函数是PHP中一个用来打开网络套接字连接的函数,它不仅可以用于访问网页、获取数据,还能够进行更底层的网络通信。通过fsockopen函数,PHP开发者能够使用HTTP协议以GET或POST方式向服务器发送请求,并...
fsockopen 函数用于打开一个网络 socket 连接,用于与远程服务器通信。 知识点6:错误处理 该资源提供了一个错误处理机制,如果查询服务器不存在或无法连接,将返回错误信息。 知识点7:安全性 该资源的安全性是...
4. **文件操作函数**:`file_get_contents()`读取整个文件到字符串,`file_put_contents()`则将数据写入文件,`fopen()`和`fclose()`用于文件的打开和关闭,`feof()`检查是否到达文件末尾。 5. **文件上传处理**:`...
通过fsockopen函数,我们可以向服务器发送请求,并接收服务器返回的数据。 ### PHP fsockopen 函数说明 fsockopen函数用于创建一个网络连接或Unix域套接字。函数原型如下: ```php fsockopen(string hostname, int...
3. **返回值**:描述函数执行后返回的数据类型和含义,如`strlen()`返回的是整型数值,表示字符串的长度。 4. **函数描述**:详细解释函数的功能和用途,包括可能的使用场景。 5. **示例代码**:提供实际的代码示例...
遍历目录,`scandir()`函数会返回目录中的所有文件和子目录。`chdir()`改变当前工作目录,而`getcwd()`则用于获取当前工作目录。 4. **文件属性与权限** `file_exists()`检查文件或目录是否存在,`is_file()`和`is...
3. **文件I/O**:`file_get_contents()`读取文件内容,`file_put_contents()`写入文件,`fopen()`和`fclose()`打开和关闭文件,`feof()`检查是否到达文件结尾,`fgets()`读取文件行,`rename()`重命名文件。...
fsockopen是PHP内置的一个网络连接函数,它可以打开到指定服务器的TCP/IP套接字连接。以下是如何使用fsockopen来实现表单自动提交的步骤: 首先,解析目标URL以获取主机名、端口和路径等信息。然后,创建一个到该...
也许fsockopen、pfsockopen函数的确存在着安全的隐患,但是我们却已经无从考证,这都是IDC商说的,不管是什么原因吧,反正他们是把这两个函数禁用了,那么如何解决呢,下面是小编整理的方法,希望对用到的同学有一定...
通过解密,我们可以了解系统如何初始化、如何调用不同模块以及如何处理跨页面的数据共享。 "setavatar.php" 可能是用来处理用户头像设置的脚本,它涉及用户界面的交互以及图片上传和处理的逻辑。"newmessage.php" ...