<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://itecfun.com/extern.php?action=feed&amp;tid=3147&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[个人知识管理站 / fsockopen函数被禁用的解决之道]]></title>
		<link>http://www.itecfun.com/viewtopic.php?id=3147</link>
		<description><![CDATA[fsockopen函数被禁用的解决之道 最近发表的帖子。]]></description>
		<lastBuildDate>Thu, 28 May 2015 01:54:07 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[fsockopen函数被禁用的解决之道]]></title>
			<link>http://www.itecfun.com/viewtopic.php?pid=3292#p3292</link>
			<description><![CDATA[<p>fsockopen() — Open Internet or Unix domain socket connection </p><p>一、如何禁用fsockopen() <br />下面是两种常用的禁用fsockopen的方法。 <br />1、修改php.ini，将 disable_functions = 后加入 fsockopen <br />2、修改php.ini，将 allow_url_fopen = On 改为 allow_url_fopen = Off </p><p>二、如何解决fsockopen函数被禁用 <br />1、如果服务器没有同时禁用pfsockopen，那么直接将fsockopen函数替换为pfsockopen。 <br />具体操作：搜索程序中的字符串 fsockopen( 替换为 pfsockopen(。示例如下 <br />修改前： <br />[CODE_LITE]$fp = fsockopen($host, 80, $errno, $errstr, 30);[/CODE_LITE] <br />修改后： <br />[CODE_LITE]$fp = pfsockopen($host, 80, $errno, $errstr, 30);[/CODE_LITE] </p><p>2、如果服务器同时禁用了pfsockopen，那么用其他函数代替，如stream_socket_client()。注意：stream_socket_client()和fsockopen()的参数不同。 <br />具体操作：搜索程序中的字符串 fsockopen( 替换为 stream_socket_client(，然后，将原fsockopen函数中的端口参数“80”删掉，并加到$host。示例如下 <br />修改前： <br />[CODE_LITE]$fp = fsockopen($host, 80, $errno, $errstr, 30);[/CODE_LITE] <br />修改后 <br />[CODE_LITE]$fp = stream_socket_client($host.&quot;:80&quot;, $errno, $errstr, 30);[/CODE_LITE] </p><p>3、如果PHP版本低于5.0，fsockopen被禁用，又没有stream_socket_client()怎么办呢？自己写一个函数实现fsockopen的功能，参考代码： <br />[CODE_LITE]function b_fsockopen($host, $port, &amp;$errno, &amp;$errstr, $timeout) { <br />$ip = gethostbyname($host); <br />$s = socket_create(AF_INET, SOCK_STREAM, 0); <br />if (socket_set_nonblock($s)) { <br />$r = @socket_connect($s, $ip, $port); <br />if ($r || socket_last_error() == EINPROGRESS) { <br />$errno = EINPROGRESS; <br />return $s; <br />} <br />} <br />$errno = socket_last_error($s); <br />$errstr = socket_strerror($errno); <br />socket_close($s); <br />return false; <br />}[/CODE_LITE] <br />具体操作：1.首先找到使用fsockopen函数的代码段，将上面代码加至其上端，搜索该代码段中的字符串 fsockopen( 替换为 b_fsockopen(。 <br />2.因为fsockopen函数返回文件指针所以可以被文件函数操作，但是这个b_fsockopen函数没能返回文件指针，需要继续修改代码段：用socket_read(替换掉 fread(，用socket_write(替换掉fwrite(，用socket_close(替换掉fclose(。 </p><p>[FONT-SIZE=4]温馨提示：修改前先备份原文件！！！[/FONT-SIZE] </p><p>文章出处：<a href="http://blog.i1728.com/post/fsockopen.html" rel="nofollow">东方天宇博客</a></p>]]></description>
			<author><![CDATA[dummy@example.com (xuyg)]]></author>
			<pubDate>Thu, 28 May 2015 01:54:07 +0000</pubDate>
			<guid>http://www.itecfun.com/viewtopic.php?pid=3292#p3292</guid>
		</item>
	</channel>
</rss>
