fsockopen,读返回数据不易采用feof函数
两天辛苦,得出一个结论:用feof函数判断读socket返回是否结束,是非常错误的做法。效率之低,耗时之久,实在让人忍无可忍。
写一断测试代码:
<?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>";
}
echo "内容:".$resp."<br>";
echo "读完关闭前:".(microtime(true)-$start)."<br>";
fclose($conn);
echo "关闭:".(microtime(true)-$start)."<br>";
return $resp;
}
httpPost("127.0.0.1","/aa.php","test",true);
?>
输出结果:
开始读
读之前:4.4822692871094E-5
读之后:0.00069689750671387
读之前:0.00070381164550781
读之后:0.00070691108703613
读之前:0.00070881843566895
读之后:0.00071382522583008
读之前:0.00071597099304199
读之后:5.531320810318
内容:HTTP/1.1 200 OK Date: Sat, 28 Aug 2010 03:35:20 GMT Server: Apache/2.2.15 (Win32) PHP/5.2.12 X-Powered-By: PHP/5.2.12 Content-Length: 5 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html hello
读完关闭前:5.5313439369202
关闭:5.531445980072
可以看到,读最后一条数据时,耗时达5秒之多。
另一种方法,见续篇
http://baiyuxiong.iteye.com/admin/blogs/758754
分享到:
相关推荐
`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中用于打开...
PHP的fsockopen函数是PHP中一个用来打开网络套接字连接的函数,它不仅可以用于访问网页、获取数据,还能够进行更底层的网络通信。通过fsockopen函数,PHP开发者能够使用HTTP协议以GET或POST方式向服务器发送请求,并...
首先,`fsockopen`函数的基本语法如下: ```php fsockopen($hostname, $port, $errno, $errstr, $timeout); ``` - `$hostname`:要连接的服务器的域名或IP地址。 - `$port`:服务器上服务运行的端口号。 - `$errno...
因为fsockopen函数返回的是一个文件指针,可以被fread、fwrite等文件函数操作。而b_fsockopen函数返回的是socket句柄,因此需要将fread、fwrite等操作替换为socket_read、socket_write等操作。 总结上述信息,我们...
通过fsockopen函数,我们可以向服务器发送请求,并接收服务器返回的数据。 ### PHP fsockopen 函数说明 fsockopen函数用于创建一个网络连接或Unix域套接字。函数原型如下: ```php fsockopen(string hostname, int...
遍历目录,`scandir()`函数会返回目录中的所有文件和子目录。`chdir()`改变当前工作目录,而`getcwd()`则用于获取当前工作目录。 4. **文件属性与权限** `file_exists()`检查文件或目录是否存在,`is_file()`和`is...
4. **文件操作函数**:`file_get_contents()`读取整个文件到字符串,`file_put_contents()`则将数据写入文件,`fopen()`和`fclose()`用于文件的打开和关闭,`feof()`检查是否到达文件末尾。 5. **文件上传处理**:`...
也许fsockopen、pfsockopen函数的确存在着安全的隐患,但是我们却已经无从考证,这都是IDC商说的,不管是什么原因吧,反正他们是把这两个函数禁用了,那么如何解决呢,下面是小编整理的方法,希望对用到的同学有一定...
3. **返回值**:描述函数执行后返回的数据类型和含义,如`strlen()`返回的是整型数值,表示字符串的长度。 4. **函数描述**:详细解释函数的功能和用途,包括可能的使用场景。 5. **示例代码**:提供实际的代码示例...
3. **文件I/O**:`file_get_contents()`读取文件内容,`file_put_contents()`写入文件,`fopen()`和`fclose()`打开和关闭文件,`feof()`检查是否到达文件结尾,`fgets()`读取文件行,`rename()`重命名文件。...
`file()`函数下载远程文件,`fsockopen()`创建到服务器的套接字连接。`curl`库用于更复杂的HTTP请求,如`curl_init()`初始化会话,`curl_setopt()`设置选项,`curl_exec()`执行请求。 9. **正则表达式** PHP的`...
本篇文章将深入探讨`fsockopen`函数及其在实际应用中的例子。 首先,为了使用`fsockopen`,必须确保在`php.ini`配置文件中`allow_url_fopen`选项被设置为`on`。这个选项允许PHP通过URL访问数据,从而启用`fsockopen...
总结,通过`fsockopen()`函数,我们可以轻松地构建一个端口扫描器,用于检测网络上的开放端口。这个基础实例展示了如何结合PHP和网络编程概念,但实际使用时应考虑扩展和优化以适应不同的需求和环境。