在php中,ob_start()函数用于打开缓冲区,比如header()函数之前如果就有输出,包括回车/空格/换行/都会有"Header had all ready send by"的错误。
此时可以先用ob_start()打开缓冲区PHP代码的数据块和echo()输出都会进入缓冲区而不会立刻输出。
对于php中打开缓冲区的方法,总结为四种:
1,用于header()之前
<?php ob_start(); //打开缓冲区 echo /"Hellon/"; //输出 header("location:index.php"); //把浏览器重定向到index.php ob_end_flush();//输出全部内容到浏览器 ?>
2,phpinfo()函数可获取客户端和服务器端的信息,保存客户端信息用缓冲区。
<?php ob_start(); //打开缓冲区 phpinfo(); //使用phpinfo函数 $info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info $file=fopen(/'info.txt/',/'w/'); //打开文件info.txt fwrite($file,$info); //写入信息到info.txt fclose($file); //关闭文件info.txt ?>
3,静态页面技术
<?php ob_start();//打开缓冲区 //php页面的全部输出 $content = ob_get_contents();//取得php页面输出的全部内容 $fp = fopen("output00001.html", "w"); //创建一个文件,并打开,准备写入 fwrite($fp, $content); //把php页面的内容全部写入output00001.html,然后…… fclose($fp); ?>
4,输出代码
<?php Function run_code($code) { If($code) { ob_start(); eval($code); $contents = ob_get_contents(); ob_end_clean(); }else { echo "错误!没有输出"; exit(); } return $contents; }
字符串替换函数 str_replace()
函数原型:mixed str_replace(mixed needle,mixed new_needle,mixed haystack[,int &count]);
needle:要被替换的字符串,new_needle:替换用的字符串,haystack:操作字符串,count:替换次数【可选参数】
在都不使用数组时,该函数直接使用new_needle替换所有的needle并返回替换后的字符串。
例如:
返回:ny nane is jin!
1、只对needle使用数组。
例子:
返回:ny nane ns jnn!
函数顺序性的对数组中每个字符串进行替换,并返回替换后的字符串。
2、只对new_needle使用数组。
例子:
返回:Arrayy naArraye is jiArray!
如果只对第二个参数使用数组则函数将其作为字符串Array进行使用,将所有的needle替换为了数组。
3、只对haystack使用数组。
例子:
该语句执行结果返回一个数组,即分别为传入的两个字符串替换后的结果。
如果输出数组内容会看到:ny nane is jin! the gane is over!
4、对needle和new_needle都使用数组。
例子:
返回:ny nane zs jzn!
如果前两个参数都使用数组则函数把数组各个对象项字符串进行了替换,及needle的第一项替换为new_needle的第一项。以此类推。
如果needle数组比new_deedle长,例如:
返回:ny nane z jzn!可见,对于needle数组多出来的字符串被替换为了空串。
如果new_needle数组比needle长,例如:
返回:ny nane zs jzn!可见new_needle多余的项被忽略。
5、三个参数都使用数组。
例如:
返回的数组内容:ny nane zs jzn!the gane zs over
以上对两个字符串分别执行替换。
分享几段获取远程网页内容的php代码。
1、fopen方式
<?php $handle = fopen ("http://www./", "rb"); $contents = ""; while (!feof($handle)) { $contents .= fread($handle, 8192); } fclose($handle); echo $contents; //输出获取到得内容。 //以下适用于php5以上版本 $handle = fopen("http://www.", "rb"); $contents = stream_get_contents($handle); fclose($handle); echo $contents; ?>
如果出现:failed to open stream: HTTP request failed!错误。
解决方法:
在php.ini中,有这样两个选项:allow_url_fopen =on(表示可以通过url打开远程文件),user_agent="PHP"(表示通过哪种脚本访问网络,默认前面有个 " ; " 去掉即可。)重启服务器。
如下图:
完美解决:
设置php.ini里面的user_agent,php默认的user_agent是PHP,我们把它改成Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)来模拟浏览器即可。
user_agent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
2、curl方式
<?php $url = "http://www."; $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10); $dxycontent = curl_exec($ch); echo $dxycontent; ?>
备注:linux下可以使用下面的代码下载
exec("wget {$url}");
PHP抓取外部资源函数fopen、file_get_contents、curl 的区别:
1,fopen / file_get_contents 每次请求都会重新做DNS查询,并不对DNS信息进行缓存。
2,CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。
这大大减少了DNS查询的次数。
因此,CURL的性能比fopen、file_get_contents要好,建议使用。