① php中fsockopen函數參數問題
你說的那個是HTTP請求的一部分,你用fsockopen只能打開socket連接,還需要發送HTTP請求,類似GET /test這種
PHP官方手冊上有例子,自己看看。
② PHP fsockopen 函數執行失敗
當指定數字的 IPv6 地址(例如 fe80::1)時必須將 IP 地址放在方括弧內。例如 tcp://[fe80::1]:80。 $fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
滿意請採納
③ 如何使用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() 函數是什麼意思 怎麼用
目前這個函數提供二個 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); } ?>
滿意請採納
⑤ php 如何編程 得知fsockopen函數是否被禁用
利用函數function_exists();
可以查看是否存在某一個函數,
bool function_exists ( string $function_name
);
其得出的結果是BOOL值,
如果為1或者是TRUE,代表開啟了;
如果為0或者FALSE,代表關閉了。
⑥ php fsockopen()屬於哪個函數庫定義的
應該是屬於:網路函數庫
說明:
fsockopen創始一個Internet或是Unix網域中的資料流連結(AF_INET,使用 TCP 或
UDP)。Internet網域,它將會開啟一個TCP
socket連結到參數hostname,埠號為參數port,參數hostname可以是網域名稱或是IP位址。UDP連結,你需要明確的指出協定 :
udp://hostname。Unix網域,參數hostname將會使用連結到socket的路徑,參數port必須設為0。非必需選項timeout可用來設定停止連結系統呼叫的秒數。
fsockopen( )傳回一個文件指標,這可以和其它的函數一起使用,例如 : fgets( )、fgetss( )、fputs( )、fclose( )、feof( )。
如果呼叫失敗,它將會傳回false並且如果有給予參數errno和errstr,它們將會指出發生在system-level connect( ) 呼叫的錯誤。如果傳回的errno為0而且此函數傳回false,表示錯誤發生在connect(
)呼叫之前,注意 : 參數errno和errstr必須依照關系傳遞。
⑦ 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
⑧ 問Fsockopen不起作用啊,怎麼辦
美國主機lunarpages優惠答:php的fsockopen函數用來創建一個socket連接。但因為HostMonster在共享IP的主機里使用了防火牆(方便跟蹤用戶的流量),所以,當fsockopen用來連接有別於80埠的URL地址時,是不奏效的。如果您需要連接其他埠,需要向HostMonster另外訂購獨立IP的費用。您可以提供在檔信用卡的後四位或直接打電話來申請。
⑨ 萬網m3空間我裝wordpress程序,PHP函數fsockopen可以關閉嗎
既然樓主只是使用wordpress建立普通的博客站點,個人意見,這個函數關閉比較好,因為你製作的wordpress基本上是用不到這個函數的。而且此函數作為PHP製作人員,一般情況下,我們還是不使用的,倒不是說此函數沒用。
這個函數具體的功能如下(是我復制網路的)
【目前這個函數提供二個 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() 轉換成無擱置模式。】