《CMS案例:phpcms v9注冊會員提示操作失敗原因》要點:
本文介紹了CMS案例:phpcms v9注冊會員提示操作失敗原因,希望對您有用。如果有疑問,可以聯系我們。
相關主題:PHPCMS教程
PHPCMS V9會員注冊時提示操作失敗,這是因為空間服務商關閉了fsockopen()函數功能.
找到phpcms/modules/member/classes/client.class.php第361行,替換fsockopen為pfsockopen即可.
但有一些空間商同時也關閉了pfsockopen函數,怎么辦呢?下面有一些解決方法提供大家參考.
關于fsockopen pfsockopen函數被禁用的解決方法
?? 一、
??
?? 服務器同時禁用了fsockopen pfsockopen,那么用其他函數代替,如stream_socket_client().注意:stream_socket_client()和fsockopen()的參數不同.
?? 具體操作:
?? 搜索程序中的字符串 fsockopen( 替換為 stream_socket_client( ,然后,將原fsockopen函數中的端口參數“80”刪掉,并加到$host.
?? 示例如下
??
?? 修改前:
??
?? $fp = fsockopen($host, 80, $errno, $errstr, 30);
??
?? 或
??
?? $fp = fsockopen($host, $port, $errno, $errstr, $connection_timeout);
??
?? 修改后:
??
?? $fp = stream_socket_client("tcp://".$host."80", $errno, $errstr, 30);
??
?? 或
??
?? $fp = stream_socket_client("tcp://".$host.":".$port, $errno, $errstr, $connection_timeout);
??
?? 二、
??
?? 如果PHP版本低于5.0,fsockopen被禁用,又沒有stream_socket_client()怎么辦呢?自己寫一個函數實現fsockopen的功能,參考代碼:
?? function b_fsockopen($host, $port, &$errno, &$errstr, $timeout) {
?? $ip = gethostbyname($host);
?? $s = socket_create(AF_INET, SOCK_STREAM, 0);
?? if (socket_set_nonblock($s)) {
?? $r = @socket_connect($s, $ip, $port);
?? if ($r || socket_last_error() == EINPROGRESS) {
?? $errno = EINPROGRESS;
?? return $s;
?? }
?? }
?? $errno = socket_last_error($s);
?? $errstr = socket_strerror($errno);
?? socket_close($s);
?? return false;
?? }
??
?? 具體操作:
??
?? 1.首先找到使用fsockopen函數的代碼段,將上面代碼加至其上端,搜索該代碼段中的字符串 fsockopen( 替換為 b_fsockopen( .
??
?? 2.因為fsockopen函數返回文件指針所以可以被文件函數操作,但是這個b_fsockopen函數沒能返回文件指針,需要繼續修改代碼段:用socket_read( 替換掉 fread(??? ,用socket_write( 替換掉fwrite( ,用socket_close( 替換掉fclose( .
??
?? 三、
??
?? 使用CMS類網站程序的用戶,如織夢CMS,phpwind,帝國,等程序,請將您的程序升級到最新的版本并及時更新安全漏洞補丁.?
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/6029.html