❶ 如何開啟fsockopen函數
第一步
找到php.ini文件,用記事本打開,查找 allow_url_fopen = 看看後面是 off 還On , 如果是On,直接看下一步,如果是off 那就修改成On,需要注意完整的是allow_url_fopen = On等號的左右有空格,為了避免代碼修改出錯,請直接復制下面的替換原來的即可。
第二步
繼續在php.ini文件中,查找,查找extension=php_openssl.dll 找到以後大家注意,extension=php_openssl.dll這段代碼前面會有個 ; 號,只要把這個 ; 號刪除,然後保存。第三步
重啟IIS,打開IIS信息服務管理器,右鍵點擊XX(本地計算機),選擇 所有服務 點擊 重新啟動IIS ,等待重新啟動完成,(XX代表你的伺服器管理用戶名),重啟動完成後,fsockopen函數 應該成功開啟了,如果你正在安裝網站程序,需要刷新你的網站程序,然後即可看到,由原來的伺服器不支持fsockopen函數,變成 支持fsockopen函數。
❷ 請問php fsockopen 我已經在php.ini配置文件裡面開啟了,為什麼還是調用不成功。在內網,沒有防火牆。
關閉安全模式
❸ 如何使用fsockopen函數實現非同步執行PHP
Web伺服器執行一個PHP腳本,有時耗時很長才能返回執行結果,後面的腳本需要等待很長一段時間才能繼續執行。如果想實現只簡單觸發耗時腳本的執行而不等待執行結果就直接執行下一步操作,可以通過fscokopen函數來實現。
PHP支持socket編程,fscokopen函數返回一個到遠程主機連接的句柄,可以像使用fopen返回的句柄一樣,對它進行fwrite、fgets、fread等操作。使用fsockopen連接到本地伺服器,觸發腳本執行,然後立即返回,不等待腳本執行完成,即可實現非同步執行PHP的效果。
示例代碼如下:
functiontriggerRequest($url,$post_data=array(),$cookie=array()){
$method="GET";//通過POST或者GET傳遞一些參數給要觸發的腳本
$url_array=parse_url($url);//獲取URL信息
$port=isset($url_array['port'])?$url_array['port']:80;
$fp=fsockopen($url_array['host'],$port,$errno,$errstr,30);
if(!$fp){
returnFALSE;
}
$getPath=$url_array['path']."?".$url_array['query'];
if(!empty($post_data)){
$method="POST";
}
$header=$method."".$getPath;
$header.="HTTP/1.1\r\n";
$header.="Host:".$url_array['host']."\r\n";//HTTP1.1Host域不能省略
/*以下頭信息域可以省略
$header.="User-Agent:Mozilla/5.0(Windows;U;
WindowsNT5.1;en-US;rv:1.8.1.13)Gecko/20080311Firefox/2.0.0.13\r\n";
$header.="Accept:text/xml,application/xml,application/
xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,q=0.5\r\n";
$header.="Accept-Language:en-us,en;q=0.5";
$header.="Accept-Encoding:gzip,deflate\r\n";
*/
$header.="Connection:Close\r\n";
if(!empty($cookie)){
$_cookie=strval(NULL);
foreach($cookieas$k=>$v){
$_cookie.=$k."=".$v.";";
}
$cookie_str="Cookie:".base64_encode($_cookie)."\r\n";//傳遞Cookie
$header.=$cookie_str;
}
if(!empty($post_data)){
$_post=strval(NULL);
foreach($post_dataas$k=>$v){
$_post.=$k."=".$v."&";
}
$post_str="Content-Type:application/x-www-form-urlencoded\r\n";
$post_str.="Content-Length:".strlen($_post)."\r\n";//POST數據的長度
$post_str.=$_post."\r\n\r\n";//傳遞POST數據
$header.=$post_str;
}
fwrite($fp,$header);
//echofread($fp,1024);//伺服器返回
fclose($fp);
returntrue;
}
這樣就可以通過fsockopen()函數來觸發一個PHP腳本的執行,然後函數就會返回。接著執行下一步操作了。
現在存在一個問題:當客戶端斷開連接後,也就是triggerRequest發送請求後,立即關閉了連接,那麼可能會引起伺服器端正在執行的腳本退出。
在PHP內部,系統維護著連接狀態,其狀態有三種可能的情況:
*0–NORMAL(正常)
*1–ABORTED(異常退出)
*2–TIMEOUT(超時)
當PHP腳本正常地運行NORMAL狀態時,連接為有效。當客戶端中斷連接時,ABORTED狀態的標記將會被打開。遠程客戶端連接的中斷通常是由用戶點擊STOP按鈕導致的。當連接時間超過PHP的時限(參閱set_time_limit()函數)時,TIMEOUT狀態的標記將被打開。
可以決定腳本是否需要在客戶端中斷連接時退出。有時候讓腳本完整地運行會帶來很多方便,即使沒有遠程瀏覽器接受腳本的輸出。默認的情況是當遠程客戶端連接中斷時腳本將會退出。該處理過程可由php.ini的ignore_user_abort或由Apache.conf設置中對應的"php_valueignore_user_abort"以及ignore_user_abort()函數來控制。如果沒有告訴PHP忽略用戶的中斷,腳本將會被中斷,除非通過register_shutdown_function()設置了關閉觸發函數。通過該關閉觸發函數,當遠程用戶點擊STOP按鈕後,腳本再次嘗試輸出數據時,PHP將會檢測到連接已被中斷,並調用關閉觸發函數。
腳本也有可能被內置的腳本計時器中斷。默認的超時限制為30秒。這個值可以通過設置php.ini的max_execution_time或Apache.conf設置中對應的"php_valuemax_execution_time"參數或者set_time_limit()函數來更改。當計數器超時的時候,腳本將會類似於以上連接中斷的情況退出,先前被注冊過的關閉觸發函數也將在這時被執行。在該關閉觸發函數中,可以通過調用connection_status()函數來檢查超時是否導致關閉觸發函數被調用。如果超時導致了關閉觸發函數的調用,該函數將返回2。
需要注意的一點是ABORTED和TIMEOUT狀態可以同時有效。這在告訴PHP忽略用戶的退出操作時是可能的。PHP將仍然注意用戶已經中斷了連接但腳本仍然在運行的情況。如果到了運行的時間限制,腳本將被退出,設置過的關閉觸發函數也將被執行。在這時會發現函數connection_status()返回3。
所以還在要觸發的腳本中指明:
ignore_user_abort(TRUE);//如果客戶端斷開連接,不會引起腳本abort
set_time_limit(0);//取消腳本執行延時上限
或使用:
register_shutdown_function(callbackfuction[,parameters]);//注冊腳本退出時執行的函數
❹ PHP如何用fsockopen 連接https伺服器
原理上使用fsockopen連接https和連接http是一樣的
但是fsockopen向一個地址發送請求時,只能自己手動拼裝頭信息,下面是我寫的一個函數,可直接調用,功能是向一個地址發起post請求
functionrequest($url,$params){
$URL=parse_url($url);
if(!isset($URL['port'])){
$URL['port']=80;
}
$request='POST'.$URL['path']."HTTP/1.1 Host:".$URL['host']." Content-type:application/x-www-form-urlencoded Content-length:".strlen(trim($params))." Connection:close ".trim($params)." ";
try{
$fp=fsockopen($URL['host'],$URL['port']);
fwrite($fp,$request);
$res=fread($fp,1024);
}catch(Exception$e){
fclose($fp);
returnfalse;
}
fclose($fp);
return$res;
}
//調用
$url='https://地址';
$result=request($url,'');
//若伺服器有反饋,則列印出來
echo$result;
❺ php 中 fsockopen() 函數是什麼意思 怎麼用
目前這個函數提供二個 Socket 資料流界面,分別為 Internet 用的 AF_INET 及 Unix 用的 AF_UNIX。當在 Internet 情形下使用時,參數 hostname 及 port 分別代表網址及埠號。在 UNIX 情形可做 IPC,hostname 參數表示到 socket 的路徑,port 配置為 0。可省略的 timeout 選項表示多久沒有連上就中斷。在使用本函數之後會返迴文件指針,供文件函數使用,包括 fgets()、fgetss()、fputs()、fclose() 與 feof()。參數 errno 及 errstr 也是可省略的,主要當做錯誤處理使用。使用本函數,會使用擱置模式 (blocking mode) 處理,可用 set_socket_blocking() 轉換成無擱置模式。 給你個例子 模擬成 HTTP 連接 <?php $fp = fsockopen("php.wilson.gs", 80, &$errno, &$errstr, 10); if(!$fp) { echo "$errstr ($errno)<br>\n"; } else { fputs($fp,"GET / HTTP/1.0\nHost: php.wilson.gs\n\n"); while(!feof($fp)) { echo fgets($fp,128); } fclose($fp); } ?>
滿意請採納
❻ fsockopen該函數需要 php.ini 中 allow_url_fopen 選項開啟。
修改PHP的配置文件,找到php.ini變更內容:
php.ini 文件里
"allow_url_fopen = On"
為了防止WEB變種攻擊LINUX虛擬主機PHP 禁用allow_url_fopen功能。引用allow_url_fopen功能在客戶站點里運行惡意程序。
❼ php開啟fsockopen函數
1.方法一:
第一步:
php.ini文件中查找
allow_url_fopen = On
使其值為On
第二步:
php.ini文件中查找
extension=php_openssl.dll
如果前面有分號,去掉分號
第三步:
重啟web伺服器,apache或IIS
2.還有一種情況,也就是方法二:
1. vi php.ini
找到 allow_url_fopen 這個參數設置成 On,即
allow_url_fopen = On
2. 讓你的php支持 opensll擴展。
默認,是沒有openssl擴展的,只能重新編譯安裝。
yum install openssl openssl-devel
cd /usr/local/src/php-5.2.14/ext/openssl
/usr/local/php/bin/phpize
./configure –with-openssl –with-php-config=/usr/local/bin/php-config
make && make install
看提示,把編譯成的openssl.so 拷貝到你在php.ini 中指定的 extension_dir 下
3. vi php.ini
加入
extension=openssl.so
4. 重啟web server
❽ 如何開啟PHP日誌功能
開啟步驟如下:
1. 打開php.ini文件。
以ubuntu為例,這個文件在: /etc/php5/apache2 目錄下為例。
2. 搜索並修改下行,把Off值改成On
display_errors = Off
3. 搜索下行
error_reporting = E_ALL & ~E_NOTICE
或者搜索:
error_reporting = E_ALL & ~E_DEPRECATED
修改為
error_reporting = E_ALL | E_STRICT
4. 修改Apache的 httpd.conf,
以Ubuntu 為例, 這個文件在:/etc/apache2/ 目錄下,這是一個空白文件。
添加以下兩行:
php_flag display_errors on
php_value error_reporting 2039
5. 重啟Apache,就OK了。
重啟命令: :sudo /etc/init.d/apache2 restart.
❾ php 如何開啟fsockopen
php.ini文件中查找
allow_url_fopen = On
使其值為On
然後查找
extension=php_openssl.dll
如果前面有分號,去掉分號
再 重啟伺服器即可