虛擬主機(jī)php程序fsockopen函數(shù)被禁用 |
發(fā)布時(shí)間: 2014/8/15 10:42:47 |
在PHP程序中fsockopen是一個(gè)功能比較強(qiáng)大的函數(shù),大多數(shù)虛擬主機(jī)是禁用這個(gè)方法的。因?yàn)榫W(wǎng)站太多垃圾評(píng)論,打開了Akismet,當(dāng)時(shí)開啟Akismet后發(fā)現(xiàn)效果還行,也沒太仔細(xì)看Akismet的相關(guān)設(shè)置,后來點(diǎn)進(jìn)去看一下發(fā)現(xiàn)Akismet的服務(wù)器連接狀態(tài)顯示網(wǎng)絡(luò)功能被禁用。 您的主機(jī)似乎禁用了PHP的fsockopen或gethostbynamel函數(shù)。在此問題修復(fù)之前,Akismet無法工作。請(qǐng)聯(lián)系您的主機(jī)服務(wù)管理員或防火墻管理員,并向他們提供Akismet的運(yùn)行環(huán)境要求。 通過檢查在空間上運(yùn)行phpinfo()方法,發(fā)現(xiàn)虛擬主機(jī)確實(shí)禁用了fsockopen方法,咋辦呢。 檢查虛擬主機(jī)根目錄(不是wwwroot目錄)下的php.ini文件,打開,查找allow_url_fopen allow_url_fopen = On 這是正確的,此行配置是指允許訪問網(wǎng)絡(luò)文件,如果是Off,請(qǐng)改為On 接著找disable_functions,找到 disable_functions = fsockopen 好,找到問題,這行配置禁用了fsockopen方法,刪掉或者注釋掉此行代碼。(注釋方法,行首加“;”號(hào)) 修改配置后,重新檢查Akismet配置,網(wǎng)絡(luò)接連正常。
如果無法修改php.ini文件,或者修改無效,可參考以下方法。 一、如果只禁用了fsockopen,而沒有禁用pfsockopen方法可將所有用到fsockopen方法的地方修改為使用pfsockopen,如果是插件調(diào)用,那只能通過修改插件的代碼來搞定了。二、如果服務(wù)器同時(shí)還禁用了pfsockopen,那還可以用stream_socket_client方法代替,不過stream_socket_client和fsockopen的調(diào)用參數(shù)不同。 具體操作:搜索程序中的字符串fsockopen()替換為stream_socket_client(),然后,將原fsockopen()函數(shù)中的端口參數(shù)“80”刪掉,并加到$host。示例如下 修改前: $fp = fsockopen($host, 80, $errno, $errstr, 30); 修改后 $fp = stream_socket_client($host."80", $errno, $errstr, 30); 三,如果你十分十分的不幸,fsockopen和pfsockopen方法都被禁用,并且你的php版本低于5.0時(shí),沒有stream_socket_client方法,那你只有自己手動(dòng)寫一個(gè)了。 參考代碼: 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函數(shù)的代碼段,將上面代碼加至其上端,搜索該代碼段中的字符串fsockopen()替換為b_fsockopen()。 2、因?yàn)閒sockopen函數(shù)返回文件指針?biāo)钥梢员晃募瘮?shù)操作,但是這個(gè)b_fsockopen()函數(shù)沒能返回文件指針,需要繼續(xù)修改代碼段:用socket_read()替換掉fread(),用socket_write(替換掉fwrite(),用socket_close()替換掉fclose()。 本文出自:億恩科技【mszdt.com】 服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |