不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题

2015-01-24信息快讯网

网站上线,modoer与ucenter 下不能通讯折腾了我差不多二天,开始都以为自己的配置出问题,移植了平台后就不能通讯了,修改了几次配置,都没有成功

所以就怀疑是否编码问题,或者文件权限问题,或者是不是函数不支持问题,经过排查发现原来是万网的L1主机不支持fsockopen,在文件uc_client/client.php中的uc_fopen中出现了问题,这里的代码是这样:
 
function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) { 
$return = ''; 
$matches = parse_url($url); 
!isset($matches['host']) && $matches['host'] = ''; 
!isset($matches['path']) && $matches['path'] = ''; 
!isset($matches['query']) && $matches['query'] = ''; 
!isset($matches['port']) && $matches['port'] = ''; 
$host = $matches['host']; 
$path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/'; 
$port = !empty($matches['port']) ? $matches['port'] : 80; 
if($post) { 
$out = "POST $path HTTP/1.0\r\n"; 
$out .= "Accept: */*\r\n"; 
//$out .= "Referer: $boardurl\r\n"; 
$out .= "Accept-Language: zh-cn\r\n"; 
$out .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n"; 
$out .= "Host: $host\r\n"; 
$out .= 'Content-Length: '.strlen($post)."\r\n"; 
$out .= "Connection: Close\r\n"; 
$out .= "Cache-Control: no-cache\r\n"; 
$out .= "Cookie: $cookie\r\n\r\n"; 
$out .= $post; 
} else { 
$out = "GET $path HTTP/1.0\r\n"; 
$out .= "Accept: */*\r\n"; 
//$out .= "Referer: $boardurl\r\n"; 
$out .= "Accept-Language: zh-cn\r\n"; 
$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n"; 
$out .= "Host: $host\r\n"; 
$out .= "Connection: Close\r\n"; 
$out .= "Cookie: $cookie\r\n\r\n"; 
} 
$fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout); 
if(!$fp) { 
return '';//note $errstr : $errno \r\n 
} else { 
stream_set_blocking($fp, $block); 
stream_set_timeout($fp, $timeout); 
@fwrite($fp, $out); 
$status = stream_get_meta_data($fp); 
if(!$status['timed_out']) { 
while (!feof($fp)) { 
if(($header = @fgets($fp)) && ($header == "\r\n" || $header == "\n")) { 
break; 
} 
} 
$stop = false; 
while(!feof($fp) && !$stop) { 
$data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit)); 
$return .= $data; 
if($limit) { 
$limit -= strlen($data); 
$stop = $limit <= 0; 
} 
} 
} 
@fclose($fp); 
return $return; 
} 
} 

fsockopen函数不能使用,因些就只能靠其它方法了,幸亏支持curl,file_get_contents也支持,经考虑就用curl吧,修改了uc_fopen函数,如下;
 
function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) { 
$return = ''; 
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
if($post) { 
curl_setopt($curl, CURLOPT_POST, 1); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $post); 
} 
if($cookie) { 
curl_setopt($curl, CURLOPT_COOKIE, $cookie); 
} 
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); 
curl_setopt($curl, CURLOPT_HEADER, 0); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
$return = curl_exec($curl); 
if (curl_errno($curl)) { 
echo '<pre><b>错误:</b><br />'.curl_error($curl); 
} 
curl_close($curl); 
return $return; 
} 

于是modoer下的uc_client/client.php和uchome下的uc_cilent/client.php,就这样修改了uc_open函数,呵呵,第一次使用curl,网上的资料还是好多的,所以也没有什么阻碍,不过就不知这个修改会不会影响其它的东西,还有待测试罗。。。。
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
PHP header()函数使用详细(301、404等错误设置)
关于PHP的相似度计算函数:levenshtein的使用介绍
关于shopex同步ucenter的redirect问题,导致script不运行
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
php中DOMElement操作xml文档实例演示
PHP 自定义错误处理函数trigger_error()
file_get_contents获取不到网页内容的解决方法
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
利用PHP扩展vld查看PHP opcode操作步骤
PHP中CURL方法curl_setopt()函数的参数分享
PHP fopen 读取带中文URL地址的一点见解
比较discuz和ecshop的截取字符串函数php版
PHP简洁函数小结
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
shopex中集成的站长统计功能的代码简单分析
php的urlencode()URL编码函数浅析
PHP header函数分析详解
PHP源代码数组统计count分析
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
PHP调用Webservice实例代码
关于php连接mssql:pdo odbc sql server
在WAMP环境下搭建ZendDebugger php调试工具的方法
php array_pop()数组函数将数组最后一个单元弹出(出栈)
php array_intersect比array_diff快(附详细的使用说明)
php header Content-Type类型小结
PHP采集利器 Snoopy 试用心得
yii框架源码分析之创建controller代码
PHP读取网页文件内容的实现代码(fopen,curl等)
不重新编译PHP为php增加openssl模块的方法
©2014-2024 dbsqp.com